Jenkins + Kubernetes:如何在 kubernetes-plugin 上使用 kubectl

Jenkins + Kubenetes: How to use kubectl in kubernetes-plugin

我正在 Kubernetes 系统上配置 Jenkins。它可以很好地构建。但是为了部署,我们需要调用 kubectl 或 helm。目前,我正在使用

失败并抛出异常:"Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:jenkins:default" cannot list pods in the namespace "jenkins""

jenkins 脚本很简单:

def label = "worker-${UUID.randomUUID().toString()}"

podTemplate(label: label,containers: [
  containerTemplate(name: 'kubectl', image: 'lachlanevenson/k8s-kubectl:v1.8.8', command: 'cat', ttyEnabled: true)
],
volumes: [
  hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
]){
  node(label) {
    stage('Run kubectl') {
        container('kubectl') {
            sh "kubectl get pods"
        }    
    }
  }
}

你能告诉我哪里出了问题吗?

谢谢,

从 Kubernetes v1.8 开始,Kubernetes (k8s) master 默认实施 role-based access control (RBAC) 访问其 API 的安全控制。 RBAC 控件将您的工作负载对 k8s API 的访问限制为您明确允许的那些资源和方法。

您应该创建一个 role which permits access to the pod resource's list verb (and any other resources you require1), create a service account object, and finally create a role binding 将角色分配给服务帐户。

最后,通过在 Pod 模板的 serviceAccountName 属性 中提供其名称,将服务帐户提供给您的 Jenkins 部署。确保 automountServiceAccountTokentrue 以让 k8s 在您的 Pod 中安装 API 密钥。尝试使用本机 k8s API 包装器和库访问 k8s API 应该找到此密钥并自动验证您的请求。

1如果您计划从 Jenkins 进行部署,您肯定需要的不仅仅是列出 Pods 的能力,因为您将需要改变系统中的对象。但是,如果您使用 Helm,则影响部署的下游 k8s 对象的是 Helm 的 Tiller pod,因此 Helm Tiller 和 Jenkins 与 Tiller 通信所需的权限集会有所不同。