热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

s11Docker+DevOps实战--过程和工具

开发人员本地提交代码,本地使用容器模拟生产环境测试,测试通过提交到gitmaster分支,就会触发pipeline执行集成构建。集成工具:gitlab-vi,travis,或Jenki

   开发人员本地提交代码,本地使用容器模拟生产环境测试,测试通过提交到git master 分支,就会触发pipeline执行集成构建。集成工具: gitlab-vi,travis,或Jenkins。自动构建docker镜像并push到仓库,利用docker cloud,k8s等持续部署到web服务器。然后配置发布服务器从仓库拉取镜像,删除旧的版本,重新run新的版本。就完成了一次自动集成部署。

搭建GitLab CI服务器和Pipeline

  不同的项目可能需要不同的测试环境,如果直接在CI服务器上面部署测试,多个项目可能会造成紊乱错误。

利用docker 容器,将项目build 成docker 容器,再进行测试,测试成功再push到docker registry 服务器。即使在一个CI服务器,也可以部署多个测试环境,以供使用。大大精简测试和部署的流程。

# 安装 gitlab ci runner

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh |sudo bash
 sudo yum install gitlab-ci-multi-runner -y

sudo gitlab-ci-multi-runner status

sudo usermod -aG docker gitlab-runner
 sudo service docker restart

sudo gitlab-ci-multi-runner restart

# 本地gitlab地址
http://gitlab.example.com/
安装 gitlab ci runner
# 注册runner 
 sudo gitlab-ci-multi-runner register
gitlab-ci 集成服务器注册runner(即不同的集成环境供gitlab调用)

token 在项目的CI选项里面,可以找到
 一般不要把runner 绑定到一个项目,这样其他项目也可以调用。(除特殊项目需绑定以保护)

    [root@jenkins vagrant]# sudo gitlab-ci-multi-runner register
     Running in system-mode.

    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
     http://gitlab.example.com
     Please enter the gitlab-ci token for this runner:
     gWCZZjwskFtS5n4XT6kV
     Please enter the gitlab-ci description for this runner:
     [jenkins]: gitlab-ci
     Please enter the gitlab-ci tags for this runner (comma separated):
     python3.4
     Whether to run untagged builds [true/false]:
     [false]:
     Whether to lock Runner to current project [true/false]:
     [false]:
     Registering runner... succeeded                     runner=gWCZZjws
     Please enter the executor: docker, shell, ssh, kubernetes, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine:
     docker
     Please enter the default Docker image (e.g. ruby:2.1):
     python:3.4
     Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
注册runner
查看
    [root@jenkins vagrant]# sudo gitlab-ci-multi-runner list
     Listing configured runners                          COnfigFile=/etc/gitlab-runner/config.toml
     jenkins                                             Executor=shell Token=d790b6db10f7f7d3b8547519818948 URL=http://10.0.0.190/
     gitlab-ci                                           Executor=shell Token=ad11a86454c6552424fbf0d6c8b029 URL=http://gitlab.example.com
     gitlab-ci                                           Executor=docker Token=0304db778d4e040d25234594dbe363 URL=http://gitlab.example.com
     gitlab-ci                                           Executor=docker Token=b57303fbaf1623a5d8c42723606aad URL=http://gitlab.example.com
     [root@jenkins vagrant]# sudo gitlab-ci-multi-runner verify
     Running in system-mode.
     Verifying runner... is alive                        runner=ad11a864
     Verifying runner... is alive                        runner=0304db77
     Verifying runner... is alive                        runner=b57303fb
查看

   projects 的导入,可以通过github,url等导入到gitlab

在项目根目录下创建 .gitlab-ci.yml  并配置。 Python 的 tox 测试

 .gitlab-ci.yml

stages:
  - style
  - test
  - deploy
  - release

pep8:
  stage: style
  script:
    - pip install tox
    - tox -e pep8
  tags:
    - python2.7
  except:
    - tags

unittest-py27:
  stage: test
  script:
    - pip install tox
    - tox -e py27
  tags:
    - python2.7
  except:
    - tags

unittest-py34:
  stage: test
  script:
    - pip install tox
    - tox -e py34
  tags:
    - python3.4
  except:
    - tags

