Jenkins Kubernetes Pipeline报错:节点非Kubernetes节点,请求协助排查
问题:Jenkins Pipeline部署Nginx到Kubernetes失败,报错"Node is not a Kubernetes node"
问题描述
Nginx服务无法通过Jenkins Pipeline部署到Kubernetes,运行Pipeline时报错ERROR: Node is not a Kubernetes node:,不清楚阻碍启动的原因,想确认是否需要在Jenkins的Kubernetes配置中额外配置Pod,请求协助解决。
环境信息
- Jenkins以Docker容器运行在本地宿主机
- Kubernetes采用Minikube(同样以Docker容器运行在宿主机)
- 宿主机已安装kubectl
已配置内容
已安装Jenkins插件
- Kubernetes插件
- Docker插件(当前未使用)
Kubernetes云配置
- 在Jenkins中配置了名为
my-k8s的Kubernetes云 - 使用宿主机
~/.kube/config中的密钥文件,并更新了证书的实际数据 - 连接测试通过:在
http://192.168.1.41:8080/manage/cloud/my-k8s/configure测试显示已连接到Kubernetes v1.28.3
原Pipeline代码
pipeline { agent any stages { stage('Deploy Nginx to Kubernetes') { steps { container('Kubernetes') { // Configure Kubernetes server details // credentialsId 'kubernetes-credentials' // Replace with your credential ID // I don't know what credentialsId serverName 'https://192.168.49.2:8443' // Kubernetes API server URL(~$ cat .kube/conf ) namespace 'default' // Replace with your desired namespace // Define Nginx deployment YAML script { def deploymentYaml = """ apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 """ writeFile file: 'nginx-deployment.yaml', text: deploymentYaml } // Deploy Nginx using Kubernetes plugin kubernetesApply file: 'nginx-deployment.yaml' } } } } }
报错日志
Started by user admin Replayed #1 [Pipeline] Start of Pipeline [Pipeline] node Running on Jenkins in /var/jenkins_home/workspace/kube-nginx-project [Pipeline] { [Pipeline] stage [Pipeline] { (Deploy Nginx to Kubernetes) [Pipeline] container [Pipeline] // container [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: Node is not a Kubernetes node: Finished: FAILURE
问题分析与解决方法
问题原因
agent any让Jenkins将任务分配到自身所在的Docker容器节点,该节点并非Kubernetes集群内的节点,而container('Kubernetes')指令仅能在Kubernetes Pod的容器中生效,因此触发报错。- 原Pipeline中直接写入的
serverName、namespace等并非Jenkins Pipeline有效语法,无法被识别执行。
解决步骤
1. 修改Pipeline的Agent配置
指定使用之前配置好的my-k8s云,让Jenkins在Kubernetes集群内创建代理Pod来执行任务,而非使用Jenkins自身节点。
2. 移除无效指令并调整部署逻辑
删除原Pipeline中无效的serverName等语句,利用Kubernetes插件的内置能力完成部署。
修改后的Pipeline代码
pipeline { // 指定使用已配置的Kubernetes云,自动在K8s中创建代理Pod agent { kubernetes { cloud 'my-k8s' // 对应Jenkins中配置的Kubernetes云名称 // 可选:如果代理Pod需要kubectl工具,可自定义Pod模板 podTemplate { container { name 'kubectl' image 'bitnami/kubectl:latest' // 包含kubectl的镜像 } } } } stages { stage('Deploy Nginx to Kubernetes') { steps { // 如果使用了自定义kubectl容器,用container包裹步骤 container('kubectl') { script { def deploymentYaml = """ apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 """ writeFile file: 'nginx-deployment.yaml', text: deploymentYaml } // 使用插件自带的kubernetesApply部署,自动关联云配置的集群信息 kubernetesApply file: 'nginx-deployment.yaml', namespace: 'default' } } } } }
额外说明
- 无需手动配置Pod,Jenkins Kubernetes插件会根据agent配置自动在Kubernetes集群中创建代理Pod,只要云连接配置正确即可。
- 如果代理Pod缺少kubectl工具,必须在podTemplate中指定包含kubectl的镜像,否则无法执行Kubernetes相关操作。
内容的提问来源于stack exchange,提问作者Vasanth Vel
相关产品推荐
相关产品推荐

