(k8s)Flannel Error问题解决!

news2025/1/9 21:37:58

1.问题描述

书接上回,我们在解决kubectl不断重启的时候引入了Flannel 网络插件,但是一上来就报错,

 2.问题解决

自己的思路:照例开始检查

1.先检查一下目前Flannel的pod

kubectl get pods --all-namespaces

2.检查 Flannel的pod的日志

kubectl describe pod kube-flannel-ds-4d456 -n kube-flannel

kubectl logs kube-flannel-ds-4d456 -c kube-flannel -n kube-flannel

 找到了主要的问题所在,提示我们Error registering network: failed to acquire lease: node "master" pod cidr not assigned

3.分析问题

Error registering network: failed to acquire lease: node "master" pod cidr not assigned

这表明 Kubernetes 的控制平面(包括 kube-controller-manager)无法为节点分配 Pod CIDR。需要确保 kube-controller-manager 能够获取到正确的 Pod CIDR。

解决方法

1. 为 kube-controller-manager 设置 Pod CIDR

你可以通过编辑 kube-controller-managerkubeadm 配置来确保 Pod CIDR 正确设置。具体步骤如下:

  1. 检查 kubeadm 配置:确保在 kubeadm 初始化时已经指定了 --pod-network-cidr 参数。如果没有指定 Pod CIDR,可以通过以下方式为 kubeadm 初始化指定该参数:

    kubeadm init --pod-network-cidr=10.244.0.0/16

    这会为 Kubernetes 集群中的 Pod 分配一个 CIDR 范围。根据网络环境,CIDR 范围可能会有所不同。

  2. 修改 Kubernetes 控制平面节点的配置: 如果集群已经初始化并运行,可以手动编辑 kube-controller-manager 配置,使其能够与网络插件正确交互。

    通过以下方式编辑 kube-controller-manager.yaml 文件:

    • 找到 --allocate-node-cidrs=true 这一项,确保它被启用。
    • 如果没有,手动在 command 中添加 --allocate-node-cidrs=true--cluster-cidr=10.244.0.0/16(与网络插件的配置一致)。

    修改后的部分应该类似于:

    - --allocate-node-cidrs=true  - --cluster-cidr=10.244.0.0/16

        在这里加上我们需要的两段话,重启,成功!!!!!!!!!!!

4.总结

  1. 确保 kube-controller-manager 的配置中指定了正确的 --cluster-cidr
  2. 检查 kube-flannel 配置,确保其与 kube-controller-manager 中的 CIDR 匹配。
  3. 验证节点的 Pod CIDR 是否已经正确分配。
  4. 如果仍然存在问题,尝试重新初始化 kubeadm 集群,确保指定了 --pod-network-cidr 参数。

5.没有提到的地方

在此之前我们还尝试了一下几个地方,但一开始并没有奏效

这些命令主要是与 Linux 网络配置Kubernetes 集群中的网络流量 管理相关的。它们涉及到桥接网络、IP 转发和防火墙规则。下面是每个命令的详细解释:

1. modprobe br_netfilter

  • 这条命令加载了 br_netfilter 模块。br_netfilter 是一个内核模块,用于启用 Linux 内核对桥接网络接口的过滤能力。它允许在桥接网络中处理 IP 和 IP6 的防火墙规则,通常用于 Docker 和 Kubernetes 等容器化平台。
  • 启用该模块后,容器之间的网络流量可以通过 iptables 进行过滤。

2. lsmod | grep br_netfilter

  • lsmod 命令列出当前加载的所有内核模块。grep br_netfilter 是通过管道将输出过滤,只显示 br_netfilter 模块的状态。
  • 如果该模块已成功加载,你会看到类似于 br_netfilter 32768 0 的输出,表示 br_netfilter 模块已加载并且未被其他模块使用。

3. sysctl -w net.bridge.bridge-nf-call-iptables=1

  • sysctl 用于查看或修改内核参数。这个命令修改了 net.bridge.bridge-nf-call-iptables 参数,将其设置为 1,表示启用桥接网络接口(例如 Docker 或 Kubernetes 使用的桥接网络)上数据包的 iptables 过滤。
  • 默认情况下,Linux 桥接网络会直接转发数据包,不经过防火墙规则。通过启用 bridge-nf-call-iptables,数据包会先通过 iptables 进行过滤。

4. sysctl -w net.bridge.bridge-nf-call-ip6tables=1

  • 这条命令与上面的命令类似,只是它启用了对 IPv6 数据包的过滤。它会让桥接网络上的 IPv6 数据包也经过 ip6tables(IPv6 防火墙)进行处理。

5. sysctl -w net.ipv4.ip_forward=1

  • 这个命令启用了 IP 转发(ip_forward),即允许系统转发通过它的网络接口接收到的 IP 数据包。这对于路由器、网关以及容器环境中的节点间通信(比如 Kubernetes 集群中的 Pod 之间)是必须的。
  • 启用 IP 转发后,系统会将网络包从一个接口转发到另一个接口,从而实现容器或虚拟机之间的通信。

