通过jenkins实现对k8s pod重启

本文介绍如何使用JenkinsPipeline在测试和预发环境中,通过GroovyScript实现对k8s容器的模糊查询并自动重启,以简化配置变更后的服务管理流程。

背景

根据作者本人所在公司业务实际情况,程序配置文件是放到配管中心统一管理的,若修改配置后,需要对服务进行重启,如果直接通过kubectl命令操作,对开发或测试人员来讲不太友好,所以就使用jenkins pipeline来实现对测试和预发环境容器重启的功能

功能展示

环境选择、需要重启容器选择
服务选择支持模糊查询(Filter)

功能实现

环境选择

在这里插入图片描述

获取各环境内所有容器

在这里插入图片描述
groovy script

if(service_env.equals("测试环境")){
   def pod_list = """kubectl --namespace=default --kubeconfig=/root/.kube/config-test get po --no-headers""".execute().text.readLines().collect { it.split()[0] }
}
else if(service_env.equals("预发环境")){
   def pod_list = """kubectl --namespace=default --kubeconfig=/root/.kube/config-pre get po --no-headers""".execute().text.readLines().collect { it.split()[0] }
}   

流水线脚本

具体操作
流水线脚本代码

import java.util.List
import java.util.ArrayList
import java.net.URLEncoder

def podname=env.pod_name

