首次搭建单节点Minikube CI/CD,如何用GitLab流水线实现多容器共享PV/PVC?
我来帮你一步步搞定这个需求——用GitLab流水线部署一个多容器共享已有PVC的Pod,还适配多仓库架构的场景,具体如下:
首先你需要定义一个包含多个容器的Pod YAML(比如命名为multi-container-pod.yaml),核心是让所有容器挂载同一个PVC对应的卷:
apiVersion: v1 kind: Pod metadata: name: shared-storage-pod namespace: gitlab-managed-apps # 注意和你的PVC所在namespace一致 spec: containers: - name: first-container image: nginx:alpine volumeMounts: - name: shared-data mountPath: /usr/share/nginx/html # 第一个容器的挂载路径 - name: second-container image: busybox:latest command: ["sleep", "3600"] volumeMounts: - name: shared-data mountPath: /data # 第二个容器的挂载路径,和第一个可以不同 volumes: - name: shared-data persistentVolumeClaim: claimName: data-volume-claim # 引用你已有的PVC
这里要注意:
- 确保Pod的
namespace和你的PVC(data-volume-claim)所在的命名空间一致(从你的PV信息看是gitlab-managed-apps) - 每个容器的
mountPath可以自定义,但都要关联同一个shared-data卷
接下来在你的项目仓库里创建.gitlab-ci.yml,实现自动部署这个Pod到minikube集群:
首先,你需要确保GitLab Runner有权限访问你的K8s集群:
- 如果用的是K8s类型的Runner,它默认会用集群内的service account,你可以给这个service account添加
edit权限(或者更精细的权限)到gitlab-managed-apps命名空间:
kubectl create rolebinding runner-edit --clusterrole=edit --serviceaccount=gitlab-runner:gitlab-runner --namespace=gitlab-managed-apps
然后编写.gitlab-ci.yml:
stages: - deploy deploy-pod: stage: deploy image: bitnami/kubectl:latest # 用带kubectl的镜像 script: # 如果是集群内部的Runner,下面的上下文配置可以直接跳过 - kubectl config set-cluster minikube --server=https://<你的minikube API地址> --certificate-authority=/path/to/ca.crt - kubectl config set-credentials gitlab-runner --token=<你的service account token> - kubectl config set-context minikube --cluster=minikube --user=gitlab-runner --namespace=gitlab-managed-apps - kubectl config use-context minikube - kubectl apply -f multi-container-pod.yaml only: - main # 按需设置触发分支
小提示:如果你的GitLab Runner是部署在minikube集群内部的,那不需要手动配置kubectl上下文,直接就能访问集群,脚本里可以简化成只保留kubectl apply -f multi-container-pod.yaml这一行。
如果你的项目采用多仓库(比如Pod配置仓库和业务代码仓库分离),可以用以下两种方式处理:
方式一:用GitLab子模块
把存储Pod配置的仓库作为业务仓库的子模块,这样流水线可以拉取到配置文件:
- 在业务仓库执行:
git submodule add <Pod配置仓库地址> k8s-configs - 然后在
.gitlab-ci.yml的脚本里先初始化子模块:
script: - git submodule init - git submodule update - kubectl apply -f k8s-configs/multi-container-pod.yaml
方式二:跨仓库触发流水线
如果希望修改Pod配置时自动触发部署,或者业务代码变更时触发部署,可以用GitLab的跨项目流水线触发:
- 在Pod配置仓库的
.gitlab-ci.yml里添加触发业务仓库部署的步骤,或者反过来 - 比如在业务仓库的流水线里,通过
trigger关键字调用配置仓库的部署任务:
deploy-from-config: stage: deploy trigger: project: <你的Pod配置仓库路径> branch: main
最后验证一下:流水线执行成功后,你可以通过kubectl exec -it shared-storage-pod -c first-container -- ls /usr/share/nginx/html和kubectl exec -it shared-storage-pod -c second-container -- ls /data来确认两个容器能访问同一个存储卷的内容。
内容的提问来源于stack exchange,提问作者fparaggio

