构建flannel
构建 flannel 最可靠的方法是使用 Docker。
在 Docker 容器中构建
要在容器中构建 flannel,请运行 make dist/flanneld-amd64
。
现在,您将在 dist
目录中看到一个 flanneld-amd64
二进制文件。
基于其他平台构建
如果运行的不是 amd64
,则需要在运行 make
之前手动设置 ARCH
。例如,要生成一个
flanneld-s390x`二进制文件和镜像,运行
- ARCH=s390x make image
如果你想为不同的平台进行交叉编译(例如,你运行的是 amd64
,但你想生成 arm
二进制文件),那么你需要在 /usr/bin
中安装 qemu-static 二进制文件。在 Ubuntu 上可以通过以下方式安装它们
- sudo apt-get install qemu-user-static
然后,你就可以如上设置 ARCH 了
- ARCH=arm make image
手动构建
确保机器上安装了所需的依赖项。
- 在 Ubuntu 上,运行
sudo apt-get install linux-libc-dev golang gcc
。
如果安装的不是 1.7 或更高的golang 版本。下载最新的 golang 并手动安装。
要在 windows 上构建 flannel.exe,还需要 mingw-w64。运行命令 "sudo apt-get install mingw-w64 - 在 Fedora/Redhat 上,运行
sudo yum install kernel-headers golang gcc glibc-static
。
Git 克隆 flannel repo。必须将其放在 GOPATH 中的 github.com/flannel-io/flannel
下:cd $GOPATH/src; git clone https://github.com/flannel-io/flannel.git
.
运行构建脚本,确保 CGO_ENABLED=1
: cd flannel; CGO_ENABLED=1 make dist/flanneld
用于 Linux。
运行构建脚本,确保 CGO_ENABLED=1
: cd flannel; CGO_ENABLED=1 make dist/flanneld.exe
适用于 windows 环境。
配置
如果 --kube-subnet-mgr 参数为 true,flannel 会从 /etc/kube-flannel/net-conf.json
读取配置。
如果 --kube-subnet-mgr 参数为false,flannel 会从 etcd 读取配置。
默认情况下,它会从 /coreos.com/network/config
(可使用 --etcd-prefix
重写)读取配置。
使用 etcdctl
工具在 etcd 中设置值。
配置值是一个 JSON 字典,包含以下键值:
-
Network
(字符串): 整个flannel使用 CIDR 格式的IPv4 网络。(EnableIPv4 为 true 时必须填写) -
IPv6Network
(字符串): 整个 flannel使用的 CIDR 格式 IPv6 网络。(EnableIPv6 为 true 时必须填写) -
EnableIPv4
(bool): 启用 ipv4 支持
默认为 `true -
EnableIPv6
(bool): 启用 ipv6 支持
默认为 `false -
SubnetLen
(整数): 分配给每台主机的子网大小。
默认为 24(即 /24),除非Network
被配置为小于 /22,在这种情况下,它比网络小两个。 -
SubnetMin
(字符串): 子网分配应从哪个 IP 范围开始。
默认为Network
的第二个子网。 -
SubnetMax
(字符串): 子网分配应结束的 IP 范围的终点。
默认为Network
的最后一个子网。 -
IPv6SubnetLen
(整数): 分配给每台主机的 ipv6 子网的大小。
默认为 64(即 /64),除非Ipv6Network
被配置为小于 /62,在这种情况下,它比网络小两个。 -
IPv6SubnetMin
(字符串): 子网分配的 IPv6 开始范围。
默认为Ipv6Network
的第二个子网。 -
IPv6SubnetMax
(字符串): 子网分配 IPv6 的结束范围
默认为Ipv6Network
的最后一个子网。 -
Backend
(字典): 要使用的后端类型以及该后端的具体配置。
可用的后端列表和可放入此字典的键列于 Backends。
默认为vxlan
后端。
子网租用期限为 24 小时。租约在到期后 1 小时内续约、
除非使用 --subnet-lease-renew-margin
选项设置了不同的续约年限。
配置 JSON 示例
以下配置说明了与 udp
后端相关的大多数选项的用法。
{
"Network": "10.0.0.0/8",
"SubnetLen": 20,
"SubnetMin": "10.10.0.0",
"SubnetMax": "10.99.0.0",
"Backend": {
"Type": "udp",
"Port": 7890
}
}
关键命令行选项
--public-ip="": 其他节点可访问的 IP,用于主机间通信。默认为用于通信的接口 IP。
--etcd-endpoints=http://127.0.0.1:4001: 逗号风格的etcd端点列表
--etcd-prefix=/coreos.com/network: etcd 前缀.
--etcd-keyfile="":用于确保 etcd 通信安全的 SSL 密钥文件。
--etcd-certfile="": 用于确保 etcd 通信安全的 SSL 认证文件。--etcd-cafile="":用于确保 etcd 通信安全的 SSL 证书授权文件。
--kube-subnet-mgr: 联系 Kubernetes API 进行子网分配,而不是 etcd。
--iface="":用于主机间通信的接口(IP 或名称)。默认为机器上默认路由的接口。可以多次指定该接口,以便按顺序检查每个选项。返回找到的第一个匹配项。
--iface-regex="": regex 表达式,用于匹配主机间通信要使用的第一个接口(IP 或名称)。如果未指定,则默认使用机器上默认路由的接口。可以多次指定,以便按顺序检查每个 regex。返回找到的第一个匹配项。该选项被 iface 选项取代,只有在没有任何匹配 iface 选项中指定的选项时才会使用。
--iface-can-reach="": 检测用于主机间通信的接口(IP 或名称),根据提供的 IP 使用哪个接口。这正是命令 "ip route get <ip-address>"要使用的接口(例如:--iface-can-reach=192.168.1.1 可使流量到达 192.168.1.1 )
--iptables-resync=5:iptables 规则的重新同步周期,以秒为单位。默认值为 5 秒,如果你发现 iptables 锁数量不断上升,增加该值可能会有帮助。
--subnet-file=/run/flannel/subnet.env: 文件名,环境变量(子网和 MTU 值)将写入该文件。
--net-config-path=/etc/kube-flannel/net-conf.json: 网络配置文件的路径
--subnet-lease-renew-margin=60: 子网租约续约时限,以分钟为单位。
--ip-masq=false:为通往flannel网络外部的流量设置 IP 伪装。Flannel 假定 NAT POSTROUTING 链中的默认策略为 ACCEPT。
-v=0:V 日志的日志级别。设置为 1 可查看与数据路径相关的信息。
--healthz-ip="0.0.0.0": healthz 服务器监听的 IP 地址(默认为 "0.0.0.0)
--healthz-port=0:healthz 服务器监听的端口(0 表示禁用)
--version:打印版本并退出
MTU 由 flannel 自动计算和设置。然后,它会在 subnet.env
中报告该值。可以通过 [backend](backends.md)配置更改该值。
环境变量
上述命令行选项也可以通过环境变量指定。
例如 --etcd-endpoints=http://10.0.0.2:2379
相当于环境变量 FLANNELD_ETCD_ENDPOINTS=http://10.0.0.2:2379
。
任何命令行选项都可以变成环境变量,方法是加上前缀FLANNELD_
,去掉前导破折号,转换为大写字母,并将所有其他破折号替换为下划线。
EVENT_QUEUE_DEPTH "是另一个表示 kubernetes 规模的环境变量。设置 EVENT_QUEUE_DEPTH
以适配你的集群节点数。如果未设置,默认值为 5000。
健康检查
Flannel 提供了一个健康检查 http 端点 healthz
。目前,当 Flannel 正在运行时,该端点会盲目地
返回 http 状态 ok(即 200)。此功能默认为禁用。
将 healthz-port
设置为非零值,就能为 flannel 启用健康检查服务器。
双栈
Flannel 支持双协议栈模式。这意味着 pod 和服务可以同时使用 ipv4 和 ipv6。目前,双协议栈仅支持 vxlan、wireguard 或 host-gw(linux)后端。
要求
- 源自 containernetworking/plugins 的 flannel 二进制版本 v1.0.1
- 节点的主接口必须有 ipv4 和 ipv6 地址
- 节点必须有 ipv4 和 ipv6 地址默认路由
- vxlan 支持 ipv6 隧道 要求内核版本 >= 3.12
配置:
- 设置 "EnableIPv6":true 和 "IPv6Network",例如 "IPv6Network": * "2001:cafe:42:0::/56" 在 kube-flannel-cfg ConfigMap 的 net-conf.json 或 etcd 的
/coreos.com/network/config
中设置 "2001:cafe:42:0::/56
如果一切正常,flanneld 将生成一个包含 IPV6 子网和网络的 /run/flannel/subnet.env
文件。例如
FLANNEL_NETWORK=10.42.0.0/16
FLANNEL_SUBNET=10.42.0.1/24
FLANNEL_IPV6_NETWORK=2001:cafe:42::/56
FLANNEL_IPV6_SUBNET=2001:cafe:42::1/64
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
仅 IPv6
要使用纯 IPv6 环境,请使用双协议栈部分的相同配置来启用 IPv6,并在 kube-flannel-cfg ConfigMap 的 net-conf.json 中添加 "EnableIPv4":false。如果只设置了 IPv6,请使用 docker.io IPv6-only 端点,如下链接所示: www.docker.com/blog/beta-i…
后端
Flannel 可以搭配多个不同的后端。后端一经设置,就不能在运行时更改。
VXLAN 是推荐的选择。host-gw 推荐给经验丰富、希望提高性能且基础设施支持它的用户(通常无法在云环境中使用)。UDP 建议仅用于调试或不支持 VXLAN 的老内核。
如果节点上启用了 "firewalld",则需要使用 "firewall-cmd "启用后端使用的端口:
firewall-cmd --permanent --zone=public --add-port=[port]/udp
有关腾讯云配置选项的更多信息,请参阅 TencentCloud VPC Backend for Flannel。
推荐的后端
VXLAN
使用内核 VXLAN 封装数据包。
类型和选项:
Type
(字符串): VXLANVNI
(数字): 要使用的 VXLAN 标识符 (VNI)。在 Linux 上,默认为 1。在 Windows 上应大于或等于 4096。Port
(数字): 用于发送封装数据包的 UDP 端口。在 Linux 上,默认为内核默认端口,目前为 8472,但在 Windows 上必须为 4789。GBP
(布尔): 启用 VXLAN 基于组的策略。 默认为false
。Windows 不支持 GBPDirectRouting
(布尔): 当主机位于同一子网时,启用直接路由(如host-gw
)。VXLAN 将仅用于封装到不同子网上主机的数据包。默认为false
。Windows 不支持 DirectRouting。MTU
(数字): 如果未定义,则使用外部接口的 MTU。MacPrefix
(字符串): 仅用于 Windows,设置为 MAC 前缀。默认为0E-2A
。
从 Ubuntu 21.10 开始,Raspberry Pi 上的 vxlan 支持已移至一个单独的内核模块。
sudo apt install linux-modules-extra-raspi
host-gw
使用 host-gw 通过远程机器 IP 创建通往子网的 IP 路由。需要在运行 flannel 的主机之间建立直接layer2(链路层?)连接。
host-gw 性能良好,依赖性少,易于设置。
类型:
Type
(字符串): host-gw
WireGuard
使用内核 WireGuard 对数据包进行封装和加密。
类型:
Type
(字符串):wireguard
PSK
(字符串): 可选。要使用的预共享密钥。使用wg genpsk
生成密钥。ListenPort
(int): 可选。要监听的 udp 端口。默认为51820
。ListenPortV6
(int): 可选。侦听 ipv6 的 udp 端口。默认为51821
。MTU
(数字): 如果未定义,则使用外部接口的 MTU。Mode
(字符串): 可选。- separate - 为 ipv4 和 ipv6 分别使用不同的WireGu隧道(默认)。
- auto - 两个地址族使用单一的线卫隧道;自动确定首选的对等地址
- ipv4 - 为两个地址系列使用单一的线卫隧道;使用 ipv4 作为
对等地址 - ipv6 - 两个地址族的单线卫隧道;使用 ipv6 作为对等地址
对等地址
- PersistentKeepaliveInterval (int): 可选。默认为 0(禁用)。
如果在将私钥写入 /run/flannel/wgkey
之前没有生成私钥。可以使用环境 WIREGUARD_KEY_FILE
更改此路径。
接口的静态名称是 flannel-wg
和 flannel-wg-v6
。WireGuard 工具(如 wg show
)可用于调试接口和对等设备。
内核 < 5.6 的用户需要 install 一个额外的 Wireguard 软件包。
UDP
如果您的网络和内核阻止您使用 VXLAN 或 host-gw,则仅在调试时使用 UDP。
类型和选项:
Type
(字符串): UDPPort
(数字): 用于发送封装数据包的 UDP 端口。默认为 8285。
实验性后端
以下选项是试验性的,目前还不支持。
Alloc
Alloc 执行子网分配,但不转发数据包。
类型:
Type
(字符串):alloc
腾讯云 VPC
在 TencentCloud VPC 中运行时,使用 TencentCloud VPC 在 TencentCloud VPC 路由表 中创建 IP 路由。这样就无需创建单独的通道接口。
要求:
- 在 TencentCloud VPC 中的 CVM 实例上运行。
- 权限要求
accessid
和keysecret
。Type
(string):tencent-vpc
AccessKeyID
(字符串): API 访问密钥 ID。也可使用环境 ACCESS_KEY_ID 进行配置。AccessKeySecret
(字符串): API 访问密钥秘密。也可通过环境 ACCESS_KEY_SECRET 进行配置。
路由限制: TencentCloud VPC 将每个路由表的条目数限制为 50。
IPIP
使用内核 IPIP 封装数据包。
IPIP 隧道是最简单的隧道。它的开销最低,但只能封装 IPv4 单播流量,因此无法设置 OSPF、RIP 或任何其他基于组播的协议。
类型:
Type
(字符串):ipip
DirectRouting
(布尔): 当主机位于同一子网时,启用直接路由(如host-gw
)。IPIP 只用于封装发送到不同子网主机的数据包。默认为false
。
请注意,可能存在两个 ipip 隧道设备 tunl0
和 flannel.ipip
,这是预料之中的,并非错误。
tunl0 "是由 ipip 内核模块在 modprobe ipip 模块上根据网络命名空间自动创建的。它是命名空间默认的 IPIP 设备,属性为 local=any 和 remote=any。
内核在接收 IPIP 协议数据包时,如果找不到本地/远程属性与数据包的 src/dst ip 地址更精确匹配的选项,就会将数据包转发到 tunl0 作为备用设备。
flannel.ipip` 由 flannel 创建,用于实现一对多的 ipip 网络。
IPSec
使用内核 IPSec 对数据包进行封装和加密。
在 IKEv2 守护进程中使用 Strongswan。主机之间的初始密钥交换使用单个预共享密钥,然后 Strongswan 会确保定期轮换密钥。
类型:
Type
(string):ipsec
PSK
(字符串): 必填。要使用的预共享密钥。长度至少为 96 个字符。生成此密钥的一种方法是运行dd if=/dev/urandom count=48 bs=1 status=none | xxd -p -c 48
.UDPEncap
(布尔): 可选,默认为 false。强制使用 UDP 封装数据包,这对某些 NAT 网关有帮助。ESPProposal
(字符串): 可选,默认为aes128gcm16-sha256-prfsha256-ecp256
。更改此字符串可选择其他 ESP 建议。
提示:
在防火墙中添加规则: 打开端口 50(用于 ESP 协议)、UDP 500(用于 IKE,管理加密密钥)和 UDP 4500(用于 IPSEC NAT 穿越模式)。
故障排除
日志记录
- 从容器运行flannel时,会安装 Strongswan 工具。可使用
swanctl
与 charon 交互,它提供了日志命令。 - Charon 日志也会写入 flannel 进程的 stdout。
故障排除
ip xfrm state
可用于与内核的安全关联数据库交互。这可用于显示当前的安全关联(SA),以及主机是否成功建立了与其他主机的 IPsec 连接。ip xfrm policy
可用于显示已安装的策略。Flannel 会为连接的每台主机安装三个策略。
Flannel 不会恢复被手动删除的策略(除非重新启动 Flannel)。它也不会在启动时删除过时的策略。可以通过重启主机或使用 ip xfrm state flush && ip xfrm policy flush
删除所有 ipsec 状态并重启 Flannel 来删除过期策略。
运行flannel
将配置 JSON 推送到 etcd
后,就可以启动 flanneld
了。如果在默认位置发布了配置,就可以不带参数地启动 flanneld
。
Flannel 会获取子网租约,根据overlay网络中的其他租约配置路由,并开始路由数据包。
它还会监控 etcd
是否有新的网络成员,并相应地调整路由。
flannel 获取子网并配置后端后,会写出一个环境变量文件(默认为 /run/flannel/subnet.env
),其中包含它支持的子网地址和 MTU。
有关检查特定主机 IP 范围的更多信息,请参阅 Leases and Reservations。
多网络
Flanneld 不支持从一个守护进程运行多个网络(以前曾作为实验功能支持过)。
不过,它支持在同一主机上以不同配置运行多个守护进程。应使用 -subnet-file
和 -etcd-prefix
选项来为不同的守护进程 "命名"。
例如
flanneld -subnet-file /vxlan.env -etcd-prefix=/vxlan/network
手动运行
flannel
二进制文件。wget https://github.com/flannel-io/flannel/releases/latest/download/flanneld-amd64 && chmod +x flanneld-amd64
sudo ./flanneld-amd64 # 它会挂起,等待与 etcd 对话
etcd
。按照etcd 页面上的说明操作,或者,如果你有 docker,只需执行docker run --rm --net=host quay.io/coreos/etcd
flannel
发现可以与etcd
对话,但找不到任何配置。那就写点配置吧。要么从etcd 页面 获取 etcdctl
,要么重新使用 docker
。docker run --rm -e ETCDCTL_API=3 --net=host quay.io/coreos/etcd etcdctl put /coreos.com/network/config '{ "Network": "10.5.0.0/16", "Backend": {"Type": "vxlan"}}'
现在,flannel
正在运行,它已在主机上创建了一个 VXLAN 隧道设备,并写入了一个子网配置文件
cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.5.0.0/16
FLANNEL_SUBNET=10.5.72.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
每次重新启动 flannel 时,它都会尝试访问写入子网配置文件的 FLANNEL_SUBNET
值。这可以防止在主机无法在租约到期前更新租约的情况下(例如,主机在 flannel 正常更新租约期间重启)更新其网络信息。
此外,"FLANNEL_SUBNET "值只有在对 etcd 网络配置合法时才会被使用。例如,如果 etcd 网络值设置为 "10.6.0.0/16",则不会使用 "10.5.72.1/24 "的 FLANNEL_SUBNET
值,因为它不在该网络范围内。
子网配置值为 10.5.72.1/24
cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.5.0.0/16
FLANNEL_SUBNET=10.5.72.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
etcd 网络值为 10.6.0.0/16
。由于 10.5.72.1/24
位于该网络之外,因此将分配一个新租期。
export ETCDCTL_API=3
etcdctl get /coreos.com/network/config
{ "Network": "10.6.0.0/16", "Backend": {"Type": "vxlan"}}
接口选择
Flannel 使用所选接口在数据存储中注册。
重要选项如下
-iface string
: 用于主机间通信的接口(IP 或名称)。-public-ip string
: 其他节点可访问的 IP,用于主机间通信。
结合默认值、自动检测和这两个标志,最终确定以下内容:
- 接口(用于 MTU 检测和在 VXLAN 中选择 VTEP MAC)。
- 该接口的 IP 地址。
- 可用于连接该节点的公共 IP。在
host-gw
中,它应与接口地址匹配。
在运行时进行更改
请注意以下flannel运行时限制。
- 数据存储类型不可更改。
- 后端类型不可更改。(如果停止所有工作负载并重启所有 flannel 守护进程,则可以更改)。
- 可以通过重启守护进程来更改子网长度/子网最小值/子网最大值。(子网的更改需谨慎。如果 pod 已在使用新范围之外的 IP 地址,它们将停止工作)。
- 不能更改整个集群的网络范围(在不停机的情况下)。
Docker 集成
Docker 守护进程接受 --bip
参数来配置 docker0 网桥的子网。
它还接受 --mtu
参数,用于设置要创建的 docker0 和 veth 设备的 MTU。
因为 flannel 会将获取的子网和 MTU 值写入文件,所以启动 Docker 的脚本可以将这些值输入并传递给 Docker 守护进程:
source /run/flannel/subnet.env
docker daemon --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} &
Systemd用户可以在.service
文件中使用EnvironmentFile
指令来导入/run/flannel/subnet.env
。
如果你想保留默认的 docker0 网络,而创建一个使用 flannel 的新网络,可以这样做:
source /run/flannel/subnet.env
docker network create --attachable=true --subnet=${FLANNEL_SUBNET} -o "com.docker.network.driver.mtu"=${FLANNEL_MTU} flannel
在 Vagrant 上运行
Vagrant 往往会给默认接口(具有默认路由的接口)一个非唯一 IP(通常为 10.0.2.15)。
这会导致 flannel 使用相同 IP 注册多个节点。
要解决这个问题,可使用"--iface "选项指定具有唯一 IP 的接口。
零停机重启
当使用除 udp
以外的后端时,内核提供数据路径,而 flanneld
充当控制平面。
因此,"flanneld "可以在不影响现有流量的情况下重启(即使是升级)。
不过,对于 vxlan
后端,这需要在几秒钟内完成,因为 ARP 条目会开始超时,需要flanneld刷新它们。
此外,为避免重启时出现中断,配置不得更改(如 VNI、--iface 值)。
排错
一般问题
连接性
在 Docker v1.13 及更高版本中,默认的 iptables 转发策略已更改为 DROP
。有关 Docker 更改的更多详情,请参阅 Docker 文档。
这个问题表现为在不同主机上运行的容器之间的连接问题。要解决这个问题,请升级到最新版本的 flannel。
日志
Flannel 使用 klog
库,但只支持将日志记录到 stderr。日志的严重程度无法更改,但可以使用 -v
选项更改日志的冗余度。Flannel 并不广泛使用动词级别,但从 0
(默认值)开始增加数值会产生一些额外的日志。要获得最详细的日志,请使用 -v=10
选项
-v value
V 日志的日志级别
-vmodule value
以逗号分隔的模式=N 设置列表,用于文件过滤日志记录
-log_backtrace_at value
当日志命中 file:N 行时,发出堆栈跟踪
在 systemd 下运行时(例如在 CoreOS Container Linux 上),可以使用 journalctl -u flanneld
查看日志。
当 flannel 作为一个 pod 在 Kubernetes 上运行时,可以使用 kubectl logs --namespace kube-flannel <POD_ID> -c kube-flannel
查看日志。你可以使用 kubectl get pod --namespace kube-flannel -l app=flannel
查找 pod ID。
接口选择和公网 IP
大多数后端要求每个节点都有一个唯一的 "公网 IP "地址。flannel启动时会选择这个地址。由于租约与公网地址绑定,如果地址发生变化,就必须重新启动 flannel。
所选接口和使用中的公网 IP 会在启动时被注销,例如
I0629 14:28:35.866793 5522 main.go:386] Determining IP address of default interface
I0629 14:28:35.866987 5522 main.go:399] Using interface with name enp62s0u1u2 and address 172.24.17.174
I0629 14:28:35.867000 5522 main.go:412] Using 10.10.10.10 as external address
Vagrant
Vagrant 通常会为所有虚拟机分配两个接口。第一个接口为所有主机分配了 "10.0.2.15 "IP 地址,用于接收 NAT 的外部流量。
这可能会导致 flannel 出现问题。默认情况下,flannel 会选择主机上的第一个接口。这会导致所有主机都认为它们拥有相同的公网 IP 地址。为防止出现这一问题,可向 flannel 传递 --iface=eth1
标记,以便选择第二个接口。
权限
根据所使用的后端,fannel 可能需要以超级用户权限运行。例如,创建 VXLAN 设备或路由编程。 如果看到类似以下的错误,请确认运行 flannel 的用户拥有正确的权限(或尝试使用 sudo)
运行。
- 添加路由时出错......
- 添加 L2 失败
- 设置 IP 伪装失败
- 注册网络时出错:不允许操作
性能
控制平面
众所周知,Flannel 可以扩展到非常多的主机。在新创建的主机中,与 pod 联系的延迟可能表明控制平面出现了问题。Flannel 不需要太多的 CPU 或内存,但首先要检查是否有足够的可用资源。Flannel 还依赖于数据存储(etcd 或 Kubernetes API 服务器)的性能。检查它们的性能是否良好。
数据平面
通道依赖于底层网络,因此如果数据平面性能不佳,首先要检查的就是底层网络。
有两个特定的通道选择会对性能产生重大影响
subnet.env
文件。该文件由 Docker 守护进程或 CNI flannel 插件读取,后者为单个容器进行联网。要排除故障,首先要确保 flannel 使用的网络接口具有正确的 MTU。然后检查是否已将正确的 MTU 写入 subnet.env
。最后,检查容器的虚拟以太网设备是否具有正确的 MTU。防火墙
使用 udp
后端时,flannel 使用 UDP 端口 8285 发送封装数据包。
使用 vxlan
后端时,内核使用 UDP 端口 8472 发送封装数据包。
确保防火墙规则允许参与overlay网络的所有主机使用此流量。
确保防火墙规则允许从 pod 网络 cidr 访问 kubernetes 主节点的流量。
Kubernetes 专属
flannel kube 子网管理器依赖于每个节点都已定义了 "podCIDR "这一事实。
你可以使用以下两个命令之一检查节点的 podCidr
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
kubectl get nodes -o template --template={{.spec.podCIDR}}
如果节点没有 podCIDR,则可使用 --pod-cidr
kubelet 命令行选项或 --allocate-node-cidrs=true --cluster-cidr=<cidr>
controller-manager 命令行选项。
如果使用 "kubeadm",则向 "kubeadm init "传递"--pod-network-cidr=10.244.0.0/16",这将确保自动为所有节点分配一个 "podCIDR"。
可以(但一般不建议)为每个节点手动将 podCIDR
设置为固定值。节点子网范围不得重叠。
*kubectl patch node <NODE_NAME> -p '{"spec":{"podCIDR":"<SUBNET>"}}'
日志信息
failed to read net conf
- flannel 希望能够从"/etc/kube-flannel/net-conf.json "中读取 net conf。这是在提供的kube-flannel-cfg
ConfigMap清单中设置的。- 子网配置解析错误"--net conf 格式错误。请仔细检查其内容是否正确,是否为有效的 JSON 格式。
node <NODE_NAME> pod cidr not assigned
- 节点未定义podCIDR
。更多信息请参见上文。Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-abc123': the server does not allow access to the requested resource
- 该 kubernetes 集群已启用 RBAC。运行https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-old-manifests/kube-flannel-rbac.yml
集成
本文档跟踪与flannel集成的项目。加入社区 并帮助我们保持列表的更新。
项目
Kubernetes: 容器编排平台,可用于flannel as an overlay。
Canal: Kubernetes CNI 插件,使用 Calico 进行网络策略和节点内通信,使用 Flannel 进行节点间通信。
K3s: 内置 Flannel 作为 CNI 的 Kubernetes 发行版。
RKE2: 将 Canal 作为默认 CNI 的 Kubernetes 发行版。