如何在Kubernetes Pod型Jenkins Slave节点中运行kubectl?
在Jenkins Kubernetes Slave里运行kubectl的几种可行方案
方案一:新增带kubectl的专用容器(最推荐)
直接在你的podTemplate里添加一个预装kubectl的容器即可,这种方式隔离性好,不会污染现有容器环境,也无需额外安装步骤。
修改后的完整Jenkinsfile示例:
podTemplate(yaml: """ apiVersion: v1 kind: Pod metadata: namespace: jenkins spec: containers: - name: maven image: maven:latest command: - cat tty: true - name: node image: node:16-alpine3.12 command: - cat tty: true - name: kubectl image: bitnami/kubectl:latest # 也可使用kubernetes官方镜像k8s.gcr.io/kubectl:latest command: - cat tty: true """ ) { node(POD_LABEL) { stage('Build Petclinic Java App') { git url: 'https://github.com/spring-projects/spring-petclinic.git', branch: 'main' container('maven') { sh 'mvn -B -ntp clean package -DskipTests' } } stage('Run on Node') { container('node') { sh 'npm version' } } stage('Deploy to Kubernetes') { container('kubectl') { sh 'kubectl version --client' # 这里替换成你的部署命令,比如kubectl apply -f your-deployment.yaml } } } }
注意:需要给Jenkins Slave使用的ServiceAccount分配足够的K8s权限,比如通过Role和RoleBinding配置允许创建Deployment、Service等资源的权限,否则kubectl会抛出权限不足的错误。
方案二:在现有容器里临时安装kubectl
如果不想新增容器,也可以在maven或node容器内临时安装kubectl,但会增加容器启动时间,且会污染现有容器环境。
比如在debian系的maven容器中安装:
stage('Build & Setup Kubectl') { container('maven') { sh ''' curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl mv kubectl /usr/local/bin/ kubectl version --client ''' sh 'mvn -B -ntp clean package -DskipTests' } }
如果是alpine系的node容器,安装命令替换为:
apk add --no-cache curl curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl mv kubectl /usr/local/bin/
方案三:挂载kubectl二进制文件到jnlp容器(不推荐)
可以通过Volume将集群节点上的kubectl二进制文件挂载到jnlp容器中,但这种方式依赖集群节点的kubectl版本,维护成本高,除非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

