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

3

我正在配置Kubernetes系统上的Jenkins。构建工作正常,但是为了部署,我们需要调用kubectl或helm。目前,我正在使用以下镜像:

  • lachlanevenson/k8s-kubectl:v1.8.8
  • lachlanevenson/k8s-helm:latest

然而,它失败并抛出异常:“来自服务器的错误(Forbidden):禁止使用pods:用户“system:serviceaccount:jenkins:default”无法在命名空间“jenkins”中列出pods”

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"
        }    
    }
  }
}

请问有什么问题吗?

谢谢,


看起来像是一个RBAC问题。您是否检查过在您的集群中为Jenkins用户定义了足够的角色? - fatcook
1个回答

3
作为Kubernetes v1.8的默认设置,Kubernetes(k8s)主控实现基于角色的访问控制(RBAC)安全控制以控制对其API的访问。RBAC控制仅允许您明确允许的工作负载访问k8s API中的资源和方法。
您应该创建一个角色,允许访问 pod 资源的 list 动词(以及任何其他所需的资源1),创建一个服务帐户对象,并最后创建一个角色绑定,将角色分配给服务帐户。
最后,在 Pod 模板的 serviceAccountName 属性中提供服务账户以供 Jenkins 部署使用。确保 automountServiceAccountTokentrue,以便 k8s 将 API 密钥安装到您的 Pod 中。使用原生 k8s API 封装器和库尝试访问 k8s API 时,应该会找到此密钥并自动验证您的请求。 1如果您计划从 Jenkins 进行部署,则肯定需要更多的能力来列出 Pods,因为您需要对系统中的对象进行变异。但是,如果您使用 Helm,则 Helm 的 Tiller Pod 将影响您的部署的下游 k8s 对象,因此您需要为 Helm Tiller 和 Jenkins 与 Tiller 通信所需的权限集合各不相同。


谢谢您的回复。您是正确的,当我在Pod模板中设置“serviceAccount:'jenkins'”时,它可以正常工作。 - Jacky Phuong
另一个问题,你知道如何限制同时运行的从节点数量吗?目前,它没有限制,因此会影响集群性能。我设置了instanceCap = 5,但它没有生效。 - Jacky Phuong
@JackyPhuong,请为您的第二个问题提出一个新问题。 - aurelius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接