k8s deployment服务回滚,设置节点为不可调度

本文介绍了如何在Kubernetes中使用服务回滚机制来平滑升级Deployment,包括创建新版本、查看revision历史、回退到特定版本以及设置节点为不可调度。通过kubectl命令展示了具体操作过程。

服务回滚

通过滚动升级的策略可以平滑的升级Deployment,若升级出现问题,需要最快且最好的方式回退到上一次能够提供正常工作的版本。为此K8S提供了回滚机制。

revision:更新应用时,K8S都会记录当前的版本号,即为revision,当升级出现问题时,可通过回滚到某个特定的revision,默认配置下,K8S只会保留最近的几个revision,可以通过Deployment配置文件中的spec.revisionHistoryLimit属性增加revision数量,默认是10。
 

查看revision
kubectl -n caiwugx rollout history deploy myblog
 
回滚到对应revision
kubectl -n caiwugx rollout undo deploy myblog --to-revision=1

记录回滚:

$ kubectl apply -f deploy-myblog.yaml --record
 
$ kubectl -n caiwugx set image deploy myblog myblog=172.21.51.166:5000/myblog:v2 --record=true
 

查看deployment更新历史:

$ kubectl -n caiwugx rollout history deploy myblog
deployment.extensions/myblog
REVISION  CHANGE-CAUSE
1         kubectl create --filename=deploy-myblog.yaml --record=true
2         kubectl set image deploy myblog myblog=172.21.51.166:5000/demo/myblog:v1 --record=true
 

回滚到具体的REVISION

$ kubectl -n caiwugx rollout undo deploy myblog --to-revision=1
deployment.extensions/myblog rolled back

二、设置节点为不可调度(pod 将不再运行在以下节点)

kubectl taint node 10.241.x.x  10.241.x.x  10.241.x.x  key=value:NoSchedule

查看pod的状态

kubectl -n caiwugx  get pod -A  #查看pod的状态

