K8S 服务
服务器宕机导致K8S集群异常,部分nginx服务的pod启动失败
K8S版本:v1.12.5
问题1 nginx pod 启动失败,故障现象如下
nginx Pod 启动以后马上报错:
[root@jd-training-cpu-01 ~]# kubectl logs -n paisystem easydl-fe-nginx-79b94ff444-5swq9 -f
2024/04/11 12:42:05 [emerg] 6#6: host not found in upstream "easydl-gateway.paisystem:8099" in /etc/nginx/vhost/quickai.conf:2
nginx: [emerg] host not found in upstream "easydl-gateway.paisystem" in /etc/nginx/vhost/quickai.conf:2
提示 nginx 配置文件有问题,其实是这个 域名 easydl-gateway.paisystem ping不通了,后来发现是这个pod 和另外几个没起来的pod 正好部署在刚刚宕机的那个服务器上并且这个几个Pod还是需要在启动nginx的时候访问upstream里面的地址是否能通,不通就启动失败。
解决方法
因为宕机的那个节点iptables出问题了,导致部署到部署在那个节点上的服务出现问题,解决方法 清空iptables规则并重启docker服务,然后等docker正常以后再重启那几个pod问题解决
# 清空iptables规则
iptables -F
# 重启docker服务(docker服务重启会重新添加K8S集群用到的iptables规则)
systemctl restart docker
# 等docker服务正常以后,再次重启有问题的几个Pod服务即可正常
执行ansible脚本问题
在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识。
查看脚本文件是dos格式还是unix格式的几种办法。
(1)cat -A filename 从显示结果可以判断,dos格式的文件行尾为^M, u n i x 格 式 的 文 件 行 尾 为 ,unix格式的文件行尾为,unix格式的文件行尾为。
(2)od -t x1 filename 如果看到输出内容中存在0d 0a的字符,那么文件是dos格式,如果只有0a,则是unix格式。
(3)vi filename打开文件,执行 : set ff,如果文件为dos格式在显示为fileformat=dos,如果是unxi则显示为fileformat=unix。
解决方法:
(1)使用linux命令dos2unix filename,直接把文件转换为unix格式
(2)使用sed命令sed -i “s/\r//” filename 或者 sed -i “s/^M//” filename直接替换结尾符为
误操作执行chmod 777 补救办法
一旦误操作执行chmod -R 777 /*以后千万不要退出当前窗口!!! ,否则就执行去机房操作。
补救方法
# 找一台linux系统(尽量越干净越好),把系统的权限导出,然后再导入到本机。在好的机器上执行
getfacl -R / > ./linux.chmod.bak
# 然后通过ftp或者rz命令上传到要修复的机子上。执行
setfacl --restore=/root/linux.chmod.bak
# 执行这个后需要重启机器才会替换权限(真够麻烦,要是线上机器怎么可以随便重启,实际上这个时候机器是可以正常访问,只是安全方面没保证)