6. sysctl -p

  • 这个命令会加载和应用 /etc/sysctl.conf 文件中的配置或系统中当前尚未应用的参数。这是一个全局的配置更新命令,确保之前使用 sysctl -w 修改的参数永久生效。

7. sysctl 命令输出:

net.ipv4.tcp_max_tw_buckets = 4096 net.core.somaxconn = 4096 net.ipv4.tcp_slow_start_after_idle = 0 kernel.sysrq = 1 net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 kernel.printk = 5
  • net.ipv4.tcp_max_tw_buckets = 4096:设置最大 TCP TIME_WAIT 状态的连接数。这个参数控制 TCP 协议栈中 TIME_WAIT 状态的连接桶的数量,避免因为过多的连接导致资源耗尽。
  • net.core.somaxconn = 4096:调整系统可以为每个监听套接字队列分配的最大连接数。增加该值可以允许更多的并发连接。
  • net.ipv4.tcp_slow_start_after_idle = 0:禁用 TCP 空闲后慢启动的机制。正常情况下,TCP 会在连接空闲后进入慢启动阶段,但设置为 0 会禁用这一行为,从而加速连接恢复。
  • kernel.sysrq = 1:启用 SysRq 键的功能,允许在系统发生故障时进行紧急操作,如重启、查看堆栈等。
  • net.ipv6.conf.all.disable_ipv6 = 0net.ipv6.conf.default.disable_ipv6 = 0net.ipv6.conf.lo.disable_ipv6 = 0:这些参数确保启用 IPv6 支持,不会禁用全局、默认和回环接口的 IPv6 地址。
  • kernel.printk = 5:调整内核日志打印级别,5 表示内核打印日志的级别,较低的级别会显示更多的调试信息。

6.为什么?

在 Kubernetes 集群中,Flannel 是一个常用的网络插件,用于提供容器之间的网络连接。Flannel 通过为每个节点分配一个子网并配置网络地址转换(NAT)来实现容器网络的隔离和通信。

当你在 Kubernetes 控制平面节点上修改 kube-controller-manager 配置,确保启用了 --allocate-node-cidrs=true--cluster-cidr=10.244.0.0/16,这对 Flannel 的成功运行至关重要。以下是详细的原因和解释:

1. --allocate-node-cidrs=true

  • 这个参数告诉 Kubernetes 控制平面节点(特别是 kube-controller-manager)启用自动为每个节点分配 CIDR(子网)块的功能。
  • --allocate-node-cidrs=true 启用后,Kubernetes 会在集群初始化时为每个节点分配一个专用的 IP 子网。这个子网会被分配给该节点上所有运行的 Pod。
  • Flannel 作为网络插件,会使用这些子网来为容器分配 IP 地址。Flannel 会确保每个 Pod 获得唯一的 IP 地址,避免与其他 Pod 或节点的 IP 地址冲突。

2. --cluster-cidr=10.244.0.0/16

  • --cluster-cidr 设置 Kubernetes 集群的 Pod 网络地址范围。在你的例子中,--cluster-cidr=10.244.0.0/16 设置了集群的 Pod 网络地址池为 10.244.0.0/16。这意味着所有的 Pod 地址将从这个范围内分配。
  • Flannel 需要知道这个地址范围,以便能够正确地为每个节点分配子网。每个节点的子网必须来自这个范围,Flannel 会确保每个节点的 IP 地址分配不会冲突。
  • 如果 --cluster-cidr 设置不正确,Flannel 无法为 Pod 正确分配 IP 地址,导致 Pod 无法通信。

3. Flannel 与 Kubernetes 配合

  • Flannel 使用了 Subnet 模式,其中每个节点都有一个 CIDR 子网,并且每个 Pod 都会获得该子网内的 IP 地址。
  • --allocate-node-cidrs=true--cluster-cidr=10.244.0.0/16 配置启用后,kube-controller-manager 会自动为每个节点分配一个子网(例如:10.244.1.0/2410.244.2.0/24 等),然后 Flannel 会为每个节点上的 Pod 分配一个独立的 IP 地址,这些地址会在节点的子网范围内。

4. 为什么需要这两项配置?

  • 如果 --allocate-node-cidrs=true 被禁用,Kubernetes 不会自动分配节点的子网,Flannel 就无法为每个节点分配唯一的子网。结果,Flannel 无法正确配置每个节点的网络,从而无法为 Pod 分配 IP 地址。
  • 如果没有正确设置 --cluster-cidr,Flannel 就无法知道应该从哪个地址池中选择子网来分配给每个节点。这会导致 Pod 无法连接,或者多个节点之间的 IP 地址发生冲突。

5. Flannel 启动时如何工作

  • Flannel 启动时会通过 API Server 获取集群的 CIDR 范围(即 --cluster-cidr 配置的值)。
  • 它会为每个节点分配一个子网,并将该子网中的 IP 地址分配给该节点上的 Pod。Flannel 会通过 VXLAN、host-gw 或其他后端方式将这些网络连接起来,确保集群内的 Pod 可以跨节点通信。

总结

