如何将Gitlab.com项目部署到本地Minikube环境
可行性结论
完全不需要使用GCP提供的公有Kubernetes集群,将GitLab CI构建完成的镜像直接部署到本地Minikube集群是可直接落地的方案,也不需要在Minikube内部署整套GitLab增加额外复杂度,你当前已经完成的流水线环节可以直接复用,仅需补充部署阶段的相关配置即可。
具体实现步骤
- 打通本地GitLab Runner与Minikube的访问链路
你当前已经使用本地GitLab Runner执行制品发布、镜像构建任务,仅需给该Runner配置Minikube的访问凭证即可:将宿主机上的~/.kube/config文件以及配置中引用的Minikube证书文件,挂载到Runner的执行环境中,保证Runner执行kubectl命令时可以正常连通本地Minikube的API接口。如果你的Runner本身直接运行在宿主机而非容器内,只要执行Runner进程的用户可以正常操作Minikube,这一步不需要额外配置。 - 配置Minikube镜像拉取权限
你的镜像目前统一推送到GitLab Container Registry,需要先在Minikube中创建对应镜像仓库的拉取密钥,供部署资源时引用,执行命令如下:
后续在微服务的Deployment配置中,添加kubectl create secret docker-registry gitlab-cr-auth \ --docker-server=registry.gitlab.com \ --docker-username=<你的GitLab用户名> \ --docker-password=<具备read_registry权限的GitLab个人访问令牌> \ --docker-email=<你的GitLab账号绑定邮箱>imagePullSecrets字段引用上面创建的gitlab-cr-auth密钥,Minikube即可正常拉取GitLab仓库中的镜像。 - 补充流水线部署阶段
在项目的.gitlab-ci.yml中新增deploy阶段,放在镜像构建环节之后,配置任务强制调度到你本地的Runner上执行,示例配置片段:stages: - build - test - release - image_build - deploy deploy_minikube: stage: deploy tags: - local-runner # 替换为你本地GitLab Runner的标签,确保任务调度到正确节点 script: # 替换为你仓库中存放K8s部署配置(Deployment/Service/Ingress等)的路径 - kubectl apply -f ./deploy/k8s/ # 等待滚动发布完成,校验部署状态 - kubectl rollout status deployment/<你的微服务Deployment名称> rules: # 按需配置触发规则,比如仅在打版本tag、main分支更新时触发 - if: $CI_COMMIT_TAG - 可选简化配置(跳过镜像公网推拉)
如果不想让Minikube走公网拉取GitLab Container Registry的镜像,可以直接在镜像构建阶段把镜像打到Minikube内置的Docker daemon中,省掉镜像推送、拉取的步骤:在执行docker build命令前先执行eval $(minikube docker-env),将当前执行环境的Docker客户端指向Minikube内部的Docker服务即可。这种方案不需要配置镜像拉取密钥,只需要在Deployment配置中把imagePullPolicy设置为IfNotPresent就能直接使用本地构建的镜像。
常见注意点
- 不要用Docker-in-Docker模式运行部署阶段的任务,如果你的本地GitLab Runner本身是容器化运行的,建议使用宿主机网络模式挂载kubeconfig,否则无法正常访问宿主机上的Minikube服务端口
- GitLab个人访问令牌不要硬编码在流水线配置文件中,统一存放在项目CI/CD的私密变量里,权限仅开通必要的
read_registry即可 - 部署任务执行前要保证本地Minikube处于正常运行状态,否则会出现API连接超时的报错
内容的提问来源于stack exchange,提问作者Gfalco
相关产品推荐
相关产品推荐

