【go云原生】持续集成与持续部署
最近更新:2024-12-29
|
字数总计:2.4k
|
阅读估时:9分钟
|
阅读量: 次
持续集成与持续部署 持续集成和持续部署 三种常见发布策略 蓝绿发布 A/B测试 金丝雀发布 基于GitLab的持续集成 项目准备 安装与配置gitlab与gitlab-runner gitlab gitlab-runner gitlab持续集成配置文件
持续集成与持续部署 持续集成和持续部署
持续集成:将软件研发工作拆解后,拆分成不同的模块或子系统,分配到不同人员或团队进行编码,编码完成后进行过集成构建和测试。从编码到构建再到测试的反复过程。
持续部署:将可交付的产品,快速且安全地交付用户使用的一套方法和系统。它是通过自动化的手段将部署的操作过程进行简化,降低部署的复杂度,使得部署是一个随时可进行的快速活动。
三种常见发布策略
为什么需要发布策略
降低软件部署的风险,控制新版本故障影响范围和时间
获取足够的反馈,及时调整部署策略或发布进度
部署前需要做什么
风险评估,即新版本故障影响范围和时间的评估
根据具体情况选择合适的发布策略
启动部署后,能不能回滚,回滚的代价有多大
数据库对新老版本的兼容性
蓝绿发布
蓝绿发布,将服务集群分为两组或多组。新版本发布时,以组为单位,对服务的新版本进行冗余部署,机器数量与规格与旧版本保持一致。部署完成之后,此时新版本为旧版本的热备,旧版本继续对外提供服务。在新版通过充分测试之后,将流量整体切换到新版本,旧版本从而转变为热备。持续观察上线的新版本的运行情况。待到新版稳定运行一段时间后,即可下线旧版本服务器。如果新版本出现故障,可快速将流浪切回旧版本。待到新版本问题修复之后再部署。
蓝绿部署的特点:
部署结构简单,运维方便
升级与回滚速度快,发布周期短
如果新版本故障,影响范围大
需要准备正常业务使用资源的两倍或以上服务器资源,防止升级期间单组无法承载业务。
A/B测试
A/B测试,顾名思义流量被分为了A、B两组,基于特定的条件将流量分流,常见的做法高阔基于http header和cookie。例如:将User—Agent值为Android的请求路由到新版本,其他请求依旧访问旧版本。再例如:用户登录状态过期的用户,重新登录将被引流访问新版本等。A、B两组流量根据规则访问新、旧两个版本,通过监控平台对两个版本的访问情况进行观察与对比,当新版本整体服务达到预期后,将所有流浪切换到新版本,并在适当的时候下线老版本。A/B测试的回滚操作,只需要修改分流条件即可。
A/B测试部署的特点:
可以对满足特定条件的流量进行分流,访问新版本。新版本故障将影响特定用户群体。相对而言影响范围可控。
由于流量的不确定,需要监控A、B两组流量对新老版本的访问情况。
由于流量的不确定性,需要准备正常服务器资源的两倍资源用于部署。
需要持续监控A、B流量的请求情况,发布周期较长
金丝雀发布
金丝雀发布策略,可以对资源实现最大化利用,新版本故障影响范围最小化。该策略是通过将少量的流量引流到新版本上,因此新版部署之初只需要少量服务器即可。验证新版符合预期之后,通过逐步的增加新版流量比例、减少旧版本流量比例的方式慢慢的将老版本切换到新版本。在流量切换的过程根据流量的比例,调整新老服务器资源的比例,从而达到资源的最大化利用。
金丝雀部署特点:
新版本故障影响范围小,但是流量无差别,可能会影响比较重要的客户
服务器资源利用率高,整个部署过程中不断的根据流量比例来调整服务器资源比例
发布周期长,需要根据情况不断的去调整流量比例,新老版本并行周期长
基于GitLab的持续集成 项目准备 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 docker run -d -p 5000:5000 --name registry --restart=always registry:2 192.168.239.142 myhub.docker.com vim /lib/systemd/system/docker.service ExecStart=/usr/bin/dockered -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry myhub.docker.com:5000 sudo systemctl daemon-reload sudo systemctl restart docker docker pull golang:1.18 docker pull docker:20.10.12 docker pull alpine:latest docker pull ubuntu:latest docker pull gitlab/gitlab-ce:latest docker pull gitlab/gitlab-runner:latest docker tag golang:1.18 myhub.docker.com:5000/golang:1.18 docker tag docker:20.10.12 myhub.docker.com:5000/docker:20.10.12 docker tag alpine:latest myhub.docker.com:5000/alpine:latest docker tag ubuntu:latest myhub.docker.com:5000/ubuntu:latest docker tag gitlab/gitlab-ce:latest myhub.docker.com:5000/gitlab-ce:latest docker tag gitlab/gitlab-runner:latest myhub.docker.com:5000/gitlab-runner:latest docker push myhub.docker.com:5000/golang:1.18 docker push myhub.docker.com:5000/docker:20.10.12 docker push myhub.docker.com:5000/alpine:latest docker push myhub.docker.com:5000/ubuntu:latest docker push myhub.docker.com:5000/gitlab-ce:latest docker push myhub.docker.com:5000/gitlab-runner:latest docker swarm init docker swarm join-token worker docker swarm join-token manager
安装与配置gitlab与gitlab-runner gitlab 1 2 3 4 # 启动一个gitlab docker run -d --hostname 192.168.239.142 -p 80:80 --name myhub.docker.com:5000/gitlab-ce:latest docker ps # health:starting 这个状态可能持续有点久,因为这个镜像很大,内容很多 docker exec -it gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password # 查看初始密码,记得修改一下密码,因为初始密码是有保留期的,保留期一过又没有修改,久只能再初始化一次了
gitlab-runner
1 2 3 4 5 docker inspect gitlab-runner # 查看一下容器详情 # 还需要配置一下gitlab-runner配置,有三个节点启动了gitlab-runner,记得都要改 vim /srv/gitlab-runner/config/config.toml # 改成这样,也就是还有一个位置需要提醒容器内的docker-cli我们由这个挂载,才能正常通信 volumes = [ /var/run/docker.sock:/var/run/docker.sock", "/cache"]
去http://192.168.239.142 的gitlab上去创建一个仓库,就叫cidemo,不要初始化readme1 2 3 4 5 6 7 8 # 将我们的项目代码加入到gitlab库中,我们的代码包含了.gitlab-ci.yml,所以会自动开始CI\CD流程 git remote add origin1 https://192.168.239.142/gitlab-instance-91a981dfadkfj/cidemo.git git remote -v # 查看下远程仓库 git push origin1 master # 推送到gitlab # 到http://192.168.239.142 的CI/CD模块可以看到已经在持续集成了 docker service ls # 看一下给我们构建的服务 curl http://192.168.239.142/ping/v1.0.0 # 已经正常服务了
gitlab持续集成配置文件
https://docs.gitlab.com/ee/ci/yaml/index.html
我们的项目中使用的yml,.gitlab-ci.yml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 stages: - build - test - deploy build-job: stage: build image: myhub.docker.com:5000/docker:20.10.12 tags: - builder before_script: - docker info script: - echo "Compiling the code..." - docker build -t myhub.docker.com:5000/cidemo:latest -f gitlab-ci-dockerfile . - docker push myhub.docker.com:5000/cidemo:latest - echo "Compile complete." unit-test-job: stage: test tags: - tester script: - echo "Running unit tests... This will take about 10 seconds." - echo "Code coverage is 90%." lint-test-job: stage: test tags: - tester script: - echo "Linting code... This will take about 10 seconds." - echo "No lint issues found." deploy-job: variables: HAS_Service: 0 stage: deploy image: myhub.docker.com:5000/docker:20.10.12 tags: - deployer script: - echo "Deploying application..." - HAS_Service=$(docker service ls -f name=mycicd -q | wc -l) - | if [$HAS_Service -eq 0]; then docker service create --name mycicd --publish published=81,target=80 --replicas 20 myhub.docker.com:5000/cidemo:latest else docker service update --image myhub.docker.com:5000/cidemo:latest mycicd fi - echo "Application successfully deployed."
2024-12-29
该篇文章被 Cleofwine
归为分类:
Go云原生