写点什么

处理一次 k8s、calico 无法分配 podIP 的心路历程

  • 2020-10-22
  • 本文字数:2735 字

    阅读完需:约 9 分钟

处理一次k8s、calico无法分配podIP的心路历程

又一次偷偷化解了可能发生的重大事故。不想看过程的可以直接跳到末尾看处理方案。

一个网络错误

某天,上 kplcloud 构建一个测试应用,构建完成之后发现新 pod 一直启动失败,并且抛出了以下错误信息:


Failed create pod sandbox: rpc error: code = Unknown desc = NetworkPlugin cni failed to set up pod "xxxxxx-fc4cb949f-gpkm2_xxxxxxx" network: netplugin failed but error parsing its diagnostic message "": unexpected end of JSON input
复制代码


会 k8s 的运维同学不在,突然出问题了怎么办?


试着开始解决问题。


一、有没有可能是镜像拉取失败,开始找问题:


  1. 登录集群所有服务器查看空间是否占满(然而并没有占满)

  2. 查询集群所有服务器网络情况(也没有问题)

  3. 再启一个 pod 试试?(起不来)


这就尴尬了…,有没有可能是 calico 的问题?


二、查看服务器报错信息


尝试以下命令看服务器的报错信息:


$ journalctl -exf
复制代码


确实有一些错误信息:



这个错误太广泛了,继续尝试从其他地方找找问题。


此时已经开始在思考如何跑路的问题了…


要不尝试重启能否解决?


风险太大,不能冒险。虽然很多时候重启能解决大部分问题,但重起 docker、k8s 在这种情况下不是最佳选择。



继续搜刮日志,猜测是无法分配 IP 的问题,那目标转向 calico


从 calico-node 上面找问题


查询 ip 池是否用完。


使用 calicoamd 命令查询 calico 是否正常正常运行


$ calicoctl get ippools -o wideCIDR            NAT    IPIP172.20.0.0/16   true   false
$ calicoctl node status
复制代码



似乎是没啥问题。


开始场外求助…


无果



既然 calico-node 都运行正常,应该不会是 calico-etcd 的问题吧。

试试 calico-etcd

本着有疑问就查证试试的态度,下面开始对 calico-etcd 进行一顿骚操作。


为了减少代码量方便阅读,以下 etcdctl 所需要加的证书及 endpoints,就不一一添加了,大家参考一下就好:


ETCDCTL_API=3 etcdctl --cacert=/etc/etcd/ssl/ca.pem \--cert=/etc/etcd/ssl/etcd.pem \--key=/etc/etcd/ssl/etcd-key.pem \--endpoints=http://10.xx.xx.1:2379,http://10.xx.xx.2:2379,http://10.xx.xx.3:2379
复制代码


calico 并没有问题,试试 calico 所使用的 ETCD 是否正常,进入 calico-etcd 集群


$ ETCDCTL_API=3 etcdctl member listbde98346d77cfa1: name=node-1 peerURLs=http://10.xx.xx.1:2380 clientURLs=http://10.xx.xx.1:2379 isLeader=true299fcfbf514069ed: name=node-2 peerURLs=http://10.xx.xx.2:2380 clientURLs=http://10.xx.xx.2:2379 isLeader=false954e5cdb2d25c491: name=node-3 peerURLs=http://10.xx.xx.3:2380 clientURLs=http://10.xx.xx.3:2379 isLeader=false
复制代码


似乎集群也运行正常,get 数据也正常。


一切看起来都感觉是多么的正常,似乎没有什么毛病。


算了,算了,还是先写会儿简历吧,换换脑子。



那尝试向 ETCD 写入一条数据试试?


$ ETCDCTL_API=3 etcdctl put /hello world
Error: etcdserver: mvcc: database space exceeded
复制代码


✨报了一个错


Error: etcdserver: mvcc: database space exceeded ???



似乎是找到原因了,既然定位到问题所在,那接下来就好办了。(不用跑路了(⁎⁍̴̛ᴗ⁍̴̛⁎))把简历先放一放


感谢 google,我从 etcd 官网找到了一些线索及解决方案,后面我贴上官网介绍,先解决问题:


使用 etcdctl endpoint status 查询 etcd 各个节点的使用状态:


$ ETCDCTL_API=3 etcdctl endpoint statushttp://10.xx.xx.1:2379, 299fcfbf514069ed, 3.2.18, 2.1 GB, false, 7, 8701663http://10.xx.xx.2:2379, bde98346d77cfa1, 3.2.18, 2.1 GB, true, 7, 8701683http://10.xx.xx.3:2379, 954e5cdb2d25c491, 3.2.18, 2.1 GB, false, 7, 8701687
复制代码


上面可以看到集群空间已经使用了 2.1GB 了,这个值需要留意一下。


查询 etcd 是否有告警信息使用命令 etcdctl alarm list:


$ ETCDCTL_API=3 etcdctl alarm listmemberID:2999344297460918765 alarm:NOSPACE
复制代码


显示了一个 alerm:NOSPACE,这个表示没空间了,那是没什么空间呢?磁盘还是内存?先查询一下。



