如何通过K8s GitLab-CI Runner向K8s集群部署应用?
如何通过GitLab-CI Runner将应用部署到K8s集群
我之前在CentOS 7环境下配置过这套部署流程,结合你的环境信息,给你一步步拆解实操步骤:
1. 确保GitLab Runner具备K8s集群访问权限
你的Runner需要能通过kubectl操作K8s集群,这里分两种适配你环境的配置方式:
方式1:在CentOS主机上部署Runner(匹配你的当前环境)
1.1 安装GitLab Runner
在CentOS 7上安装官方稳定版Runner:
# 添加GitLab官方RPM源 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash # 安装Runner(兼容CentOS 7的稳定版本) sudo yum install -y gitlab-runner
1.2 配置K8s访问凭证
Runner需要借助kubeconfig文件访问K8s,操作如下:
- 将K8s集群的
~/.kube/config文件复制到Runner用户目录:
sudo cp ~/.kube/config /home/gitlab-runner/.kube/
- 修正文件权限,确保Runner能读取:
sudo chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.kube sudo chmod 600 /home/gitlab-runner/.kube/config
- 测试权限是否生效:
sudo -u gitlab-runner kubectl get nodes
如果能正常返回K8s节点列表,说明权限配置成功。
方式2:在K8s集群内部署Runner(更推荐的生产方案)
如果你的Runner直接部署在K8s集群中,可通过ServiceAccount自动赋予权限,核心步骤:
- 在GitLab项目的
Settings -> CI/CD -> Runners中获取注册令牌 - 创建K8s的ServiceAccount、Role、RoleBinding,赋予Runner部署应用的权限
- 通过YAML或Helm将Runner部署到K8s并注册到你的GitLab项目
2. 将Runner注册到你的GitLab项目
完成Runner安装后,需要把它绑定到你的目标项目:
- 打开GitLab项目,进入
Settings -> CI/CD -> Runners,展开「Set up a specific Runner manually」,复制注册令牌和GitLab实例URL - 在CentOS主机执行注册命令:
sudo gitlab-runner register
按照提示依次输入:
- GitLab实例URL(比如你的私有GitLab地址或
https://gitlab.com) - 复制的注册令牌
- Runner描述(自定义即可,比如
k8s-deploy-runner) - Runner标签(比如
k8s,deploy,后续CI配置会通过标签指定该Runner执行任务) - 执行器选择
shell(基于CentOS主机环境执行命令,也可选择docker,按需而定)
注册完成后启动Runner:
sudo gitlab-runner start
回到GitLab项目的Runner页面,就能看到该Runner已在线。
3. 编写.gitlab-ci.yml核心配置文件
在项目根目录创建.gitlab-ci.yml,这是CI/CD流程的核心控制文件,示例如下:
stages: - build - deploy # 构建Docker镜像阶段 build_image: stage: build tags: - k8s,deploy # 指定刚才注册的Runner标签 script: # 构建镜像(假设项目根目录有Dockerfile) - docker build -t your-registry/your-app:$CI_COMMIT_SHA . # 推送镜像到仓库(需提前在GitLab变量中配置镜像仓库账号密码) - docker login -u $DOCKER_USER -p $DOCKER_PASSWORD your-registry - docker push your-registry/your-app:$CI_COMMIT_SHA # 部署到K8s集群阶段 deploy_to_k8s: stage: deploy tags: - k8s,deploy script: # 替换部署文件中的镜像标签为当前提交的SHA值 - sed -i "s/IMAGE_TAG/$CI_COMMIT_SHA/g" k8s/deployment.yaml # 应用K8s部署配置 - kubectl apply -f k8s/deployment.yaml # 可选:等待部署完成 - kubectl rollout status deployment/your-app only: - main # 仅在main分支提交时触发部署
关键注意事项:
- 确保项目中存在
k8s/deployment.yaml部署文件,镜像地址用IMAGE_TAG作为占位符 - 在GitLab项目的
Settings -> CI/CD -> Variables中添加敏感变量(如DOCKER_USER、DOCKER_PASSWORD),这些变量会自动注入CI脚本 - 如果K8s开启了RBAC,需确保kubeconfig对应的账号拥有创建Deployment、Service等资源的权限
4. 测试CI/CD部署流程
提交.gitlab-ci.yml和K8s部署文件到GitLab项目,触发流水线:
- 进入GitLab项目的
CI/CD -> Pipelines查看执行状态 - 若build和deploy阶段均成功,登录K8s集群验证应用状态:
kubectl get pods kubectl get deployments
常见问题排查
- 若kubectl命令报错
permission denied:检查kubeconfig文件权限,或K8s账号的RBAC权限是否足够 - 若镜像推送失败:检查镜像仓库凭证是否正确,CentOS主机能否访问镜像仓库地址
- 若流水线卡住:检查Runner是否在线,标签是否与CI配置中的标签匹配
内容的提问来源于stack exchange,提问作者leaf4monkey
相关产品推荐
相关产品推荐

