无法将命名空间参数传递给 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
.
传递
- 在 Jenkins 中创建新凭据。我使用了秘密文件选项。
- 上传您想要的。kube/config 并在凭据创建表单中给它一个 name/id。
- 将您提供给此凭据资源的 ID 名称传递到
credentialsId
字段
withKubeConfig([credentialsId: 'file-aws-config'
, [..]]) ...
我在我的 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
.
- 在 Jenkins 中创建新凭据。我使用了秘密文件选项。
- 上传您想要的。kube/config 并在凭据创建表单中给它一个 name/id。
- 将您提供给此凭据资源的 ID 名称传递到
credentialsId
字段
withKubeConfig([credentialsId: 'file-aws-config'
, [..]]) ...