<think>好的,我现在要帮用户解决Kubernetes Deployment显示0/1 nodes的问题。首先,我得回忆一下常见的调度失败原因。可能的问题点包括节点选择器不匹配、资源不足、污点与容忍度设置节点状态问题等等。 用户提到节点选择器的故障排查,所以首先应该检查Deployment的nodeSelector配置是否正确。比如,Pod的节点选择器是否与节点的标签匹配。如果节点没有正确的标签,调度器就找不到合适的节点,导致Pod无法调度。这时候需要检查节点的标签,使用kubectl get nodes --show-labels查看,然后对比Deployment中spec.template.spec.nodeSelector里的标签是否匹配。 接下来,资源不足也是一个常见原因。比如节点CPU或内存不足,调度器无法分配资源给Pod。这时候需要检查节点的资源使用情况,使用kubectl describe node <节点名称>查看可分配资源,同时检查Pod的资源请求是否合理,是否超过了节点剩余资源。如果资源不足,可能需要扩容节点或者调整Pod的资源请求。 另外,污点和容忍度的问题也不能忽视。如果节点有污点,而Pod没有相应的容忍度,Pod就不会被调度到该节点。需要检查节点的污点设置,使用kubectl describe node <节点名称> | grep Taints,然后在Pod的配置中添加对应的容忍度。 节点状态是否正常也很重要。比如节点是否处于Ready状态,有没有被标记为不可调度(cordon)。可以通过kubectl get nodes查看节点状态,如果节点状态是NotReady,可能需要检查节点的kubelet服务是否正常运行,或者网络是否有问题。 调度器本身的诊断信息也很关键。用户提到的引用[1]中提到了findNodesThatFitPod函数,调度器会生成诊断信息。当没有可用节点时,会返回FitError,其中包含诊断信息。这时候可以通过kubectl describe pod <pod名称>查看事件,通常会显示无法调度的原因,比如“0/1 nodes are available: 1 node(s) didn't match Pod's node selector.”或者资源不足的信息。 此外,用户可能没有正确查看Deployment的修订历史,引用[2]中的kubectl rollout history命令可以查看部署的历史版本,确认最近的更改是否有问题。比如,如果最近修改了节点选择器,可能导致调度失败,这时候回滚到之前的版本可能解决问题。 关于存储配置,引用[3]提到vSphereVolume的使用,如果Pod需要特定的存储卷,而节点无法提供,也可能导致调度失败。需要检查PersistentVolumeClaim是否绑定成功,存储类是否可用,以及节点是否满足存储的拓扑要求。 总结下来,排查步骤应该是: 1. 检查节点选择器标签是否正确。 2. 确认节点资源是否足够。 3. 查看节点污点和Pod容忍度是否匹配。 4. 检查节点状态是否正常。 5. 通过kubectl describe pod查看调度失败的具体原因。 6. 检查最近的部署变更,必要时回滚。 7. 确保存储配置正确无误。 在回答的时候需要分步骤详细说明,并且给出具体的命令示例,方便用户操作。同时,生成的相关问题要围绕用户可能的后续疑问,比如如何查看Pod事件、调整资源请求、处理污点等。</think>### Kubernetes Deployment显示0/1节点的排查步骤 当Deployment显示`0/1 nodes`时,通常表示Pod未能调度节点。以下是系统化的排查流程: --- #### 1. **检查节点选择器(NodeSelector)** - **问题表现**:Pod的`nodeSelector`与节点标签不匹配。 - **验证步骤**: ```bash # 查看节点的标签 kubectl get nodes --show-labels # 查看Deployment节点选择器配置 kubectl get deployment <deployment-name> -o yaml | grep nodeSelector -A 3 ``` - **解决方法**: - 若节点缺少标签:`kubectl label nodes <node-name> <key>=<value>` - 若Deployment配置错误:修正`spec.template.spec.nodeSelector`字段[^1]。 --- #### 2. **资源不足** - **问题表现**:节点CPU/内存不足以满足Pod请求。 - **验证步骤**: ```bash # 查看节点资源分配 kubectl describe node <node-name> | grep -A 10 "Allocated resources" # 查看Pod的资源请求 kubectl get pod <pod-name> -o yaml | grep resources -A 5 ``` - **解决方法**: - 调整Pod的`requests`值,或扩容节点。 --- #### 3. **污点(Taints)与容忍度(Tolerations)** - **问题表现**:节点设置了污点,但Pod未配置容忍度。 - **验证步骤**: ```bash # 查看节点污点 kubectl describe node <node-name> | grep Taints # 查看Pod的容忍度 kubectl get pod <pod-name> -o yaml | grep tolerations -A 5 ``` - **解决方法**: - 在Pod配置中添加对应的`tolerations`字段,或移除节点污点。 --- #### 4. **节点状态异常** - **问题表现**:节点处于`NotReady`或`SchedulingDisabled`状态。 - **验证步骤**: ```bash # 查看节点状态 kubectl get nodes ``` - **解决方法**: - 恢复节点网络或重启kubelet服务。 - 若节点被标记为不可调度:`kubectl uncordon <node-name>` --- #### 5. **调度器诊断** - **查看Pod事件**: ```bash kubectl describe pod <pod-name> | grep -A 20 "Events" ``` - **典型错误**: - `0/1 nodes are available: 1 node(s) didn't match Pod's node selector.` - `Insufficient cpu/memory` --- #### 6. **版本回滚(若近期有变更)** - 使用引用[2]中的历史版本查看命令: ```bash kubectl rollout history deployment/<deployment-name> kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-number> ``` --- #### 7. **存储配置问题(如使用vSphereVolume)** - 参考引用[3],检查存储类是否可用: ```bash kubectl get storageclass kubectl describe pvc <pvc-name> ``` --- ### 关键命令总结 | 目的 | 命令示例 | |------------------------|---------------------------------------------| | 查看节点标签 | `kubectl get nodes --show-labels` | | 查看Pod调度失败原因 | `kubectl describe pod <pod-name>` | | 检查节点资源分配 | `kubectl describe node <node-name>` | | 回滚Deployment | `kubectl rollout undo deployment/<name>` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值