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

时间:2019-02-17 18:57:46

标签: jenkins kubernetes jenkins-pipeline jenkins-plugins

我在k8s集群中定义了几个具有命名空间的不同上下文。 对于Jenkins使用不同的管道,我想在它们之间进行切换。 思路是:基于git分支对特定环境进行部署。为此,我必须切换到现有的生产/开发/功能上下文和名称空间。

我想使用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

这是运行该步骤的结果: enter image description here

如何解决该问题?是否可以使用所有提到的插件使用名称空间?如果没有,在Jenkins管道步骤中是否还有另一种方法可以实现上下文+命名空间切换?

编辑: 似乎在Jenkins机器上将条目添加到.kube / config并不能解决该问题。这个Jenkins的插件kubernetes-cli创建了隔离的上下文,并且不太关心.kube / config:(

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

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

2 个答案:

答案 0 :(得分:2)

该插件没有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

答案 1 :(得分:1)

感谢詹金斯(Jenkins)官方IRC频道的帮助,下面提供解决方案。

解决方案: 您必须将原始.kube / config文件作为credentialsId传递。

  1. 在Jenkins中创建新的证书。我使用了秘密文件选项。
  2. 上传所需的.kube / config,并在凭据创建表单中为其命名/标识。
  3. 将您为此凭据资源提供的ID名称传递到credentialsId字段

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