Jenkinsfile 实现运行节点切换集群连接

在进行之前写好的集群数据库更新操作前,希望能在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来判断集群是否连接成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值