写点什么

处理一次 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:003156

评论

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

【墨菲安全实验室】Zoom Desktop Client for Windows <5.14.5 权限升级漏洞(CVE-2023-36541)

墨菲安全

网络安全 安全 Zoom 漏洞 墨菲安全

IoTDB 小白“踩坑”心得:入门安装部署篇

Apache IoTDB

强劲实力闪耀榜单,智领云连续四年入选“中国大数据50强”

智领云科技

云原生大数据平台 智领云 云原生K8s大数据平台 大数据产业生态大会

龙智Atlassian认证专家、Perforce技术专家将于ACT汽车电子与软件技术周带来主题演讲,分享嵌入式开发中的最佳实践与工具链构建

龙智—DevSecOps解决方案

汽车电子 ACT汽车电子与软件技术周

【墨菲安全实验室】Microsoft Exchange Server 远程代码执行漏洞(CVE-2023-38182)

墨菲安全

网络安全 安全 漏洞 Microsoft Exchange

【墨菲安全实验室】Microsoft Teams 远程代码执行漏洞 (CVE-2023-29330)

墨菲安全

安全 漏洞 网络安全、 Microsoft Teams

【墨菲安全实验室】Microsoft Office Visio 远程执行代码漏洞(CVE-2023-36865)

墨菲安全

网络安全 安全 漏洞 Microsoft Office Visio

【低代码预研】通过低代码平台开发应用程序

互联网工科生

软件开发 低代码 应用开发 JNPF

百度、NVIDIA、Intel……各大厂商集结,共话文心与飞桨共享生态下的大模型训推部署创新实践计划

飞桨PaddlePaddle

人工智能 百度飞桨 硬件生态 WAVE SUMMIT

电动汽车安全概述

DevOps和数字孪生

电动汽车 汽车安全

openGauss数据库在CentOS上的安装实践

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

TypeChat全面指南:从核心概念到使用

星辰编程理财

AIGC AI编程 typechat

【墨菲安全实验室】WPS Office 存在代码执行漏洞

墨菲安全

网络安全 安全 漏洞 WPS Office

值得收藏!堪称神器的30个插件

Finovy Cloud

插件 渲染 建模 maya 3d建模

成都Go面试这么卷?卷王介绍:游戏行业 3年经验 20k+

王中阳Go

Go golang 面试题 面经 算法题

如何在Confluence上设置到期日提醒?Confluence到期日提醒插件重要更新发布,优化表格提醒,增加屏蔽提醒功能

龙智—DevSecOps解决方案

confluence插件

PP-ChatOCR:基于文心大模型的通用图像关键信息抽取利器,开发提效 50%!

飞桨PaddlePaddle

人工智能 百度飞桨

〔支付接入〕微信的 h5 支付和 jsapi 支付

江户川码农

微信支付 支付 经验分享 H5支付 jsapi支付

嵌入式软件开发为什么需要DevOps?

DevOps和数字孪生

DevOps 嵌入式软件

【华秋干货铺】电源PCB设计汇总

华秋电子

大型集团公司如何打破“信息孤岛”问题?

优秀

打破信息孤岛 消除信息孤岛 信息孤岛

甭提ChatGPT了,这个新的AI助手将永远改变人们的工作方式

互联网工科生

人工智能 AI 机器人

ISO 21434解析:汽车软件开发者的合规实践与指南

龙智—DevSecOps解决方案

汽车电子

【墨菲安全实验室】Apache Traffic Server Range 标头验证不当(CVE-2023-33934)

墨菲安全

Apache 网络安全 安全

确保数据一致性:单一可信数据源(SSOT)的概念与5个应用示例

龙智—DevSecOps解决方案

ssot single source

巧用Maya轴心操作小技巧,工作事半功倍!

3DCAT实时渲染

maya制作技巧 3D软件教程

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