公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

自建的 K8s 集群的坑不少, 尤其是到了 Node 数量越来越多之后, 问题也逐渐显露了出来, 博客主要介绍我们使用flannel之后遇到的两个问题以及解决方案, 问题其实不严重, 只是涉及到了底层的结构, 改动时候要小心.

问题 1 flannel 的 OOM 问题

官方给出的配置

下面这张图是官方的配置, 可以看到, 默认的资源设置仅给定了 50M 内存

kubectl -n kube-system describe ds kube-flannel-ds-amd64Limits:cpu:     100mmemory:  50MiRequests:cpu:     100mmemory:  50Mi

我们遇到的问题

当我们的机器数量超过 100 个以后, flannel 会以 OOM 的形式一直挂掉..

Feb  9 04:52:44  kernel: [37630249.323630] Memory cgroup out of memory: Kill process 33838 (flanneld) score 1653 or sacrifice child

通过Prometheus采集到的数据也可以看到, 容器的内存使用情况很不乐观:

也没什么好的解决方案, 只能调整资源限制了.

问题 2 flannel 指定网卡问题

问题背景

因为我们使用的机器比较混杂, 机器的网卡也各不相同, 在开始搭建集群时就遇到了下面的问题.

> 我们虚拟机中的网卡, 仅有`10`开头的内网地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP group default qlen 1000link/ether 52:xx:xx:xx:77:0c brd ff:ff:ff:ff:ff:ffinet 10.xxx.xxx.xxx/26 brd 10.xxx.xxx.xxx scope global eth0valid_lft forever preferred_lft forever> 物理机中的网卡, 既有`59`开头的公网地址, 也有`10`开头的内网地址, 并且网卡名为eth1
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 8c:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ffinet 59.xxx.xxx.xxx/24 brd 59.xxx.xxx.xx scope global eth0valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 8c:xx:xx:xx:xx:38 brd ff:ff:ff:ff:ff:ffinet 10.xxx.xxx.xxx/24 brd 10.xxx.xxx.xxx scope global eth1valid_lft forever preferred_lft forever

这样带来的问题就是 flannel 通信问题, 如果多个网卡, 且启动时未指定, flannel 会找一个缺省的网卡, 对于虚拟机来讲没有关系, 但是对于物理机, flannel 会找到 eth0 这个外网网卡, flannel 使用错误的网卡发送数据, 抓包的数据可以看出 flannel 使用了公网的网卡发送内网数据, 会被交换机丢弃, 具体图片就不贴了, IP 属于公司机密.

具体的修改方法是确保 flannel 使用了正确的网卡, 需要在启动时指定参数--iface--iface-regex: 我们的虚拟机数量少, 物理机数量多. 除了eth1, 还有bond1这种网卡名, 因此针对虚拟机, 统一将其eth0改名变成eth1, 而后指定了-iface-regex=eth1|bond1这样的配置, 对于后续增加物理机更友好.

问题到这里似乎就结束了, 但是随着 flannel 经常发生 OOM 重启, 暴露了我们的设置问题.

我们发现 flannel OOM 后无法正常重启

NAME                                                    READY   STATUS             RESTARTS   AGE     IP               NODE                                 NOMINATED NODE   READINESS GATES
kube-flannel-ds-amd64-54c5p                             0/1     CrashLoopBackOff   1604       516d    10.xx.xx.xx xxxxx         <none>           <none>
kube-flannel-ds-amd64-cmczh                             0/1     CrashLoopBackOff   89         388d    10.xx.xx.xx yyyyy         <none>           <none>

为什么一开始没出现, 但是重启又会发生呢, 问题出在了正则表达式上. K8s 在机器上启动容器时, 会创建虚拟的网卡. 这些网卡的名字类似veth17f90f70@if3, 这样网卡名称的也会被正则表达式匹配到, 导致 flannel 无法启动, 临时的解决方案就是把机器上的容器移走, vethxxx网卡会自动删除, flannel 也就自动恢复了.

当然根本的解决方案是修改正则配置: - -iface-regex="^(bond1|eth1)$" 使 flannel 更加精准的匹配网卡名称.

flannel 配置更新与验证

更新准备

因为不太了解 flannel 是否处理流量, 更新 flannel 时有点害怕, 直到看到了这里的架构.

flannel 的功能主要是负责机器上路由表的修改, 也就是说, 只要不增删机器, flannel 挂掉也没关系, 因为路由表不需要修改.

更新

我们有 100 多台节点, 整个集群更新过程大概持续了 1 个多小时, 更新过程中服务完全正常.

验证可用性

内存使用情况:

为了验证 flannel 是否可用, 我们将一台 node 删除, 观察到其他机器上的路由表也同步进行了修改.

总结

  1. 问题出现不可怕, 重要的是加好监控及时报警, 我们之前一直对 kube-system 的监控没有做到很好, flannel 一直启动不成功的问题是我检查时发现的,

  2. 使用别人提供的 yaml 文件前, 要注意下资源设置的, 类似 Prometheus 也有这种问题的, 它对内存的要求很高

  3. 预算充足就不要自建集群了, 有不少运维问题的, 万一出现一个解决不了的就很麻烦, 类似上次那篇文章: 记一次 Kubernetes 机器内核问题排查[1]

