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

时间:2018-09-06 10:36:15

标签: jenkins kubernetes jenkins-plugins kubectl kubernetes-helm

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

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

这是失败并引发异常:“来自服务器的错误(禁止):禁止使用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"
        }    
    }
  }
}

您能告诉我出什么问题了吗?

谢谢

1 个答案:

答案 0 :(得分:3)

从Kubernetes v1.8开始,Kubernetes(k8s)主服务器默认情况下在对其API的访问上实现role-based access control (RBAC)安全控制。 RBAC控件将您的工作负载对k8s API的访问限制为仅允许您明确允许的那些资源和方法。

您应该创建一个role,以允许访问pod资源的list动词(以及您需要的其他任何资源 1 ),创建一个{{ 3}}对象,最后创建一个service account,将角色分配给服务帐户。

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

1 如果您打算从Jenkins进行部署,那么肯定需要的不仅仅是列出Pod的功能,因为您将需要对系统中的对象进行突变。但是,如果使用Helm,则是Helm的Tiller吊舱会影响部署的下游k8s对象,因此,Helm Tiller和Jenkins与Tiller通信所需的权限集会有所不同。