docker-deploy:
  stage: deploy
  script:
    - docker build -t flask-demo .
    - if [ $(docker ps -aq --filter name=web)];then docker rm -f web;fi
    - docker run -d -p 5000:5000 --name web flask-demo
  tags:
    - demo
  only:
    - master

docker-image-release:
  stage: release
  script:
    - docker build -t registry.example.com:5000/flask-demo:$CI_COMMIT_TAG .
    - docker push registry.example.com:5000/flask-demo:$CI_COMMIT_TAG
  tags:
    - demo
  only:
    - tags


.gitlab-ci.yml
项目根目录下的集成文件    .gitlab-ci.yml     配置集成和部署的步骤 (pipeline)


    tags:            # 执行环境
      - runner

    except:          # 排除,tags不触发
      - tags

    only:          # 只有master更改才触发
      - master

    stages:        # 流程,有哪些步骤
      - style
      - test
      - dploy
      - release

    job name:     #job名称 ,属于某一个流程   
.gitlab-ci.yml配置语法 具体看帮助信息

    gitlab 可以 实现代码仓库托管,直接拉取仓库集成测试。这块比较好,而且天生支持分布式。

CI的部署,但是runner公有的有限,还是得要有自己的测试runner,可以在本地自己搭建linux gitlab runner ,配置好环境,并注册,供gitlab CI 测试调度。然后发布到正式服务器。
     gitlab-ci 本身就支持分布式,可以再多台机器上执行runner 供gitlab 调用测试

要注意保护 master 分支 ,不能被随意修改,
     在 CI 设置里有 master protect 选项 和 parallel 检查设置
     只有push-->merge request-->pipline 测试通过 --> commit
    

 

.travis.yml # travis集成环境的环境配置文件 https://travis-ci.org/ 一个CI网站 ,开源项目免费,私有项目要钱。

language: python
env:
  - TOXENV=py27
  - TOXENV=py34
  - TOXENV=pep8
  - TOXENV=docs

install:
  - pip install tox
  - pip install coveralls
script:
  - tox

after_success:
  coveralls --verbose
.travis.yml

 

  提交触发后 pipeline 的执行流程,可以点不同job 进行查看执行情况

6bac82cb-382c-496d-9a69-934598deb759

注意要给项目分配 runner

image

 

  当runner 环境为shell等非docker 时,要拉取自己搭建的gitlab 仓库,只需要配置hosts文件即可。

  可当用runner 是 docker 时,每次拉取代码时,docker并不知道宿主机上的host文件,又不可能手动加进去,那样太麻烦。所以会出现无法访问自己的gitlab仓库。

这时候就需要,搭建DNS解析服务器,让docker能够解析到仓库。 

Gitlab CI DNS server

  配置一个DNS服务器,能让其他容器解析到 gitlab.example.com

  首先,在gitlab ci服务器上把 gitlab.example.com 从/etc/hosts里删除

  这时候在gitlab ci服务器上是 ping 不通 gitlab.example.com的。
   找一台新的Linux host,装好Docker,创建一个dnsmasq的容器,并运行。

docker-dns 服务器搭建
    docker-host
     docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq
     docker exec -it dns-server /bin/sh


首先配置上行的真正的dns服务器地址,创建文件:
  vi /etc/resolv.dnsmasq
添加内容:
   nameserver 114.114.114.114
   nameserver 8.8.8.8
# 置本地解析规则,这才是我们的真实目的。新建配置文件
vi /etc/dnsmasqhosts
# 加解析规则,其中192.168.205.160是本地 gitlab 服务器地址
  192.168.205.160 gitlab.example.com
修改 dnsmasq 配置文件,指定使用上述我们自定义的配置文件

vi /etc/dnsmasq.conf 修改下述两个配置
  resolv-file=/etc/resolv.dnsmasq
  addn-hosts=/etc/dnsmasqhosts

回到宿主,重启dns-server容器服务。
  docker restart dns-server
这时候这台docker host就是一个DNS服务器了,假如他的地址是192.168.205.15
dns-server 配置

 

搭建完dns服务器后,要修改为gitlab ci 服务器DNS服务器的ip ---> nameserver 192.168.205.15