通过确保在 kube-controller-manager 配置中启用 --allocate-node-cidrs=true 和设置合适的 --cluster-cidr=10.244.0.0/16,你告诉 Kubernetes 和 Flannel 网络插件如何分配 Pod 的 IP 地址。这样,Flannel 可以正确地为每个节点分配一个子网,并通过 Flannel 网络来连接各个节点的 Pod。这个配置是 Flannel 成功运行和集群内容器之间正常通信的关键。

要注意10.244.0.0/16!!!!这个是我现在的子网ip范围!!要根据自己的来调整,

但是这样我的也是可以加入的,真酷!,下一节总结一下这段时间使用的命令!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CatLog的使用

一 CatLog的简介 1.1 作用 CAT(Central Application Tracking) 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…

深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02

目录 2、 使用SurfaceView画2D图 范例一 设计GameLoop(把小线程移出来) 范例二 2、 使用SurfaceView画2D图 范例一 以SurfaceView绘出Bitmap图像设计SpriteView类别来实作SurfaceHolder.Callback接口首先来看个简单的程序,显示出一个Bitmap图像。这个图像就构…

【FlutterDart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小(11 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100) 【Flutter&Dart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100) 上效果: 这个在知乎里找到的效果&…

tk GMV MAX素材范围投放指南

Product GMy Max素材范围说明 Product GMy Max能自动获取带有相关商品锚点链接(无论是单个锚点还是多个锚点)的视频,并将其用于推广特定商品的广告素材,前提是这些视频已经获得广告授权。然而,请注意,多个…

物联网无线芯片模组方案,设备智能化交互升级,ESP32-C3控制应用

无线交互技术的核心在于实现设备之间的无缝连接和数据传输。在智能家居系统中,各种智能设备如智能灯泡、智能插座、智能门锁等,都通过无线网络相互连接,形成一个互联互通的生态。 用户可以通过语音助手、手机APP或其他智能终端,远…

ubuntu为Docker配置代理

终端代理 我们平常在ubuntu终端中使用curl或git命令时,往往会很慢。 所以,首先需要给ubuntu终端环境添加代理。 查看自身那个软件的端口号,我这里是7890。 sudo gedit ~/.bashrcexport http_proxyhttp://localhost:7890 export https_pr…

【VUE 指令学习笔记】

v-bind :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定。 v-for:遍历数组/对象/字符串 v-on:绑定事件监听,可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…

用OpenCV实现UVC视频分屏

分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类,免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …

123.【C语言】数据结构之快速排序挖坑法和前后指针法

目录 1.挖坑法 执行流程 代码 运行结果 可读性好的代码 2.前后指针法(双指针法) 执行流程 单趟排序代码 将单趟排序代码改造后 写法1 简洁的写法 3.思考题 1.挖坑法 执行流程 "挖坑法"顾名思义:要有坑位,一开始将关键值放入临时变量key中,在数组中形成…

JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名

项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件,缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下:需要添加git库地址,和登录git的用户密码 配置好后执行编译,成功后拉取的代码在工作空间里

数学建模入门——建模流程

摘要:本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤,像分析问题、…

《机器学习》集成学习之随机森林

目录 一、集成学习 1、简介 2、集成学习的代表 3、XGBoost和随机森林的对比 相同点: 不同点: 二、Bagging之随机森林 1、简介 2、随机森林的核心思想 3、随机森林生成步骤 4、随机森林的优点 5、随机森林的缺点 三、随机森林的代码实现 1、…

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章,讲解屏幕录制的使用。官方文档参见:使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二…

CSS——22.静态伪类(伪类是选择不同元素状态)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>静态伪类</title> </head><body><a href"#">我爱学习</a></body> </html>单击链接前的样式 左键单击&#xff08;且…

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML &#xff08;1&#xff09;XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   &#xff08;2&#xff09;XML 的设计宗旨是传输数据(目前主要是作为配置文件)&#xff0c;而不是显示数据。   &#xff08;3&a…

攻防世界 bug

发现有Register界面&#xff0c;先去注册 登录以后发现以下界面&#xff0c;点击Manage显示you are not admin&#xff0c;并且在注册界面用admin为注册名时显示用户名已存在。初步推测是设法改变admin的密码取得权限。 在主界面一通操作并没有什么发现&#xff0c;去findpw…

maven依赖的配置和排除依赖

1.依赖的配置 1.1位置&#xff1a;写在<properties></properties>标签之下&#xff0c;<project></project>里。 1.2语法固定的格式 <dependencies><dependency></dependency></dependencies> 1.3在 <dependency><…

transformer深度学习实战CCTSDB中国交通标志识别

本文采用RT-DETR作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。RT-DETR以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对CCTSDB交通标志数据集进行训练和优化&#xff0c;该数据集包含丰富的CCTSDB交…

Elastic-Job相关

文档参考视频&#xff1a;09_SpringBoot案例演示_哔哩哔哩_bilibili 一、Elastic-Job介绍 Elastic-Job 是一个轻量级、分布式的任务调度框架&#xff0c;旨在解决分布式环境下的定时任务调度问题。 1.1. Elastic-Job 的核心组件 Elastic-Job 是由多个核心组件构成的&#x…