stage('重启容器'){
    node('slave-be01'){
        if (service_env == "测试环境"){
            sh "kubectl --namespace=default --kubeconfig=/root/.kube/config-test delete po $podname"
            buildDescription "操作人:${env.BUILD_USER_ID}\n当前环境:${service_env}\n重启服务:${podname}"
        }else{
            sh "kubectl --namespace=default --kubeconfig=/root/.kube/config-pre delete po $podname"
            buildDescription "操作人:${env.BUILD_USER_ID}\n当前环境:${service_env}\n重启服务:${podname}"
        }
    }
}```

<think>我们有两个引用: 引用[1]:讨论了Readiness Probe(就绪探针)的作用,它用于检测应用是否准备好接收流量。如果探针失败,Pod会从Service的Endpoints中移除,但不会重启Pod。 引用[2]:提到KubernetesJenkins等工具的集成,实现从代码提交到生产环境的全自动化部署。 用户问题:Jenkins构建完成后监控k8spod启动状态的方法 根据用户的上一个问题,我们之前讨论了一个监控Pod状态的脚本,现在用户希望结合Jenkins构建完成后的场景。 思路: 1. Jenkins构建完成后,通常会通过kubectl apply或helm等工具部署新的Pod。 2. 部署后,我们需要监控Pod的启动状态,直到Pod变为Ready状态(包括通过就绪探针)或失败。 方法: 方法一:使用kubectl wait命令等待Pod进入特定状态 方法二:编写脚本轮询Pod状态(类似之前脚本,但这里只关注启动阶段) 方法三:利用Jenkins Kubernetes插件(如Kubernetes Continuous Deploy Plugin)的部署状态反馈 考虑到引用[1]中提到的就绪探针,我们不仅需要Pod的status.phase为Running,还需要就绪探针通过(即Pod Ready)。 具体步骤: 方法一:kubectl wait 在Jenkins的构建步骤(如Execute shell)中,执行部署后,使用kubectl wait命令等待Pod就绪。 示例: ``` # 部署应用 kubectl apply -f deployment.yaml # 等待Pod就绪,设置超时时间 kubectl wait --for=condition=Ready pod -l app=myapp --timeout=300s ``` 解释: - `-l app=myapp` 使用标签选择器选择需要监控的Pod - `--timeout` 设置等待超时时间,超过则命令返回非0,Jenkins构建标记为失败 方法二:脚本轮询(适合需要更复杂逻辑的情况) 在Jenkins中执行一个脚本,该脚本不断检查Pod的状态,直到条件满足。 示例脚本(wait_for_pod.sh): ```bash #!/bin/bash POD_LABEL="app=myapp" TIMEOUT=300 # 超时时间(秒) INTERVAL=10 # 检查间隔(秒) start_time=$(date +%s) end_time=$((start_time + TIMEOUT)) while [ $(date +%s) -lt $end_time ]; do # 获取Pod状态,检查Condition Ready是否为True pod_status=$(kubectl get pod -l $POD_LABEL -o jsonpath='{.items[*].status.conditions[?(@.type=="Ready")].status}') # 如果有多个Pod,这里需要根据实际情况处理,这里假设只有一个Pod if [ "$pod_status" == "True" ]; then echo "Pod is ready." exit 0 fi echo "Waiting for pod to be ready..." sleep $INTERVAL done echo "Timeout waiting for pod to be ready." exit 1 ``` 在Jenkins中调用该脚本,如果脚本返回非0,则构建失败。 注意事项: - 如果部署的是多Pod(例如Deployment),需要检查所有Pod或指定数量的Pod就绪。 - 可以结合`kubectl get pods`的`-o jsonpath`或`-o json`进行更复杂的检查。 方法三:使用Jenkins插件 例如使用“Kubernetes Continuous Deploy Plugin”,该插件在部署后可以监控资源状态,并等待部署完成。 配置步骤: 1. 安装插件:“Kubernetes Continuous Deploy Plugin” 2. 在Jenkins构建后步骤中选择“Deploy to Kubernetes” 3. 配置Kubernetes连接、配置文件(如kubeconfig)和部署文件路径 4. 插件会自动等待部署完成(包括Pod就绪) 结合引用[1]中的就绪探针,我们需要确保在部署完成后,Pod不仅运行而且通过了就绪探针。以上方法都会等待Pod的Ready条件(该条件由就绪探针决定)[^1]。 另外,引用[2]中提到KubernetesJenkins的集成,我们可以通过Jenkins Pipeline来实现更灵活的部署和监控流程[^2]。 示例Pipeline脚本(Jenkinsfile): ```groovy pipeline { agent any stages { stage('Deploy') { steps { script { // 构建镜像并推送 // 部署到Kubernetes sh 'kubectl apply -f deployment.yaml' } } } stage('Verify Deployment') { steps { script { // 等待Pod就绪 sh ''' kubectl wait --for=condition=Available deployment/myapp-deployment --timeout=300s ''' } } } } } ``` 这里使用了`kubectl wait`命令等待Deployment的条件`Available`(即可用,意味着至少有一个Pod就绪)。 总结: 在Jenkins中监控Pod启动状态,推荐使用`kubectl wait`命令(简单有效),或者使用Jenkins插件。对于Deployment,可以直接等待Deployment的条件,这样更符合部署场景。 相关问题: 1. 如何设置Kubernetes的就绪探针(Readiness Probe)? 2. Jenkins Pipeline中如何处理部署超时? 3. 如何监控Kubernetes Deployment的滚动更新状态? 4. 在Jenkins中如何集成kubectl命令? </think>以下是Jenkins构建完成后监控Kubernetes Pod启动状态的完整解决方案,结合引用内容和最佳实践: ### 解决方案核心思路 1. **部署后状态监控**:在Jenkins构建流程中集成Pod启动状态检查 2. **就绪探针验证**:引用[^1]的Readiness Probe机制确保流量接收准备 3. **自动化反馈**:将监控结果集成到CI/CD流程中 ```groovy // Jenkins Pipeline 示例 (Jenkinsfile) pipeline { agent any stages { stage('Build & Deploy') { steps { sh 'docker build -t my-app:${BUILD_NUMBER} .' sh 'kubectl apply -f k8s-deployment.yaml' } } stage('Monitor Pod Startup') { steps { script { def POD_LABEL = "app=my-app" def NAMESPACE = "production" def TIMEOUT = 300 // 超时时间(秒) // 等待Pod进入Running状态 sh """ kubectl wait --for=condition=Ready \ -n $NAMESPACE \ -l $POD_LABEL pod \ --timeout=${TIMEOUT}s """ // 验证就绪探针 def podName = sh( script: "kubectl get pods -n $NAMESPACE -l $POD_LABEL -o jsonpath='{.items[0].metadata.name}'", returnStdout: true ).trim() // 检查就绪探针状态 def readinessStatus = sh( script: "kubectl get pod ${podName} -n $NAMESPACE -o jsonpath='{.status.conditions[?(@.type==\"Ready\")].status}'", returnStdout: true ).trim() if (readinessStatus != "True") { error("就绪探针失败: Pod ${podName} 未通过健康检查 [^1]") } else { echo "✅ Pod启动成功并通过就绪探针" } } } } } post { always { // 获取Pod日志用于调试 sh 'kubectl logs -l app=my-app -n production > pod_logs.txt' archiveArtifacts 'pod_logs.txt' } } } ``` ### 关键监控流程解析 | **阶段** | **监控指标** | **技术实现** | **关联引用** | |------------------|--------------------------|---------------------------------------------|------------| | **基础状态监控** | Pod Phase (Running) | `kubectl wait --for=condition=Ready` | - | | **就绪探针验证** | Readiness Probe状态 | JSONPath查询`.status.conditions.Ready` | [^1] | | **容器级检查** | 容器启动完成 | 检查`.status.containerStatuses.ready` | [^1] | | **日志收集** | 启动日志分析 | `kubectl logs` + Jenkins存档 | - | ### 最佳实践建议 1. **就绪探针配置**[^1] 在部署清单中必须配置Readiness Probe: ```yaml # deployment.yaml 片段 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 ``` 2. **渐进式超时设置** 不同环境设置差异化的超时策略: ```groovy // 根据环境动态调整超时 def TIMEOUT = (env.BRANCH_NAME == "production") ? 600 : 300 ``` 3. **实时通知集成** 添加Slack通知: ```groovy post { failure { slackSend channel: '#alerts', message: "🚨 部署失败: ${env.JOB_NAME} Build #${env.BUILD_NUMBER}\nPod启动超时" } } ``` ### 故障排查流程 ```mermaid graph TD A[部署完成] --> B{5分钟内Pod Running?} B -->|是| C{就绪探针通过?} B -->|否| D[检查资源配额/镜像拉取] C -->|是| E[流量接入] C -->|否| F[查看应用日志] D --> G[调整资源限制] F --> H[修复应用启动逻辑] G --> A H --> A ``` ### 注意事项 1. **服务依赖处理** 当应用依赖数据库等外部服务时,在就绪探针中添加依赖检查: ```yaml readinessProbe: exec: command: ["/bin/sh", "-c", "curl -s mysql:3306 && curl localhost:8080/health"] ``` 2. **滚动更新策略** 配置`maxSurge`和`maxUnavailable`防止服务中断: ```yaml strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 ``` 3. **版本追踪** 注入构建信息到Pod注解: ```yaml metadata: annotations: build: ${BUILD_NUMBER} commit: ${GIT_COMMIT} ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值