You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:05:37