[转帖]k8s-mtu设置不当引发的线上故障

k8s,mtu,设置,不当,引发,故障 · 浏览次数 : 0

小编点评

## 问题分析总结: **问题1:operator卡死无响应** * 由于无法获取events时间,无法更新cr信息。 * 仔细分析etcd日志发现一切正常。 * 通过测试修改cr信息再运行,发现正常运行。 * 问题原因找到了:calico启用tunnel模式,导致1450大小的数据包无法正常封装和发送。 **解决方案:** 1. **更改物理节点mtu值大小**。 2. **修改calico配置mtu值大小**为物理节点mtu-20。 **其他建议:** * 可以记录事件日志,以便更好地分析问题。 * 可以使用 `kubectl logs` 命令查看 operator 的日志。 * 可以使用 `kubectl describe pod -n paasconsul-propaas` 命令查看容器状态,以便更直观地了解问题。

正文

https://www.cnblogs.com/zisefeizhu/p/16611626.html

 

背景

在部署新的paas平台线上环境时,突发consul和es中间件无法创建。

排查过程

以consul

通过查询k8s集群中pod状态发现原来3pod的consul集群,其中2个pod一直重启。
# kubectl get pods -n paasconsul-propaas
通过describe查看pod信息,发现是liveness失败。
# kubectl describe pods -n paasconsul-propaas
查看liveness调用的是health-check的二进制文件,经过分析源码发现这个二进制文件的作用为连接本地consul节点,查看当前节点状态。现在查看集群状态错误。此时怀疑consul集群配置出现问题

通过查看operator的log发现集群并没有报错。并且打印有副本集配置完成的日志出现在最后一行。但是后续一直没有日志打印,此时怀疑是operator没有收到events事件。

为了验证events事件没有获取到,通过修改cr文件的cpu和内存参数,想要触发新的更新event。结果不出意外,operator并没有触发更新操作,日志并无新增,节点状态并没有改变

看到operator无任何响应,怀疑其已经卡死,为了验证此想法,又从paas平台创建一个集群,发现出现新日志,后续又到副本集配置完成日志打印,然后卡死。判断operator状态存活正常,只是对更新cr信息无响应。

问题分析

针对无法更新cr的状态无法获取events时间。开始分析

怀疑etcd写入失败,通过查看etcd日志发现一切正常。(❎)

想起之前遇见的pod名字受DNS Label Names 63位长度限制,怀疑其cr是否也存在其问题。通过将原cr的yaml信息保留下来,改其名称再运行。结果发现其正常运行。(✅)

问题处理

为什么名称长度限制会导致operator卡死无响应?

这时候想到了tcp的mtu设置。虚拟机mtu和容器mtu不匹配将会导致网络不通。

因为当前k8s集群采用的是IP-IN-IP协议,此协议可以解决掉k8s生产扩容时,不会引起新老主机不通问题。

# 查看物理节点mtu:
netstat -i
# 发现其物理节点mtu值为1450

# 查看calico配置的mtu参数
kubectl get configmap/cali-config -n kube-system | grep "veth_mtu"
# 发现其mtu值也为1450
此时问题原因找到,calico启用tunnel模式,因此经过tunnel会封装一个新的20字节的ip包头,所以当发送大量数据时,calico生成的1450大小的数据包再加上20大小的ip包头为1470字节的包。
本地网卡转发calico通讯数据包1470,将失败。

可以通过两种方式解决此问题。1、更改物理节点mtu值大小。2.修改calicomtu值大小为 物理节点mtu-20。
推荐使用第二种

kubectl patch configmap/calico-config -n kube-system --type merge -p '{"data":{"veth_mtu": "1430"}}
根据实际需要调整所在k8s node节点的 eth0或tunl0的mtu,需确保tunl0的mtu比eth0的mtu少20。

与[转帖]k8s-mtu设置不当引发的线上故障相似的内容:

[转帖]k8s-mtu设置不当引发的线上故障

https://www.cnblogs.com/zisefeizhu/p/16611626.html 背景 在部署新的paas平台线上环境时,突发consul和es中间件无法创建。 排查过程 以consul 通过查询k8s集群中pod状态发现原来3pod的consul集群,其中2个pod一直重启。

[转帖]k8s发布Spring cloud+eureka架构服务优雅启动停止方案

本文转载自昆仑枫的简书https://www.jianshu.com/p/6d393cbb694a Spring cloud+eureka是目前微服务主流解决方案之一,kubernetes则是广泛应用的发布工具,两者结合使用很常见。而两者结合时如何优雅启停从而实现无感发布很关键。下面将从不做特殊处理

[转帖]K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

https://www.cnblogs.com/cheyunhua/p/15619317.html 一、Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序

[转帖]k8s部署有状态应用redis-cluster集群踩坑总结

https://segmentfault.com/a/1190000039196137 redis-cluster集群的部署网上一堆,用k8s部署也不在少数,但都是抄来抄去,问题不少,实际操作分享出来的还是太少。 1、redis启动配置文件,使用CofigMap来管理比较方便,redis-confi

[转帖]K8S集群内部 无持久化Redis单节点配置文件

K8S集群内部 无持久化Redis单节点配置文件 apiVersion: apps/v1 kind: Deployment metadata: name: redis-deploy spec: selector: matchLabels: prod: redis replicas: 1 templa

[转帖]k8s证书永不过期

https://www.cnblogs.com/fengzi7314/p/15909220.html 第一步,在github上下载对应的版本,我的是1.22版本,所以选的是1.22版本 第二步,下载到本地解压 第三步,进入目录编辑文件,修改为100年 cd kubernetes-1.22.0/ vi

[转帖]k8s之udp丢包问题

https://www.jianshu.com/p/6a5faee4cc65 image.png 测试仪发送某种类型的报文进行性能测试,报文目的mac为VF的mac。对于发出去的每个报文,必须在3s内收到响应,否则认为丢包,会重新发送一次,此时会有retransmit的统计。 pod A有两个网卡,

[转帖]k8s实践指南-排错案例-tcp_tw_recycle 引发丢包

https://www.oomspot.com/post/k8sshijianzhinanpaicuoanlitcptwrecycleyinfadiubao tcp_tw_recycle 引发丢包 tcp_tw_recycle 这个内核参数用来快速回收 TIME_WAIT 连接,不过如果在 NAT

[转帖]k8s学习: kubeconfig文件详解

1.什么是kubeconfig文件 用于配置集群访问的文件称为kubeconfig文件,这是引用配置文件的常用方法,.但并不是说有一个名为ubeconfi的文件。用于配置集群访问信息的文件叫作 kubeconfig 文件,在开启了 TLS 的集群中,每次与集群交互时都需要身份认证,生产环境一般使用证

[转帖]k8s 修改 pod 内容器内核参数

https://www.cnblogs.com/leffss/p/14832023.html 容器的本质是一个进程,共享宿主机的内核。原以为修改了宿主机的内核参数容器中也会改,但实际上并不是这样,容器的内核参数可以和宿主机不同。 docker 修改内核参数 docker run -it --rm -