无法将命名空间参数传递给 Jenkins 的 kubernetes-cli 插件

Unable to pass namespace parameter to kubernetes-cli plugin for Jenkins

我在我的 k8s 集群中定义了几个不同的命名空间上下文。 为 Jenkins 使用不同的管道我想在它们之间切换。 思路是:基于git分支做部署到特定环境。为此,我必须切换到现有的 production/dev/feature 上下文和命名空间。

我想用https://wiki.jenkins.io/display/JENKINS/Kubernetes+Cli+Plugin 这是 Jenkins 脚本化流水线的示例语法:

示例:

node {
  stage('List pods') {
    withKubeConfig([credentialsId: '<credential-id>',
                    caCertificate: '<ca-certificate>',
                    serverUrl: '<api-server-address>',
                    contextName: '<context-name>',
                    clusterName: '<cluster-name>'
                    ]) {
      sh 'kubectl get pods'
    }
  }
}

如您所见,它不接受 namespace

的任何内容

这是一个带有命名空间的示例生产上下文,我正在使用它:

$ kubectl config get-contexts 
CURRENT   NAME             CLUSTER                           AUTHINFO                          NAMESPACE
*         aws-production   cluster.example.com   cluster.example.com       aws-production

这是 运行 这一步的结果:

如何解决这个问题?是否可以完全使用提到的插件来使用命名空间?如果没有,是否有其他方法可以在 Jenkins 管道步骤中实现上下文+命名空间切换?

编辑: 似乎在 Jenkins 机器上向 .kube/config 添加条目对解决该问题没有帮助。 Jenkins 的这个插件 kubernetes-cli 创建了独立的上下文并且不太关心 .kube/config :(

手动强制配置,在这种情况下也无济于事;

kubectl config use-context aws-production --namespace=aws-production --kubeconfig=/home/jenkins/.kube/config

该插件没有 namespace 参数,但 ~/.kube/config 有。因此,您可以创建 2 个上下文来处理两个不同的名称空间。在你的 ~/.kube/config`

contexts:
- context:
    cluster: k8s.mycluster
    namespace: mynamespace1
    user: k8s.user
  name: clusternamespace1
- context:
    cluster: k8s.mycluster
    namespace: mynamespace2
    user: k8s.user
  name: clusternamespace2

感谢 Jenkins 官方 IRC 频道的帮助,解决方法如下。

解决方法: 您必须将原始 .kube/config 文件作为 credentialsId.

传递
  1. 在 Jenkins 中创建新凭据。我使用了秘密文件选项。
  2. 上传您想要的。kube/config 并在凭据创建表单中给它一个 name/id。
  3. 将您提供给此凭据资源的 ID 名称传递到 credentialsId 字段

withKubeConfig([credentialsId: 'file-aws-config', [..]]) ...