应急预案:敏捷PaaS版中terway-vlan在etcd中记录的IP与实际IP不一致的修复方法
1. 概述
本文主要介绍在敏捷PaaS版中,terway-vlan在etcd中记录的IP与实际IP不一致的修复方法。
1.1. 适用范围
- 专有云敏捷版
说明:适用于使用terway网络插件的版本。
1.2. 用户告知
- 适用平台:x86
- 授权级别:L2(二线技术支持工程师)
- 临时或固化方案:固化
- 操作复杂度:中
- 预估执行时长:30分钟
- 业务影响:否
应急处理时客户业务不可用,执行方案过程中需要阿里云技术支持协助变更。如果返回结果不符合预期或有任何报错,请及时联系阿里云技术支持,不要擅自处理。 - 风险等级:中
2. 问题描述
terway-vlan环境在某种情况下,可能会出现etcd中记录的IP和Pod实际使用的IP不一致的情况,这种情况可能会导致存在Pod使用了相同的IP,从而导致因IP冲突无法进行正常的网络通信。
3. 解决方案
3.1. 环境检查
查看集群组件以及节点状态
- 登录任意一台Master,使用root用户,执行以下命令,查看节点组件状态,确保组件都是Running状态。
kubectl get pod -n kube-system
系统显示类似如下。 - 执行以下命令,确保节点都是Ready状态。
kubectl get nodes
系统显示类似如下。
查看环境中重复的IP地址
执行以下命令,查看环境中重复的IP地址。输出结果中非Node节点的IP地址即为重复的Pod IP。
kubectl get pod --all-namespaces -o wide |grep -v NAME |egrep -v 'Comple' | awk '{print $7}' | sort -n | uniq -c | sort -n -k 1 -r | head -n 20
3.2. 实施步骤
在进行以下操作的时候先检查下有没有异常的Pod,输出结果中没有异常的Pod再进行下面的操作。
kubectl get pod --all-namespaces -o wide |grep -vE "(1/1|2/2|3/3|4/4|5/5|6/6|Com)"
请使用“查看在etcd中记录的IP与实际IP不一致的Pod脚本”,检查环境中存在问题的Pod。
- 如果Pod数量比较少,手动重启Pod即可。
说明:包括第脚本执行结果中有“pod %s not exists in etcd”输出的Pod,也需要重启。
- 如果Pod数量很多,则需要使用“自动订正IP脚本”修改etcd中的存储,运行脚本直至输出结果中
start..process
和end..process
中间没有任何其他内容输出即可。然后使用 “查看在etcd中记录IP跟实际IP不一致的Pod脚本”,检查环境中存在问题的Pod,手动重启Pod即可。
说明:包括第脚本执行结果中有“pod %s not exists in etcd”输出的Pod,也需要重启。
3.3. 结果验证
使用etcd中的IP检测脚本之后,发现无异常Pod输出。说明没有IP占用的情况。
4. 回滚方案
无需回滚,操作前的情况已是非正常状态。
5. 补充说明
查看在etcd中记录的IP与实际IP不一致的Pod脚本
执行脚本后会输出IP在etcd中的记录与实际IP不一致的Pod,每一行是POD_NAMESPACE/POD_NAME
的格式。
查看在etcd中记录IP跟实际IP不一致的Pod脚本.txt
自动订正IP的脚本
脚本执行思路如下:
- 扫描出状态为running的非hostnetwork Pod列表。
- 根据列表中所有Pod的Pod Name查看Pod在etcd中的记录,查看IP记录是否正确,把不正确的IP记录,存到内存中。
- 根据列表中所有Pod的Pod IP查看Pod在etcd中的记录,如果IP记录不存在,记录实际的Pod Name,返回一个数组。
- 如果返回的数组为空,则退出程序。
- 如果返回的数组不为空,则遍历数组,对每个元素,循环完之后回到第1步。根据元素的Pod Name,找到第2步中记录的对应Pod Name相同的IP,然后修改该记录的Key和Value,修改成Pod实际使用的IP。
自动订正IP脚本.txt脚本文件中的变量说明如下:
- etcd_endpoint_ip变量需要修改成对应环境中任意etcd的节点IP,ip_whitelist中的元素是已经有两个Pod同时使用了的IP列表。
- cidr_with_sharp是容器网段的cidr,但是斜杠(/)符号需要替换成井号(#)。