# 集群可用但节点状态为"不可用"如何解决？
当集群状态为"可用"，而集群中部分节点状态为"不可用"时，请参照本文提供的排查思路解决。
#### 节点不可用检测机制说明
Kubernetes 节点发送的心跳确定每个节点的可用性，并在检测到故障时采取行动。检测的机制和间隔时间详细说明请参见[心跳](https://kubernetes.io/zh/docs/concepts/architecture/nodes/#heartbeats)。
#### 排查思路
以下排查思路根据原因的出现概率进行排序，建议您从高频率原因往低频率原因排查，从而帮助您快速找到问题的原因。
如果解决完某个可能原因仍未解决问题，请继续排查其他可能原因。
- [排查项一：节点负载过高]
- [排查项二：弹性云服务器是否删除或故障]
- [排查项三：弹性云服务器能否登录]
- [排查项四：安全组是否被修改]
- [排查项五：检查安全组规则中是否包含Master和Node互通的安全组策略]
- [排查项六：检查磁盘是否异常]
- [排查项七：内部组件是否正常]
- [排查项八：DNS地址配置错误]
- [排查项九：检查节点中的vdb盘是否被删除]
- [排查项十：排查Docker服务是否正常]
- [排查项十一：包周期节点退订]
- [排查项十二：节点证书未到生效时间]
 
 #### 排查项一：节点负载过高
**问题描述：**
集群中节点连接异常，多个节点报写入错误，业务未受影响。
**问题定位：**
1. 登录CCE控制台，进入集群，在不可用节点所在行单击"监控"。
2. 单击"监控"页签顶部的"更多监控数据"，前往运维管理页面查看历史监控记录。 
   当节点cpu和内存负载过高时，会导致节点网络时延过高，或系统OOM，最终展示为不可用。
   
   
**解决方案：**
1. 建议迁移业务，减少节点中的工作负载数量，并对工作负载设置资源上限，降低节点CPU或内存等资源负载。
2. 将集群中对应的cce节点进行数据清理。
3. 限制每个容器的CPU和内存限制配额值。
4. 对集群进行节点扩容。
5. 您也可以重启节点，请至ECS控制台对节点进行重启，重启方法请参见[如何重启弹性云服务器？](https://support.huaweicloud.com/ecs_faq/ecs_faq_0412.html)。
6. 增加节点，将高内存使用的业务容器分开部署。
7. 重置节点，详情请参见[重置节点](https://support.huaweicloud.com/usermanual-cce/cce_10_0003.html)。
节点恢复为可用后，工作负载即可恢复正常。
 #### 排查项二：弹性云服务器是否删除或故障
1. 确认集群是否可用。 
   登录CCE控制台，确定集群是否可用。
   - 若集群非可用状态，如错误等，请参见[当集群状态为"不可用"时，如何排查解决？](https://support.huaweicloud.com/cce_faq/cce_faq_00039.html)。
   
   - 若集群状态为"运行中"，而集群中部分节点状态为"不可用"，请执行[2]。
   
   
   
   
2. 登录ECS控制台，查看对应的弹性云服务器状态。
   
   - 若弹性云服务器状态为"已删除"：请在CCE中删除对应节点，再重新创建节点。
   
   - 若弹性云服务器状态为"关机"或"冻结"：请先恢复弹性云服务器，约3分钟后集群节点可自行恢复。
   
   - 若弹性云服务器出现故障：请先重启弹性云服务器，恢复故障。
   
   - 若弹性云服务器状态为"可用"：请参考[排查项七：内部组件是否正常]登录弹性云服务器进行本地故障排查。
   
   
   
   
 
 #### 排查项三：弹性云服务器能否登录
1. 登录ECS控制台。
2. 确认界面显示的节点名称与虚机内的节点名称是否一致，并且密码或者密钥能否登录。 
   图1确认界面显示的名称   
   ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0207331202.png "点击放大")
   图2确认虚机内的节点名称和能否登录   
   ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0207331203.png "点击放大")
   如果节点名称不一致，并且密码和密钥均不能登录，说明是ECS创建虚机时的cloudinit初始化问题，临时规避可以尝试重启节点，之后再提单给ECS确认问题根因。
   
   
 
 #### 排查项四：安全组是否被修改
登录VPC控制台，在左侧栏目树中单击"访问控制 \> 安全组"，找到集群控制节点的安全组。
控制节点安全组名称为：集群名称-cce-**control** -编号。您可以通过**集群名称**查找安全组，再进一步在名称中区分"-cce-control-"字样，即为本集群安全组。
排查安全组中规则是否被修改，关于安全组的详细说明请参见[如何修改集群安全组规则配置](https://support.huaweicloud.com/cce_faq/cce_faq_00265.html)。
 #### 排查项五：检查安全组规则中是否包含Master和Node互通的安全组策略
请检查安全组规则中是否包含Master和Node互通的安全组策略。
已有集群添加节点时，如果子网对应的VPC新增了扩展网段且子网是扩展网段，要在控制节点安全组（即集群名称-cce-control-随机数）中添加如下三条安全组规则，以保证集群添加的节点功能可用（新建集群时如果VPC已经新增了扩展网段则不涉及此场景）。
关于安全组的详细说明请参见[如何修改集群安全组规则配置](https://support.huaweicloud.com/cce_faq/cce_faq_00265.html)。
![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0277932672.png "点击放大")
 #### 排查项六：检查磁盘是否异常
新建节点会给节点绑定一个100G的docker专用数据盘。若数据盘卸载或损坏，会导致docker服务异常，最终导致节点不可用。
图3集群新建节点时的数据盘   
![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0219910710.png "点击放大")
请检查节点挂载的数据盘是否已被卸载。若已卸载请重新挂载数据盘，再重启节点，节点可恢复。
图4磁盘检查   
![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0219910832.png "点击放大")
 #### 排查项七：内部组件是否正常
1. 登录异常节点，查看以下关键组件是否正常运行。
   - kubelet
   
   - kube-proxy
   
   - 网络组件：
     - yangtse：VPC网络模型或云原生网络2.0的集群使用该组件
     
     - canal：容器隧道网络模型的集群使用该组件
      
   
   - 运行时组件：docker或containerd
   
   - chronyd
   
   
   查看组件运行状态的命令如下，例如查看kubelet组件运行状态：
   ```
   systemctl status kubelet
   ```
   其中kubelet为组件名称，请根据其他名称进行替换。
   预期输出如下：
   ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0000002331517325.png "点击放大")
   
2. 若服务的组件状态不是Active，请重启对应的组件，重启命令请根据出错组件指定，如yangtse组件出错，则命令为：
   ```
   systemctl restart yangtse
   ```
   重启后再查看状态：
   ```
   systemctl status yangtse
   ```
   
3. 如果组件异常但重启后依然无法恢复节点状态，请提交工单联系客服进行处理。
 
 #### 排查项八：DNS地址配置错误
1. 登录节点，在日志/var/log/cloud-init-output.log中查看是否有域名解析失败相关的报错。 
   **cat /var/log/cloud-init-output.log \| grep resolv**
   如果回显包含如下内容则说明无法解析该域名。
   Could not resolve host: test.obs.cn-north-4.myhuaweicloud.com; Unknown error
   
   
2. 在节点上ping上一步无法解析的域名，确认节点上能否解析此域名。 
   **ping test.obs.cn-north-4.myhuaweicloud.com**
   - 如果不能，则说明DNS无法解析该地址。请确认/etc/resolv.conf文件中的DNS地址与配置在VPC的子网上的DNS地址是否一致，通常是由于此DNS地址配置错误，导致无法解析此域名。请修改VPC子网DNS为正确配置，然后重置节点。
   
   - 如果能，则说明DNS地址配置没有问题，请排查其他问题。
   
   
   
   
 
 #### 排查项九：检查节点中的vdb盘是否被删除
如果节点中的vdb盘被删除，可参考[此章节内容](https://support.huaweicloud.com/cce_faq/cce_faq_00263.html)恢复节点。
 #### 排查项十：排查Docker服务是否正常
1. 执行以下命令确认docker服务是否正在运行： 
   ```
   systemctl status docker
   ```
   ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0000001125874475.png "点击放大")
   若执行失败或服务状态非active，请确认docker运行失败原因，必要时可提交工单联系技术支持。
   
   
2. 执行以下命令检查当前节点上所有容器数量： 
   ```
   docker ps -a | wc -l
   ```
   若命令卡死、执行时间过长或异常容器数过多（1000以上），请确认外部是否存在重复不断地创删负载现象，在大量容器频繁创删过程中有可能出现大量异常容器且难以及时清理。
   在此场景下可考虑停止重复创删负载或采用更多的节点去分摊负载，一般等待一段时间后节点会恢复正常，必要情况可执行docker rm {container_id}手动清理异常容器。
   
   
 
 #### 排查项十一：包周期节点退订
节点退订后，订单处理需要一定时间。在此期间节点将处于不可用状态，预计5\~10分钟后自动清理该节点。
 #### 排查项十二：节点证书未到生效时间
当集群所在地区出现夏令时与冬令时转换时，在夏令时与冬令时的重叠时间，例如在凌晨2点申请创建节点，转变为冬令时后，时间变为凌晨1点，可能导致节点不可用。
**问题根因**
节点内证书的生效时间在未来，而不是当前时间，在证书未生效时，会导致节点对kube-apiserver的请求被拒绝。
**解决方案**
登录节点，执行以下命令查看证书。
```
ll /opt/cloud/cce/kubernetes/kubelet/pki
```
![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0000002086283630.png "点击放大")
文件名称即为证书创建时间，请确认证书创建时间是否晚于当前时间。
如果证书生效的时间晚于当前时间，您可以采取以下措施之一解决：
- 删除节点重新创建。
- 等待证书生效时间到达，节点会自动变成可用状态。
- 联系运维人员更新节点证书。
 
