网站建设走无形资产,一站建设个人网站,如何构建一个成交型网站,云南昆明百度总代理文章目录1. 环境介绍2. 异常信息3. 分析问题3.1 kubernetes 健康检查3.1.1 存活探针3.1.2 就绪探针3.1.3 启动探针3.2 检测方法4. 解决办法1. 环境介绍
组件版本kubernetes1.24.2docker18.03.1-cecri-docker0.2.6
2. 异常信息 最近监测到 kubernetes 集群上 calico-node Pod 运…
文章目录1. 环境介绍2. 异常信息3. 分析问题3.1 kubernetes 健康检查3.1.1 存活探针3.1.2 就绪探针3.1.3 启动探针3.2 检测方法4. 解决办法1. 环境介绍
组件版本kubernetes1.24.2docker18.03.1-cecri-docker0.2.6
2. 异常信息 最近监测到 kubernetes 集群上 calico-node Pod 运行 2 天后就挂了重启 calico-node 所在的云主机节点后服务恢复正常但是过 2 天后又挂了。查看 calico-node 的事件信息错误提示如下所示
(combined from similar events): Readiness probe errored: rpc error: code Unknown
desc failed to exec in container: failed to create exec d926d9226559a6673c1dbb904262c...398387ad3b04420:
cannot exec in a stopped state: unknownkubernetes 提示 calico-node 就绪检测失败。
3. 分析问题
3.1 kubernetes 健康检查 Kubernetes 有三种常见的健康检查探针分别是
Liveness存活探针Readiness就绪探针Startup启动探针1.18版本后引入新功能
3.1.1 存活探针 kubelet 使用存活探针来确定什么时候要重启容器。 例如存活探针可以探测到应用死锁应用程序在运行但是无法继续执行后面的步骤情况。 重启这种状态下的容器有助于提高应用的可用性即使其中存在缺陷。
3.1.2 就绪探针 kubelet 使用就绪探针可以知道容器何时准备好接受请求流量当一个 Pod 内的所有容器都就绪时才能认为该 Pod 就绪。 这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。 若 Pod 尚未就绪会被从 Service 的负载均衡器中剔除。
3.1.3 启动探针 kubelet 使用启动探针来了解应用容器何时启动。 如果配置了这类探针你就可以控制容器在启动成功后再进行存活性和就绪态检查 确保这些存活、就绪探针不会影响应用的启动。 启动探针可以用于对慢启动容器进行存活性检测避免它们在启动运行之前就被杀掉。
3.2 检测方法
httpGet向容器内服务发送HTTP请求进行健康检测exec :到容器执行命令进行健康检测tcpSocket向容器内服务发送SocketTCP协议请求进行健康检测grpc向容器内服务发送GRPC请求进行健康检测 本次kubernetes 集群的异常出现在就绪检测探针使用 exec 检测 calico-node Pod 异常calico-node 容器所在 Pod 上报还未就绪的信息并且不接受通过 Kubernetes Service 的流量导致 calico-node 一直处于 Running 状态但是 Ready 实例为 0造成服务不可用。 通过查阅相关文档资料猜测问题可能出现在容器运行时由于 kubernetes 推行 CRI Container Runtime Interface标准的容器运行时接口但是 docker 并不支持 CRI 标准接口但是 kubernetes 早期为了兼容 docker于是开发了 docker shim 来适配 docker 容器。 kubernetes 1.22 以后的版本中移除了 docker shim 相关代码导致了 kubernetes 1.22 以后的版本如果想要继续使用 docker 作为容器运行时需要额外的安装 cri-docker 服务。当前的 cri-docker 服务可能并不太稳定所以当服务运行几天后就会出现异常情况导致 kubelet 使用就绪探针对 Pod 进行健康检查时异常。
4. 解决办法 想要在 kubernetes 1.22 以后的集群中继续使用 docker可能需要继续等待开源社区做更多的优化所以建议切换容器运行时将 docker 容器运行时切换到 containerd。containerd 实际上也是 docker 共享给开源社区的一款非常优秀的容器运行时并且 docker 本身也是基于 containerd 构建的更高层次应用的容器服务。 docker 切换到 containerd 的操作步骤可参考kubernetes 将容器运行时从docker升级到containerd。经过持续多天的观测发现之前每隔2天就会异常的就绪探针报错问题没有复现初步判断之前的猜测是对的所以在生产环境中尝试最新版本的 kubernetes 有一定的风险升级需要谨慎升级之前在测试环境中做持续性的观察。