如何从同一K8s集群内的Jenkins Pod重启Kubernetes Deployment
在Kubernetes集群内通过Jenkins重启Deployment的解决方案
核心思路
要让Jenkins能执行kubectl rollout restart命令,关键是给Jenkins(或其构建代理)分配足够的Kubernetes RBAC权限,并确保kubectl能正常访问集群API Server。
方案一:给Jenkins主Pod绑定权限充足的Service Account
如果你的Jenkins运行在Kubernetes Pod中,直接给这个Pod绑定专用SA是最简单的方式:
1. 创建专用Service Account
apiVersion: v1 kind: ServiceAccount metadata: name: jenkins-deployment-manager namespace: <jenkins所在命名空间> # 替换成你的Jenkins部署的命名空间,比如jenkins
2. 创建Role(授予nams命名空间的Deployment操作权限)
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: deployment-restart-role namespace: nams rules: - apiGroups: ["apps"] resources: ["deployments", "deployments/rollout"] verbs: ["get", "list", "watch", "patch"] # patch权限是执行rollout restart必需的
3. 绑定SA与Role
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: jenkins-deployment-restart-binding namespace: nams subjects: - kind: ServiceAccount name: jenkins-deployment-manager namespace: <jenkins所在命名空间> roleRef: kind: Role name: deployment-restart-role apiGroup: rbac.authorization.k8s.io
4. 配置Jenkins Pod使用该SA
修改Jenkins的Deployment yaml,在spec.template.spec下添加:
serviceAccountName: jenkins-deployment-manager
5. 在Jenkins中执行命令
在Jenkins Pipeline或自由风格项目中直接运行:
kubectl rollout restart -n nams deployment xxx-deployment
(如果Jenkins主Pod里没装kubectl,需要先安装,比如通过初始化脚本或修改Jenkins镜像)
方案二:使用Kubernetes构建代理(解决之前失败的问题)
如果之前用构建代理失败,大概率是代理Pod的权限不足或缺少kubectl工具,按以下步骤配置:
1. 准备代理Pod的YAML(包含kubectl工具)
在Jenkins Pipeline中指定代理时,使用带kubectl的镜像,并绑定有权限的SA:
pipeline { agent { kubernetes { serviceAccount 'jenkins-deployment-manager' # 用方案一中创建的SA yaml """ apiVersion: v1 kind: Pod metadata: name: jenkins-kubectl-agent spec: containers: - name: kubectl image: bitnami/kubectl:latest command: ['sleep'] args: ['99d'] """ } } stages { stage('Restart Deployment') { steps { sh 'kubectl rollout restart -n nams deployment xxx-deployment' } } } }
2. 关键注意点
- 代理Pod必须使用有权限的SA(即方案一中的
jenkins-deployment-manager) - 镜像必须包含kubectl工具(比如bitnami/kubectl、alpine/k8s等)
方案三:手动配置kubectl访问(无需依赖SA自动挂载)
如果需要自定义kubeconfig,可在Jenkins容器中执行以下命令配置:
# 配置集群信息 kubectl config set-cluster k8s-cluster \ --server=https://kubernetes.default.svc \ --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt # 配置认证信息(使用SA的token) kubectl config set-credentials jenkins-sa \ --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) # 设置默认上下文 kubectl config set-context default-context \ --cluster=k8s-cluster \ --user=jenkins-sa kubectl config use-context default-context
配置完成后即可正常执行kubectl rollout restart命令。
常见问题排查
- 权限不足:检查Role的rules是否包含
deployments/rollout的patch权限,RoleBinding是否正确绑定SA和Role - kubectl不存在:确保Jenkins主Pod或代理Pod的镜像安装了kubectl工具
- API Server访问失败:检查集群内部DNS是否正常,
kubernetes.default.svc是否能解析
内容的提问来源于stack exchange,提问作者Giorgos
相关产品推荐
相关产品推荐

