Jenkins + Kubernetes:如何在 kubernetes-plugin 上使用 kubectl
Jenkins + Kubenetes: How to use kubectl in kubernetes-plugin
我正在 Kubernetes 系统上配置 Jenkins。它可以很好地构建。但是为了部署,我们需要调用 kubectl 或 helm。目前,我正在使用
- lachlanevenson/k8s-kubectl:v1.8.8
- lachlanevenson/k8s-helm:最新
失败并抛出异常:"Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:jenkins:default" cannot list pods in the namespace "jenkins""
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 默认实施 role-based access control (RBAC) 访问其 API 的安全控制。 RBAC 控件将您的工作负载对 k8s API 的访问限制为您明确允许的那些资源和方法。
您应该创建一个 role which permits access to the pod
resource's list
verb (and any other resources you require1), create a service account object, and finally create a role binding 将角色分配给服务帐户。
最后,通过在 Pod 模板的 serviceAccountName
属性 中提供其名称,将服务帐户提供给您的 Jenkins 部署。确保 automountServiceAccountToken
为 true
以让 k8s 在您的 Pod 中安装 API 密钥。尝试使用本机 k8s API 包装器和库访问 k8s API 应该找到此密钥并自动验证您的请求。
1如果您计划从 Jenkins 进行部署,您肯定需要的不仅仅是列出 Pods 的能力,因为您将需要改变系统中的对象。但是,如果您使用 Helm,则影响部署的下游 k8s 对象的是 Helm 的 Tiller pod,因此 Helm Tiller 和 Jenkins 与 Tiller 通信所需的权限集会有所不同。
我正在 Kubernetes 系统上配置 Jenkins。它可以很好地构建。但是为了部署,我们需要调用 kubectl 或 helm。目前,我正在使用
- lachlanevenson/k8s-kubectl:v1.8.8
- lachlanevenson/k8s-helm:最新
失败并抛出异常:"Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:jenkins:default" cannot list pods in the namespace "jenkins""
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 默认实施 role-based access control (RBAC) 访问其 API 的安全控制。 RBAC 控件将您的工作负载对 k8s API 的访问限制为您明确允许的那些资源和方法。
您应该创建一个 role which permits access to the pod
resource's list
verb (and any other resources you require1), create a service account object, and finally create a role binding 将角色分配给服务帐户。
最后,通过在 Pod 模板的 serviceAccountName
属性 中提供其名称,将服务帐户提供给您的 Jenkins 部署。确保 automountServiceAccountToken
为 true
以让 k8s 在您的 Pod 中安装 API 密钥。尝试使用本机 k8s API 包装器和库访问 k8s API 应该找到此密钥并自动验证您的请求。
1如果您计划从 Jenkins 进行部署,您肯定需要的不仅仅是列出 Pods 的能力,因为您将需要改变系统中的对象。但是,如果您使用 Helm,则影响部署的下游 k8s 对象的是 Helm 的 Tiller pod,因此 Helm Tiller 和 Jenkins 与 Tiller 通信所需的权限集会有所不同。