[vagrant@ci ~]$ more /etc/resolv.conf
# Generated by NetworkManager
#nameserver 10.0.2.3
nameserver 192.168.205.15
view

这时候 docker 就能访问到gitlab服务器。

docker registry 服务器

  docker hub 上传的镜像,属于公开状态,docker cloud 有要钱,还好可以搭建自己的docker registry服务器。这样push pull就方便多了。

  这里将docker registry 服务器安装在dns同一台机器上。

docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2

  配置 dns-server

执行
docker exec-it dns-server/bin/sh
添加一条新的记录
/ # more /etc/dnsmasqhosts
192.168.205.160 gitlab.example.com
192.168.205.15 reqistry.example.com
view

  docker restart dns-server

ci 服务器 测试push 时 报错
    [root@jenkins vagrant]#  docker push registry.example.com:5000/flask-demo:V10
     The push refers to repository [registry.example.com:5000/flask-demo]
    Get https://registry.example.com:5000/v2/: http: server gave HTTP response to HTTPS client
docker-registry 服务器为http协议
    客户端设置默认是HTTPS 协议取push
     所以要特别更改/etc/docker/daemon.json
     "insecure-registries":["http://registry.example.com:5000"]
[root@jenkins vagrant]# more /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://6qcpzbml.mirror.aliyuncs.com"],
      "insecure-registries":["http://registry.example.com:5000"]
     }



查看push到registry的镜像版本

     http://registry.example.com:5000/v2/flask-demo/tags/list

查看push的镜像 registry
     [root@docker-host ~]# ls /opt/registry/docker/registry/v2/repositories/
     flask-demo

 

在测试通过需要将最新的image push 到仓库

同时 部署容器时,要判断是否有旧的版本容器需要删除,然后再run新版本的容器

image

$CI_CONMMIT_TAG 是gitlab-ci 的环境变量。具体可以查看帮助文件

 

   一有版本发布或是提交时会自动测试,管理员检查合并到master分支后,就会触发pipeline执行集成构建,build的最新镜像会被push 到仓库。

   然后配置发布服务器从仓库拉取镜像,删除旧的版本,重新run新的版本。就完成了一次自动集成部署。


推荐阅读
  • kubelet配置cni插件_Kubernetes新近kubectl及CNI漏洞修复,Rancher 2.2.1发布
    今天,Kubernetes发布了一系列补丁版本,修复新近发现的两个安全漏洞CVE-2019-1002101(kubectlcp命令安全漏洞)和CVE-2 ... [详细]
  • k8shelm官网:https:helm.sh点击charts:https:artifacthub.iopackagessearch?sortrelevance&page11.1h ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • “自主设计与实施的故障注入微服务Sidecar,欢迎大佬批评指正!”
    “故障注入Sidecar“——为您的微服务注入故障以验证集群性能!由于导师和实验室师兄们的科研需要,本人专门以Sidecar的模式设计了一个用于错误注入的微服务模块。该模块可以与任 ... [详细]
  • 本文|层面_Kubernetes概述
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Kubernetes概述相关的知识,希望对你有一定的参考价值。前言本文搜集大量关于Kuber ... [详细]
  • 周末,受微软公司的邀请,参加微软主持的云容器培训会议,为参加培训的学院提供技术辅导,引导学员体验微软云端的DevOps实践。说是辅导,实际上自己也学到了许多的内容,包括K8S集群、负载、Azure中 ... [详细]
  • 快速搭建云原生开发环境(k8s+pv+prometheus+grafana)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https:github.comzq2599blog_demos本篇概览欣宸正在为接下新的Ja ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 背景信息公司目前有40人,研发人员占比60-70% ... [详细]
  • linux运维之K8S(一)
    1.什么是Kubernetes?Kubernetes(通常简称为K8S,即是将8个字母“ubernete”替换成“8”的缩写)是一个以容器为中心的基础架构。可以实现在物理集群或者虚 ... [详细]
  • 实现背景运维开发管理人员,当项目开始进行集群管理,传统的场景下,批量申请机器,但是一些操作虽然可以借助第三方的批量执行任务完成设置免密的工作,但是对于k8s部署,Spar ... [详细]
author-avatar
手机用户2502908237
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有