我正在Kubernetes系统上配置Jenkins。它可以很好地构建。但是为了进行部署,我们需要调用kubectl或helm。目前,我正在使用
这是失败并引发异常:“来自服务器的错误(禁止):禁止使用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"
}
}
}
}
您能告诉我出什么问题了吗?
谢谢
答案 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部署。确保automountServiceAccountToken
为true
,以使k8s将API密钥安装到Pod中。尝试使用本机k8s API包装器和库访问k8s API时,应找到此密钥并自动验证您的请求。
1 如果您打算从Jenkins进行部署,那么肯定需要的不仅仅是列出Pod的功能,因为您将需要对系统中的对象进行突变。但是,如果使用Helm,则是Helm的Tiller吊舱会影响部署的下游k8s对象,因此,Helm Tiller和Jenkins与Tiller通信所需的权限集会有所不同。 >