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

问题描述 投票:0回答:1

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

  • lachlanevenson / K8S-kubectl:v1.8.8
  • lachlanevenson / K8S-掌舵:最新

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

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

你能告诉我什么是错的吗?

谢谢,

jenkins kubernetes jenkins-plugins kubectl kubernetes-helm
1个回答
3
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.