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