GitLab CICD自动更新k8s中容器版本

前提

之前使用Gitlab和Runner的版本是12.*,现在已经到了16.*,安装和配置跟之前相比几乎没有变化,所以按之前的文档操作下来,一路比较顺利。在更新k8s集群容器版本的时候出现问题了,原来Auto Deploy方式在14.*版本被弃用,较新的方案是安装k8s代理,方案有2种:

  1. Helm:挺麻烦的,开发环境不必这么麻烦和复杂
  2. KPT:更麻烦,使问题更复杂化 确实不想再去搞Helm或KPT了,不知道是因为年龄大了,没有精力了;还是潜意识里业务进度大于技术研究已经慢慢渗入思想了。

已经几乎要放弃了,在解决构建容器时间不正确的时候,却发现了新大陆。 方案是:将安装有kubectl机器的~/.kube/config文件映射进Gitlab-Runner,给Runner Helper,然后在.gitlab-ci.yml文件中添加before_script,在kubectl容器执行更新Pod版本之前加载.kube/config文件,获得k8s权限。

操作配置

gitlab-runner compose文件重点部分

1
2
volumes
  - /home/lssy/.kube:/root/.kube:ro

gitlab-runner/config/config.toml 配置文件重点部分

1
2
3
[[runners]]
  [runners.docker]
    volumes = ["/cache", "/home/lssy/.kube/config:/build/kubeconfig/config", "/etc/localtime:/etc/localtime:ro", "/var/run/docker.sock:/var/run/docker.sock", "/home/lssy/.docker/config.json:/root/.docker/config.json"]

.gitlab-ci.yml 重点部分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
k8s-deploy-dev:
  stage: deploy
  image:
    name: bitnami/kubectl:1.28.2
    entrypoint: [ "" ]
  before_script:
    - cp -fr /build/kubeconfig/config /.kube/config
  script:
    -  kubectl rollout restart -n www deployment/www
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'

nexus、gitlab、gitlab-runner基于docker compose安装,因为是本地环境,nexus中docker registry没有配置https,所以需要修改配置文件:

  1. Docker修改方案:/etc/docker/daemon.json
1
"insecure-registries": ["<ip>:<port>"]
1
2
# 重启生效
sudo systemctl restart docker
  1. Containerd修改方案:/etc/containerd/config.toml
1
2
3
4
5
6
7
[plugins."io.containerd.grpc.v1.cri".registry]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<IP>:<PORT>"]
      endpoint = ["http://<IP>:<PORT>"]
  [plugins."io.containerd.grpc.v1.cri".registry.configs]
    [plugins."io.containerd.grpc.v1.cri".registry.configs."<IP>:<PORT>".tls]
      insecure_skip_verify = true
1
2
# 重启生效
sudo systemctl restart containerd

参考: