前期线上的服务器,都是使用xen。写好配置文件和脚本,用脚本一键创建的虚拟机。创建虚机比使用docker来扩容肯定慢的多,创建完虚机,还要等初始化,各种系统录入信息,主机名解析等等,最快也得5分钟。docker慢的话也就不到一分钟。使用虚拟,在创建完后要安装监控,cmdb,rundeck,主机注册consul,dns解析等等,然后还要和发版系统打通,数据库是否要授权等。docker不用做上述操作,编排器都帮忙做了。

前期持续集成,使用的gitlab+jenkins+rundeck

 

https://www.cnblogs.com/jiangyunmenglong/p/4126868.html

这篇文章写了如何通过配置文件用xen来创建虚拟机。

创建虚拟机:

1

/usr/sbin/xm create centos-root.cfg

xm console  <域ID>
   #从宿主机进入虚拟机的终端,退出时按 ctrl + ]

xm reboot   <域ID>
 #重新启动虚拟机

xm pause <域ID>
#暂停虚拟机

xm resume <域ID>
 #恢复被暂停的虚拟机

xm shutdown <域ID>           
#关闭 domain

后期重构,会使用gitlab, gitlab-ci, k8s, rancher, 来做持续集成,以及扩容缩容。

 gitlab 目前我们线上用的物理机,gitlab存储代码的分区,我们使用的raid来保证高可靠,因为代码很重要,不能丢失,

gitlab-runner是跑在docker里的。

https://www.cnblogs.com/cnundefined/p/7095368.html

 

这篇文章讲gitlab-ci和gitlab-runner讲的很好。

GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins)。而且GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。

那GitLab-Runner又是什么东东呢?与GitLab-CI有什么关系呢?

GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。

GitLab-CI与GitLab-Runner关系示意图

Runner可以分布在不同的主机上,同一个主机上也可以有多个Runner。

Runner类型

GitLab-Runner可以分类两种类型:Shared Runner(共享型)和Specific Runner(指定型)。

Shared Runner:这种Runner(工人)是所有工程都能够用的。只有系统管理员能够创建Shared Runner。

Specific Runner:这种Runner(工人)只能为指定的工程服务。拥有该工程访问权限的人都能够为该工程创建Shared Runner。

https://blog.csdn.net/txb0504/article/details/105300837

这篇文章gitlab-runner的配置讲的比较好。

Shared Runner 需要拿到shared runner 的token,注册到gitlab-ci,shared runner的token在 gitlab的admin区域,只有管理员可见。

Specific Runner的token在项目区域,各个项目可见。

https://blog.csdn.net/yejingtao703/article/details/83065591

讲安装注册gitlab-runner讲的好,

gitlab runner 有多种 安装方式,官方文档上有详细说明https://docs.gitlab.com/runner/install/,我们目前采用的是k8s+helm的部署方式,https://docs.gitlab.com/runner/install/kubernetes.html

 

docker部署方式也很常见,见下面说明:

2.1 准备docker环境
  docker的安装以前博文有介绍过,这里不再详解,重点是获取gitlab/gitlab-runner这个image。

  2.2 启动gitlab-runner
sudo docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
  2.3 注册runner到gitlab
  先在gitlab的CI/CD页面找到url和token,如图

#进入容器
sudo docker exec -it gitlab-runner /bin/bash
#容器中完成注册
gitlab-runner register \
  --non-interactive \
  --url "http://10.100.129.113:8090" \
  --registration-token "S1Erstg39-nh1xQVMtBN" \
  --executor "docker" \
  --docker-image maven:latest \
  --description "193runner " \
  --tag-list "193" \
  --run-untagged \
  --locked="false"
重要参数说明:

    url和token参考上图,在runner需要对接的gitlab中获得;

    executor是runner中pipeline以什么方式运行,这里选择的是docker方式,其实还支持shell等其它方式。

    docker-image是runner中pipelne以哪个image为基础来执行executor。

    tag-list是runner的tag,在gitlab的project中关于ci的配置文件中会引用得到。

