· cloud
k8s+gitlab实现cicd
前言
目前 Gitlab11 已经支持了 Kubernetes Runner, 任务可以跑在 Pod 中。本文介绍如何通过 CICD 接入 Kubernetes,开始前需要以下必备条件:
- Kubernetes 集群
 - 配置 Kubernetes Runner, 网上有很多教程,若是生产环境或是多租户 k8s 集群,建议通过 yaml 手动配置;默认通过 helm 安装权限比较大,而且配置不灵活
 
CI 过程
通常编译镜像有三种方式:
- docker in docker:与物理方式类似,需要权限多,性能较差
 - kaniko:镜像编译工具,性能好
 
我们使用 kaniko 编译镜像,push 到镜像仓库,过程如下:
- 配置变量 配置镜像相关变量,仓库的账户密码,推送的镜像名称
CI_REGISTRY_IMAGE等
 - gitlab-ci 配置如下
 
build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: ['']
  script:
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
  after_script:
    - echo "build completed"
  only:
    - tags # 打tag才会执行,测试可去掉
CD 过程
CD 即需要将生成的镜像更新到 Kubernetes 集群中,有如下几种方式:
- k8s restful api:需要对 api 较了解,更新过程需要调用
PATH方法,不推荐 - kubectl: 常规方式
 - helm: 如有可用的 helm 仓库,也可使用 helm 进行更新
 
我们以 kubectl 为例,CD 配置如下:
- 配置变量 配置必须的集群地址,token,需要更新服务的 namespace, container 等
 - CD 配置 配置与物理环境类似,首先配置 kubectl token、集群等,最后调用
set image更新服务 
deploy:
  image:
    name: kubectl:1.17
    entrypoint: ['']
  before_script:
  script:
    - IMAGE=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - kubectl config set-credentials $CD_USER --token $CD_APP_AK
    - kubectl config set-cluster $CD_CLUSTER --server https://$CD_SERVER
    - kubectl config set-context $CD_USER@$CD_CLUSTER/$CD_NAMESPACE --user $CD_USER --cluster $CD_CLUSTER --namespace $CD_NAMESPACE
    - kubectl config use-context $CD_USER@$CD_CLUSTER/$CD_NAMESPACE
    - kubectl set image -n $CD_NAMESPACE $CD_APP_TYPE/$CD_APP_NAME $CD_CONTAINER=$IMAGE
  only:
    - tags
- 运行结果
 
$ kubectl set image -n $CD_NAMESPACE $CD_APP_TYPE/$CD_APP_NAME $CD_CONTAINER=$IMAGE
deployment.extensions/helloworld image updated
Job succeeded
备注
本文所列举的 CICD 过程较简单,可以使用 CICD 完成服务的多集群部署,更新结果检查等功能。