希望我们的经验能帮助到使用 K8s 的各位读者.

引用链接

[1]

记一次 Kubernetes 机器内核问题排查: https://corvo.myseu.cn/2021/03/21/2021-03-21-记一次kubernetes机器内核问题的排查/

原文链接:https://corvo.myseu.cn/2022/02/18/2022-02-18-%E8%AE%B0%E6%88%91%E4%BB%ACK8s%E9%9B%86%E7%BE%A4%E4%B8%ADflannel%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%A4%E4%B8%AA%E9%97%AE%E9%A2%98/

本文转载自:「云原生实验室」,原文:https://tinyurl.com/mr2uhtf3,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

你可能还喜欢

点击下方图片即可阅读

探秘 VMware Tanzu Kubernetes 发行版


点击上方图片,『美团|饿了么』外卖红包天天免费领

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

两个超实用的 Kubernetes 集群中 Flannel 故障排除案例相关推荐

  1. 在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)

    作者 | Addo Zhang 来源 | 云原生指北 在上一篇<在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(上)>中,我们使用 MetalLB 的 ...

  2. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...

  3. 从外部访问Kubernetes集群中的应用

    https://zhaohuabing.com/2017/11/28/access-application-from-outside/ 前言 我们知道,kubernetes的Cluster Netwo ...

  4. 如何调试Kubernetes集群中的网络延迟问题

    本文深入研究和解决了 Kubernetes 平台上的服务零星延迟问题,就在不久前我也遇到了类似的问题,看似是玄学事件,刚开始归结于网络链路抖动,一段时间后依然存在,虽然影响都是 P99.99 以后的数 ...

  5. 在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)- BGP

    在上一篇<在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(上)>中,我们使用 MetalLB 的 Layer2 模式作为 LoadBalancer 的 ...

  6. Kubernetes集群中部署Node节点

    Kubernetes集群中的Node节点部署 kubernetes的Node节点包含如下组件: flanneld docker kubelet kube-proxy 环境变量 需要的变量. $ # 替 ...

  7. 调试Kubernetes集群中的网络停顿问题

    调试Kubernetes集群中的网络停顿问题 在过去几年,Kubernetes在GitHub已经成为标准的部署模式.目前在GitHub,我们在Kubernetes上运行着海量的面向内部团队以及面向C端 ...

  8. 在Serverless Kubernetes集群中轻松运行Argo Workflow

    导读 Argo是一个基于kubernetes实现的一个Workflow(工作流)开源工具,基于kubernetes的调度能力实现了工作流的控制和任务的运行. 目前阿里云容器服务ACK集群中已经支持工作 ...

  9. K8s——kubernetes集群中ceph集群使用【下】

    kubernetes集群中ceph集群使用 一:CephFS 创建和使用 CephFS 允许用户挂载一个兼容posix的共享目录到多个主机,该存储和NFS共享存储以及CIFS共享目录相似 1.file ...

最新文章

  1. jupyter notebook用法积累(快捷键)
  2. 用Lambda武装你的Java: 集合转换
  3. Quartz1.X中CronTrigger第一次启动的问题
  4. BZOJ 1047 理想的正方形(单调队列)
  5. Difference of Deep linear/ no linear neural networks
  6. 华为服务器故障灯不开机_华为服务器日常维护及故障处理介绍V.ppt
  7. ubuntu下使用ppa安装codeblocks集成开发环境
  8. C语言-输入十进制数转换为二进制数
  9. php windows 网络流量,PHP系统流量分析的程序
  10. 在Filfter中使用注解了spring 的bean,报javax.naming.NamingException: Cannot create resource instance...
  11. 维纳滤波的详细讲解(同为小白,相互取暖)
  12. 如何在 Mac 上的“查找”中抹掉设备?
  13. Enolsoft PDF Converter with OCR激活版
  14. photoshop基础视频教程 [4G]
  15. 【Spring Boot】——集成JSON工具
  16. 嵩天《Python网络爬虫与信息提取》实例3:淘宝商品比价定向爬虫
  17. 菜单栏、工具栏、状态栏——QT
  18. 燕过留声:由 Activity 和 Fragment 的通信方法想到的【WIP】
  19. JDBC Statements, PreparedStatement和CallableStatement语句
  20. 计算机科学中的数学(一)

热门文章

  1. Java开发常用词汇表
  2. 路径算法:遗传算法 (Genetic Algorithm, GA)
  3. 【开工】知道创宇网络安全线上服务指南
  4. java上传微博图床_php上传图片到微博图床
  5. 「ZJOI2009」多米诺骨牌
  6. 通过SqlDbx导出*.sql,然后倒入到SQLServer2005
  7. 论坛php 图片上传,Discuz! X3 论坛文件图片上传尺寸:小于2M的修改方法
  8. 微信公众号常见问题:
  9. 计算机硬盘加密的几种方法,对于移动硬盘加密方法 你了解多少种呢?
  10. SpringCloud 微服务(一)