Runner注册成功后就会在gitlab的CI/CD页面看到下图中的红框内容:

如果出现灰色的runner说明runner虽然注册上来但是不可用,当gitlab与runner安装在同一台机器时就会出现这种情况,所以请尽量分开。

 

gitlab runner 的 executor是gitlab runner很重要的一个组件,用于执行构建,gitlab runner实现了很多种executor,用于不同场景下的构建。我们使用k8s+helm来安装gitlab runner,默认使用的Kubernetes executor,

The official way of deploying a GitLab Runner instance into your Kubernetes cluster is by using the gitlab-runner Helm chart.

This chart configures the Runner to:

  • Run using the GitLab Runner Kubernetes executor.
  • For each new job it receives from GitLab CI/CD, it will provision a new pod within the specified namespace to run it.

docker executor 也比较常用。

通常我们构建时,需要把打包后的程序集成到docker 镜像中,以便用docker, k8s来管理,CI/CD程序可能运行在容器中,就涉及到在容器中执行docker build, docker run等命令,gitlab 提供了几种方案(涉及到docker in docker dind 方案):

https://docs.gitlab.com/ee/ci/docker/README.html

https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker-executor

Use shell executor

Use Docker-in-Docker workflow with Docker executor

Use Docker socket binding

gitlab-ci 是gitlab中web页面的表现就是CI/CD设置页面里的那些内容。

自动部署涉及了若干个角色,主要介绍如下

  • GitLab-CI 这个是一套配合GitLab使用的持续集成系统,是GitLab自带的,也就是你装GitLab的那台服务器上就带有的。无需多考虑。.gitlab-ci.yml的脚本解析就由它来负责。

  • GitLab-Runner 这个是脚本执行的承载者,.gitlab-ci.yml的script部分的运行就是由runner来负责的。GitLab-CI浏览过项目里的.gitlab-ci.yml文件之后,根据里面的规则,分配到各个Runner来运行相应的脚本script。这些脚本有的是测试项目用的,有的是部署用的。

  • .gitlab-ci.yml 这个是在git项目的根目录下的一个文件,记录了一系列的阶段和执行规则。GitLab-CI在push后会解析它,根据里面的内容调用runner来运行。

三、.gitlab-ci.yml文件又是什么
.gitlab-ci.yml 用来配置GitLab-CI用你的项目做哪些操作,这个文件位于仓库的根目录,如果没有可以自己创建。

当有新内容push到仓库,或者有代码合并后,GitLab-CI会查找是否有 .gitlab-ci.yml文件,如果文件存在,GitLab-CI会依据文件内容通知某个Runner去执行.gitlab-ci.yml中定义的操作。

.gitlab-ci.yml 使用YAML语法, 你需要格外注意缩进格式,要用空格来缩进,不能用tabs来缩进。

.gitlab-ci.yml文件中的几个重要概念
Stages

Stages 表示构建阶段,说白了就是上面提到的流程。默认有3个stages:build, test, deploy。我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:

所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage才会开始
只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
如果任何一个 Stage失败,那么后面的Stages不会执行,该构建任务 (Pipeline) 失败
Jobs

Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:

1、相同 Stage 中的 Jobs 会并行执行

2、相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功

3、如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败

文章后面附注了更多关键字的解释,详细了解关键字以及YAML语法可以自己查。

yaml 文件例子:

# 定义 stages
stages:
  - build
  - test
# 定义 job
job1:
  stage: test
  script:
    - echo "I am job1"
    - echo "I am in test stage"
# 定义 job
job2:
  stage: build
  script:
    - echo "I am job2"
    - echo "I am in build stage"

另一个例子:

stages:
  - deploy
  - notice-success
  - notice-failure


package:Project:
  stage: deploy
  only:
    - /^feature.*$/
    - /^release.*$/
  variables:
    ############必须配置############
    ## 连接API的接口以及NGINX端口地址
    APIPORT: 9992
    NGINXPORT: 803

    #项目名称即git名称
    projectName: $CI_PROJECT_NAME
    #git idea 拉代码的git地址
    gitUrl: $CI_REPOSITORY_URL
    #工程所在目录
    baseDir: '/home/gitlab-runner/${CI_PROJECT_NAME}'
    ############选配############
    #打包所在目录
    buildDir: '/home/gitlab-runner/builds'
    #打包环境
    branch: $CI_COMMIT_REF_NAME
  script:
    - bash /SHELL/installPack $CI_PROJECT_NAME  $CI_REPOSITORY_URL  $CI_COMMIT_REF_NAME $APIPORT  $NGINXPORT
  tags:
    - web

notice_job:Project:
  variables:
    branch: $CI_COMMIT_REF_NAME
    projectName: $CI_PROJECT_NAME
  stage: notice-failure
  only:
    - /^feature.*$/
    - /^release.*$/
  script:
    - if [[ ${branch:0:8} = "feature/" ]];then env="dev" ;elif [[ ${branch:0:8} = "release-" ]];then  env="test";fi
    - python3 /SHELL/buildNotice.py $env $branch 失败  $projectName
  when: on_failure
  tags:
    - web

notice_job:Project:
  variables:
    branch: $CI_COMMIT_REF_NAME
    projectName: $CI_PROJECT_NAME
  stage: notice-success
  only:
    - /^feature.*$/
    - /^release.*$/
  script:
    - if [[ ${branch:0:8} = "feature/" ]];then env="dev" ;elif [[ ${branch:0:8} = "release-" ]];then  env="test";fi
    - python3 /SHELL/buildNotice.py $env $branch  成功  $projectName
  when: on_success
  tags:
    - web

gitlab有很多内置的环境变量,在.gitlab-ci.yaml中可以使用。
https://docs.gitlab.com/ee/ci/variables/predefined_variables.html

比如:CI_REGISTRY_IMAGE 返回镜像仓库的地址

CI_COMMIT_SHA 返回当前build后的hash值

gitlab-ci 可以在gitlab-runner调用的脚本中,git clone 代码到容器中。gitlab 8.9也支持通过变量来指定是否需要clone,或者fetch,或者什么都不做。

You can set the GIT_STRATEGY used for getting recent application code, either globally or per-job in the variables section. If left unspecified, the default from project settings will be used.

There are three possible values: clonefetch, and none.

https://docs.gitlab.com/ee/ci/yaml/README.html#git-strategy

我们目前使用gitlab默认创建项目后,项目的settings-ci/cd里默认就设置了自动抓取,所以在gitlab-ci.yaml中build阶段就没必要显示指定

gitlab-runner 如何发布打包后的模块的k8s管理的容器中?

gitlab runner只是一连串功能给串起来,实现cicd. 中间得功能都得自己实现,包括构建,打包,发版等等。

gitlab-runner只是个程序,用来跑task,当然在目前使用的这个环境里他也跑在了k8s里,镜像就是官方的image(我们用的是helm chart),打包部署这些是单独的镜像,只是要对接k8s的api,其他的都很像.

java应用部署到k8s的原理:

本质上deploy就是把应用程序包推送给k8s,对于k8s来说程序包无非两种形式,一种就是纯粹的Image,另外一种就是Chart

无论哪种程序package最终推给k8s无非是使用kubectl还是使用helm命令进行deploy操作

目前没有使用helm,原理就是前置流程制作好Image,deploy阶段kubectl apply相应的deployment,ingress,service资源

对于当前deploy脚本的实现,基本是以下流程:

  • 配置kubeconfig(对应kubeconfig目录下对应的各个环境的配置信息)

  • 创建名字为$CI_ENVIRONMENT_NAME的命名空间(gitlab推荐每个项目唯一一个,感觉有点太多)

  • 创建gitlab registry拉去镜像的对应的secret(因为gitlab-ci-token是有有效期的,所以每次都需要创建/更新)

  • 创建deployment,ingress,service...

  • kubectl rollout status等待结果

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