相关文章
GitLab CICD Job调用K8S Api:https://halo.ljdzsk.com/archives/gitlabcicdjob调用k8sapi
K8S部署GitLab Runner 实现持续集成CICD:https://halo.ljdzsk.com/archives/k8s-bu-shu-gitlabrunner-shi-xian-chi-xu-ji-cheng-cicd
操作步骤
测试环境准备
创建测试环境,这里的测试环境namespace是test,启动nginx服务,pvc挂载静态文件目录
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: html-data
namespace: test
spec:
storageClassName: nfs-local-k8s-0
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
name: http
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: html-data
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: test
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: http
type: ClusterIP
正式开始
1. 编写job
将Gitlab的git账户写入 secret 中,分别存入 username、password字段中。
kubectl -n test create secret generic gitlab-user-pass --from-literal=username=name --from-literal=password=pass
编写job部署文件:git_job.yaml
- 将 secret 中的 username、password分别写入环境变量 GIT_USER、GIT_PASS
- 因为此git镜像的 work 目录为 /git,那么我们将nginx 静态文件pvc html-data挂载到 /git/data 文件夹
git clone --depth=1 https://$GIT_USER:$GIT_PASS@gitlab.com/jagger/test data将静态文件clone到 /git/data 文件夹中,共用一个pvc此时nginx下/usr/share/nginx/html目录也会有clone后的静态文件
apiVersion: batch/v1
kind: Job
metadata:
name: git
namespace: ai-nav
spec:
template:
spec:
containers:
- name: git-job
image: alpine/git
env:
- name: GIT_USER
valueFrom:
secretKeyRef:
name: gitlab-user-pass
key: username
- name: GIT_PASS
valueFrom:
secretKeyRef:
name: gitlab-user-pass
key: password
# git镜像的work目录是 /git
command: ["sh","-c","echo '开始'; git clone --depth=1 https://$GIT_USER:$GIT_PASS@gitlab.ljdzsk.com/ai/ai_nav data_new; ls; rm -rf data/* ; mv data_new/* data; echo '结束';"]
volumeMounts:
- name: data
mountPath: /git/data # 挂载到git镜像下的work目录下面的data文件夹中,也就是 /git/data
restartPolicy: Never
volumes:
- name: data
persistentVolumeClaim:
claimName: html-data
backoffLimit: 3
手动验证job,执行完成之后,nginx服务下静态文件有更新这代表job有效。
kubectl apply -f git_job.yaml
2. 配置Gitlab CICD变量
将配置信息写入Gitlab CICD变量中:项目目录 -> 设置 -> CICD -> 变量 -> 添加变量
- 添加 KUBE_CONFIG,变量类型选择
变量,值由echo $(cat ~/.kube/config | base64) | tr -d " "得来,具体参考Gitlab调用K8S - 添加GIT_JOB_YAML,变量类型选择
变量,值由echo $(cat git_job.yaml | base64) | tr -d " "得到,这里面的git_job.yaml就是我们之前测试的job文件
3. 编写 Gitlab 流水线文件
方法一:项目中直接创建文件.gitlab-ci.yml在里面更新内容。
方法二:项目目录 -> CICD -> 编辑器,在这里面更新内容也会自动创建文件.gitlab-ci.yml
GitLab CICD会自动读取.gitlab-ci.yml运行流水线
添加内容,提交更新
stages:
- run_k8s
run_k8s_job:
image: bitnami/kubectl:1.25.3-debian-11-r4
stage: run_k8s
script:
- echo $KUBE_CONFIG |base64 -d > kube-config # 将配置文件转码后写入 kube-config
- echo $GIT_JOB_YAML |base64 -d > git_job.yaml # 将配置文件转码后写入 git_job.yaml
- kubectl --kubeconfig=kube-config delete -f git_job.yaml || true # 先删除遗留job,避免job创建失败,如果job按照git commit作为唯一名称也可以不删历史job
- kubectl --kubeconfig=kube-config apply -f git_job.yaml # 控制k8s执行命令
4. 检查流水线
项目目录 -> CICD -> 流水线 -> 点开第一个就可以看到执行日志(可能等待几秒才执行)。