记 K8s 集群中 Flannel 遇到的两个问题

标签: dev | 发表时间:2022-03-05 00:00 | 作者:
出处:http://itindex.net/relian

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

问题 1 flannel 的 OOM 问题

官方给出的配置

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

  kubectl -n kube-system describe ds kube-flannel-ds-amd64   
    Limits:
      cpu:     100m
      memory:  50Mi
    Requests:
      cpu:     100m
      memory:  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 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:xx:xx:xx:77:0c brd ff:ff:ff:ff:ff:ff
    inet 10.xxx.xxx.xxx/26 brd 10.xxx.xxx.xxx scope global eth0
       valid_lft forever preferred_lft forever

> 物理机中的网卡, 既有`59`开头的公网地址, 也有`10`开头的内网地址, 并且网卡名为eth1
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 8c:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 59.xxx.xxx.xxx/24 brd 59.xxx.xxx.xx scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 8c:xx:xx:xx:xx:38 brd ff:ff:ff:ff:ff:ff
    inet 10.xxx.xxx.xxx/24 brd 10.xxx.xxx.xxx scope global eth1
       valid_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机器内核问题的排查/

相关 [k8s 集群 flannel] 推荐:

记 K8s 集群中 Flannel 遇到的两个问题

- - IT瘾-dev
自建的 K8s 集群的坑不少, 尤其是到了 Node 数量越来越多之后, 问题也逐渐显露了出来, 博客主要介绍我们使用 flannel之后遇到的两个问题以及解决方案, 问题其实不严重, 只是涉及到了底层的结构, 改动时候要小心.. 问题 1 flannel 的 OOM 问题. 下面这张图是官方的配置, 可以看到, 默认的资源设置仅给定了 50M 内存.

K8s网络插件flannel与calico - 小雨淅淅o0 - 博客园

- -
Kubernetes的网络通信问题:. 容器间通信: 即同一个Pod内多个容器间通信,通常使用loopback来实现. Pod间通信: K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另一个Pod-IP. Pod与Service通信: 即PodIP去访问ClusterIP,当然,clusterIP实际上是IPVS 或 iptables规则的虚拟IP,是没有TCP/IP协议栈支持的.

k8s网络原理之flannel - 渡边彻 - 博客园

- -
首先当你创建一个k8s集群后一般会存在三种IP分别是,Pod IP,Node IP,Cluster IP. (这部分的知识我们在docker网络当中有详细的讲解,不了解的同学可以查看之前的微博. 那么不同Node节点下的Pod又是如何进行通信的呢. 本文重点要讲的flannel网络插件就是用来解决这个问题的.

k8s网络之Flannel网络 - 金色旭光 - 博客园

- -
一、k8s网络之设计与实现. 二、k8s网络之Flannel网络. 三、k8s网络之Calico网络. Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址. 在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配.

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

构建生产就绪的K8S集群的16点清单

- - SegmentFault 最新的文章
Kubernetes是用于构建高度可扩展系统的强大工具. 结果,许多公司已经开始或正在计划使用它来协调生产服务. 不幸的是,像大多数强大的技术一样,Kubernetes也很复杂. 我们整理了以下清单,以帮助你生产环境最佳实践Kubernetes. Kubernetes提供了一种编排容器化服务的方法,因此,如果您没有按顺序实践你的容器,那么集群一开始就不会处于良好状态.

Kubernetes(K8S)集群部署搭建图文教程(最全)

- -
Kubernetes 集群安装. Harbor采取私有的仓库去镜像使用. 第一步:Router软路由构建. 第二步:centos7安装 5台(自行安装). 复制这段内容后打开百度网盘手机App,操作更方便哦. 1、安装k8s的节点必须是大于1核心的CPU 2、安装节点的网络信息. 3、koolshare 软路由的默认面是koolshare.

基于 Ubuntu 20.04 部署 1.23版K8S 集群

- - 明哥教程
从今天开始,我将开始连载《图解 K8S》入门系列文章. 更多系列文章,可以微信搜索公众号: 写点代码的明哥,回复 k8s 获取全系列教程. 本篇是做为系列的第一篇文章,先来带大家一起搭建一个可用的 K8S 环境. K8S 环境的搭建,是很多想学习 K8S 的人止于在入门之外的第一道门槛,不少人在这一道关上就被直接被劝退了.

如何收集 Yarn/K8s 集群中的 Flink 任务日志?

- - zhisheng的博客
从一个小需求(任务异常或者失败时排查问题不便)出发,开始调研业界常见的解决方案进行解决我们的需求,接着有对应的代码实现和效果展示. 熟悉 Flink On Yarn 的应该知道 Flink 任务运行结束/失败后,只能去 Yarn UI 看到任务的 Jobmanager 日志,对于 TaskManager 日志这些是看不到的,这对于有时候想排查下任务失败的原因日志会比较困难(不过大多数任务挂掉的原因日志都会在 Jobmanager 存在).

从零开始在ubuntu上安装和使用k8s集群及报错解决

- - 行业应用 - ITeye博客
这几天在学习K8S的安装和使用,在此记录一下. 两小时Kubernetes(K8S)从懵圈到熟练——大型分布式集群环境捷径部署搭建_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili. 镜像+讲义+安装包,链接:https://pan.baidu.com/s/1qO697oBuR7TwQ2J8boI3EA 提取码:4mvs.