Gitlab-Runner + k8s 实现自动部署
过程说明
- 想要实现自动部署,就要借助工具
kubectl
安装文档 https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux - 将该工具集成到 alpine 镜像里面,当然也可以去 docker 仓库找个现成的
- 准备好 k8s 配置文件,使得
kubectl
工具能连接上 k8s 集群 - 准备部署的命令,这里又分两种情况,一种是删掉 deployment 重新部署 ,另一种是更新 deployment 以重启 pod。第一种需要准备 deployment 的配置文件,而每次更新只是拉取新的镜像而已,因此这里选择第二种。第二种实现的方式是添加一个时间变量,触发 pod 更新,以免系统认为配置文件不变而没有更新 pod
准备kubectl镜像
1.编排Dockerfile
因为Kubelet是作为一个工具,所以我们需要将kubelet
工具安装到alpine
镜像中。
[root@k8s-master ~]# cat Dockerfile
FROM alpine:latest
ARG KUBE_LATEST_VERSION=v1.15.3
# RUN apk add --update ca-certificates
RUN apk add --update -t deps curl
RUN curl -L https://storage.googleapis.com/kubernetes-release/release/${KUBE_LATEST_VERSION}/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl
RUN chmod +x /usr/local/bin/kubectl
RUN apk del --purge deps
RUN rm /var/cache/apk/*
2.构建镜像
通过Docker build构建镜像
[root@k8s-master ~]# docker build --build-arg KUBE_LATEST_VERSION="v1.16.6" -t kubectl:v1.16.6 .
准备k8s配置文件
- 配置文件也可以集成在镜像里面,但是不太灵活,一旦配置有变或者有多个集群,镜像就得修改或者准备多个版本,因此通过 gitlab ci/cd 环境变量传递
- 首先取得配置信息,通过命令
kubectl config view --raw -o yaml
得到配置信息,复制到 gitlab 的 ci/cd 环境变量中 - 这里要注意的是,命令必须带参数
--raw
,为了将 certificate-authority-data 的值输出,否则只能看到 DATA+OMITTED。另外,环境变量必须选择文件类型,否则最后输出格式不对,导致mapping values are not allowed in this context
错误,当然选择-o json
,使用 json 格式,就不用担心格式问题
1.复制config
通过kubectl config
命令查看也可以直接cat ~/.kube/config
查看。
[root@k8s-master ~]# kubectl config view --raw -o yaml
2.在GitLab添加变量
在"Settings"
选择中找到“CI/CD”
,点击“Variables”
。
点击“Add variable”
添加变量。添加K8S_CONFIG
对应的值是config
内容。
变量$KUBE_CONFIG
实际上是个地址,因为 gitlab ci/cd
环境变量类型设置为 file
。
3. Gitlab其他细节
-
还有个就是网络问题。gitlab-runner 创建的这个基于
kubectl:v1.16.6
镜像的容器,是访问不到 k8s 集群的,因为不是在同一个网络,而 k8s 集群又没设置通过外网访问。这里的简单处理方法是在 gitlab-runner 配置中,将网络模式设置为 host,因为这里是 microk8s 创建的单节点集群,总之只要达到使他们处于同一个网络或者可以访问即可。 -
Gitlab Runner每次执行都会拉取docker镜像的问题。找到搭建Gitlab Runner时创建的
config.toml
文件,加上:pull_policy = “if-not-present”
-
配置的两个参数:
-
pull_policy
= “if-not-present” -
network_mode
= “host”
-
[root@k8s-master ~]# cd /srv/gitlab-runner/config/
[root@k8s-master config]# cat config.toml
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "first-register-runner"
url = "http://10.11.121.111/"
token = "-qu5oc3WSLxUbGd7hQri"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
pull_policy = "if-not-present" # 添加镜像策略
network_mode = "host" # 添加网络模式为host
配置CICD流水线
1.添加配置
这里在CICD的流水线中添加如下配置,配置使用镜像kubelet:1.16.6
,将变量输出到config
的文件中,访问K8s集群测试。
stages:
deploy:
image: kubectl:1.16.6
stage: deploy
script:
- mkdir $HOME/.kube && cat $K8S_CONFIG > $HOME/.kube/config
- cd $HOME/.kube && pwd
- kubectl get pods -A
2.测试流水线脚本
提交本次的流水线修改。
查看Jobs的情况,输出的日志可以看出当前配置的连接K8S正常。