做记录,做记录呀做记录~
部分 k8s 环境下的故障处理说明:
-
问题 1:
- 【现象】:节点 NotReady,kubelet 日志显示:PLEG is not healthy
- 【分析】:CentOS 7.6 系统使用的 systemd-219-62.el7_6.6.x86_64 软件包存在缺陷,引发异常错误,
- 【解决】:更新 systemd 程序包至最新版本并重新运行 systemd 程序:
yum update -y systemd && systemctl daemon-reexec
-
问题 2:
- 【现象】:节点内核日志报错:nf_conntrack: table full, dropping packet
- 【分析】:linux 路由跟踪表满
- 【解决】:修改内核参数,在内存允许的情况下修改以下两项内核参数的值(以 8G 内存为例,这 2 个值和内存等比调整):hash 表/桶的大小(net.netfilter.nf_conntrack_buckets),修改为 65535;最大跟踪连接数(net.netfilter.nf_conntrack_max),修改为桶的的 4 倍,即:65535*4=262140
- 参考命令(以 net.netfilter.nf_conntrack_buckets 为例):
- 查看参数:
sysctl -a | grep net.netfilter.nf_conntrack_buckets
- 临时修改:
sysctl -w net.netfilter.nf_conntrack_buckets=65535 && sysctl -p
- 永久修改:编辑/etc/sysctl.conf,添加:net.netfilter.nf_conntrack_buckets=65535
- 查看参数:
- 参考命令(以 net.netfilter.nf_conntrack_buckets 为例):
-
问题 3:
- 【现象】:pod 卡在 Terminating 或者 ContainerCreating 状态
- 【分析】:查看 pod 所在 worker 节点的 docker 日志和 kubelet 日志,日志:”rpc error: code = DeadlineExceeded desc = context deadline exceeded”,也是 systemd 的低版本 bug(systemd 配置 PrivateTmp=true 在部分 linux 内核中会导致挂载点泄漏)
- 【解决】:更新 systemd 程序包至最新版本并重新运行 systemd 程序:
yum update -y systemd && systemctl daemon-reexec
- 【分析 2】:kubelet 日志显示:device or resource busy,系清理容器读写层挂载时失败,检查 docker 配置(MountFlags=slave,作用是:避免 docker 挂载点信息泄漏到其他 mnt 命名空间;live-restore=true,作用是:daemon 停止时保持容器继续运行。这两个参数同时配置的话在高版本 docker 中会导致容器删除失败;在低版本 docker 中会导致挂载点泄漏,进而导致 inode 打满或者容器 ID 复用等问题)
- 【解决】:关闭 MountFlags=slave 配置;
-
问题 4:
- 【现象】:频繁出现 Back-off restarting failed container 事件
- 【分析】:查看 pod 日志、分析 docker 启动脚本/命令,是否有常驻进程
- 【解决】:检查修正 Dockerfile;
-
问题 5:
- 【现象】:pod 偶尔存活检测失败,导致 Pod 重启,业务偶尔连接异常
- 【分析】:经排查经常出现此问题的 pod 位于同一主机,查看相关日志和内和参数发现,tcp_max_syn_backlog 为默认值 1024,如果短时间内并发新建 TCP 连接太多,SYN 队列就可能溢出,导致部分新连接无法建立
- 【解决】:将该内核参数设置为:
sysctl -w tcp_max_syn_backlog=8096 && sysctl -p
-
问题 6:
- 【现象】:使用 alipne 作为基础镜像的 golang 应用中/etc/hosts 自定义域名解析设置不生效
- 【分析】:alpine 不基于 glibc 实现,并且不包含 nsswitch.conf;在/etc/nsswitch.conf 文件不存在或者 hosts 的 source 未指定的情况下,如果操作系统是 linux,将使用 hostLookupDNSFiles 逻辑(先通过 dns 服务器来解析域名,然后再是文件解析)处理 DNS 解析请求
- 【解决】:dockerfile 中增加一行:
RUN echo "hosts: files dns" > /etc/nsswitch.conf