在进行之前写好的集群数据库更新操作前,希望能在Jenkins上也实现选择更新集群的操作,下方是写的jenkinsfile,其中设置集群认证需要的四个参数,分别是集群地址、集群Caz证书、集群客户端秘钥、集群客户端证书,将该四个参数插入到kubeconfig文件指定位置进行替换,形成一个新的kubeconfig文件,再重新设置KUBECONFIG环境变量,就实现了运行节点上远程访问集群的切换。(注意,能这样做主要是第一次已经在运行节点上做了安装集群CLI工具、创建/~/.kube目录、设置KUBECONFIG环境变量等操作,确保能正常访问集群,并且切换的多集群是相同的contexts)
pipeline {
agent {
node {
label 'bm_110.160'
}
}
parameters {
string(name: 'kube_apiserver', defaultValue: 'default_value',
description: '集群apiserver地址')
string(name: 'certificate_authority_data', defaultValue: 'default_value',
description: '集群Caz证书')
string(name: 'client_certificate_data', defaultValue: 'default_value',
description: '集群客户端证书')
string(name: 'client_key_data', defaultValue: 'default_value',
description: '集群客户端密钥')
}
stages {
stage('change cluster') {
steps {
sh "sed -i 's/{{kube_apiserver}}/${params.kube_apiserver}/g' /root/.kube/config-mould"
sh "sed -i 's/{{certificate_authority_data}}/${params.certificate_authority_data}/g' /root/.kube/config-mould"
sh "sed -i 's/{{client_certificate_data}}/${params.client_certificate_data}/g' /root/.kube/config-mould"
sh "sed -i 's/{{client_key_data}}/${params.client_key_data}/g' /root/.kube/config-mould"
sh '''
cp /root/.kube/config-mould /root/.kube/config
cp /root/.kube/config-mould-bak /root/.kube/config-mould
export KUBECONFIG=/root/.kube/config
kubectl -n bm-system get pods
'''
}
}
}
}
将该jenkinsfile记录下来主要原因是:在Jenkinsfile的sh脚本中,无法将双引号和变量包含在单引号之间,并期望${params.kube_apiserver}变量能够被正确替换。这是因为在单引号字符串中,Shell解析器不会扩展变量引用,所以${params.kube_apiserver}会按字面意义被打印出来。
为了解决这个问题,一种常见的技巧是将Shell脚本放置在双引号字符串中,并将变量引用用$符号包围起来,以便正确扩展参数值。注意,在将双引号用作Shell脚本字符串时,要小心转义特殊字符,例如${}或$。如果这些字符在双引号字符串中被解释为变量,可能需要使用\对其进行转义,例如\${}或\$。
优化:
上面通过替换四个参数的方式进行集群切换过于麻烦,而且当kubeconfig中其他地方不一样时还是会产生错误,所以最好的办法还是直接替换整个kubeconfig,通过对jenkins的凭据研究,最后选择利用secret file 凭据来保存不同集群的kubeconfig文件,在构建工程时,只用通过选择不同集群凭据就可实现集群切换,实现效果如下图:
要实现上面的效果,首先要在credentials中保存集群kubeconfig为secretfile凭据,操作如下图:
1、进入自己创建的domain中,点击增加凭据按钮,选择secret file类型
2、选择适合的范围,上传集群kubeconfig,可以不写id,系统会自动生成一个唯一id,但这里建议最好用集群vip为id,便于选择时辨认,最后点击create按钮创建
通过上述步骤就可以创建对应的集群kubeconfig凭据了,在jenkinsfile中,使用withCredentials()
语法来引用特定的凭据,那么如何使用正确的语法呢,可以通过片段生成器自动生成流水线脚本,具体步骤如下:
1、点击jenkinsfile下面的流水线语法
2、在示例步骤中选择“ withCredentials:Bind credentials to variables”
3、”绑定“ 中点击新增选择Secret file,选择对应的凭据,编写一个变量名,然后点击生成流水线脚本按钮,文本框中便自动生成相应脚本,可复制用于jenkinsfile中
jenkinsfile:在Pipeline中使用参数定义给定集群的凭据ID,以便使用params.CONFIG_CLUSTER
传递集群id,该id也就是withCredentials
步骤中的credentialsId
先在Pipeline中使用参数定义给定集群的凭据ID,这里使用了params.CONFIG_CLUSTER
传递集群名称。然后使用script
块来引用withCredentials
步骤,并在块中使用Groovy字符串插值引用变量config_cluster
。在Groovy字符串插值的示例中,使用${}
来引用变量config_cluster
。
script {
def config_cluster = "${params.CONFIG_CLUSTER}"
withCredentials([file(credentialsId: config_cluster, variable: 'CONFIG_FILE')]) {
sh '''
cat $CONFIG_FILE > /root/.kube/config
export KUBECONFIG=/root/.kube/config
kubectl -n bm-system get pods
'''
}
}
最后通过执行kubectl -n bd-system get pods来判断集群是否连接成功。