似乎磁盘、内存空间都足够的。从官网的信息了解到应该是 etcd 配额的问题,Etcd v3 的默认的 backend quota 2GB,也就是说 etcd 默认最大的配额是 2GB,如果超过了则无法再写入数据,要么把旧数据删除,要么把数据压缩了。


参考官方的解决方案


ETCD 官网参考:https://etcd.io/docs/v3.2.17/op-guide/maintenance/


  1. 获取 etcd 的旧版本号

  2. 压缩旧版本

  3. 整理碎片

  4. 关闭告警

  5. 测试数据是否可写入


回到 k8s 这边,删除那个失败的 pod,并查看是否可正常分配 ip。


一切正确,完美。


为了避免后续再出现类似问题,需要设置自动压缩,启动自动压缩功能需要在 etcd 启动参考上加上 xxxxx=1


https://skyao.gitbooks.io/learning-etcd3/content/documentation/op-guide/maintenance.html



etcd 默认不会自动 compact,需要设置启动参数,或者通过命令进行 compact,如果变更频繁建议设置,否则会导致空间和内存的浪费以及错误。Etcd v3 的默认的 backend quota 2GB,如果不 compact,boltdb 文件大小超过这个限制后,就会报错:”Error: etcdserver: mvcc: database space exceeded”,导致数据无法写入。


产生这么多垃圾数据的原因就是因为频繁的调度,我们集群有大量 CronJob 在执行,并且执行的非常活跃,每次产生新的 Pod 都会被分配到 ip。有可能是因为 pod 时间太短或没有及时注销而导致 calico-etcd 产生了大量垃圾数据

尾巴


因 calico-etcd 集群的的使用配额满了,在创建 pod 时 calico 所分配的 IP 无法写入到 etcd 里,从而导致 pod 创建失败也就无法注册到 CoreDNS 了。


为了不踩坑,监控是非常重要的,我们有 etcd 集群的监控,却忽略了 etcd 配额的监控,幸运的是当时并没有应用重启动或升级,没有造成损失。


最后的建议就是,没事上去点点,说不定会有您意想不到的惊喜(惊吓)。




本文转载自公众号宜信技术学院(ID:CE_TECH)。


原文链接


处理一次k8s、calico无法分配podIP的心路历程


2020-10-22 14:003163

评论

发布
暂无评论
发现更多内容

全新HUAWEI MatePad 11.5发布:搭载华为教育中心,做更好的学习神器

最新动态

LeetCode题解:2648. 生成斐波那契数列,迭代+递归,超详细解析

Lee Chen

鸿蒙开发案例:打地鼠

zhongcx

AI 原生时代,更要上云:百度智能云云原生创新实践

百度Geek说

数据结构 - 散列表,三探之代码实现

不在线第一只蜗牛

数据结构

立足云南,面向“两亚”,翻开普惠算力新篇章

九章云极DataCanvas

如何成为一名优秀的程序员,进来看看

伤感汤姆布利柏

最大程度降低“去O”的迁移风险

NineData

数据库 复制 迁移 同步 NineData

老好人无法成为好的管理者

老张

团队管理 技术管理 绩效管理

通义灵码知识库问答增强:知识库构建与管理指南

阿里巴巴云原生

阿里云 云原生 通义灵码

跨平台的键鼠共享工具 synergy mac 中文激活版

Rose

实时特征框架的生产实践|得物技术

得物技术

flink 性能优化 数据平台 特征框架

从人员外包到测试工具、测试平台,提供全方位的测试解决方案~

霍格沃兹测试开发学社

ElevenLabs Voice Design:文本生成个性化语音;科学家用 AI 解读猪叫声背后情绪和压力丨RTE 开发者日报

声网

指标平台在企业数据管理中的定位及其如何与BI、数仓的协同工作?

Aloudata

数据分析 指标体系 指标平台 指标开发

能操控电脑的 Computer Use 究竟是什么?万能胶水、旧世界操作员,还是无所不在的智能?| 播客《编码人声》

声网

薅羊毛了!百万度算力免费申领活动狂欢继续!

九章云极DataCanvas

Alfred 5中文安装包 Mac 上的效率瑰宝!

Rose

知识管理系统是什么?

ServiceDesk_Plus

知识管理系统 知识管理软件

通义灵码知识库问答增强:知识库构建与管理指南

阿里云云效

阿里云 云原生 通义灵码

如何通过指标驱动研发体系建设

思码逸研发效能

DevOps 研发效能 效能度量 研发效能管理 思码逸

软件测试学习笔记丨Flask框架-请求与响应

测试人

flask 软件测试

CAD迷你看图 Mac破解版 v4.4.5免激活版

Rose

One Switch for Mac(系统功能快速开关工具) v1.33.1中文版

Rose

指标预警归因分析,及时发现业务问题,快速定位问题根因

Aloudata

数据分析 指标平台 指标开发

什么是无代码?无代码开发平台又是什么?

积木链小链

无代码 无代码平台

程序员提效的 10 个方法,建议收藏

秃头小帅oi

处理一次k8s、calico无法分配podIP的心路历程_软件工程_王聪_InfoQ精选文章