基本网络选项
本页介绍了 K3s 网络配置选项,包括 Flannel 的配置或替换,以及 IPv6 或双栈的配置。
Flannel 选项
Flannel 是一个轻量级的 3 层网络结构提供程序,它实现了 Kubernetes 容器网络接口 (CNI)。它通常被称为 CNI 插件。
- Flannel 选项只能在服务器节点上设置,并且必须在集群中的所有服务器上保持一致。
- Flannel 的默认后端是
vxlan
。要启用加密,请使用wireguard-native
后端。 - 在使用最新版本的 Ubuntu 的树莓派上使用
vxlan
需要额外的准备工作。 - 将
wireguard-native
作为 Flannel 后端可能需要在某些 Linux 发行版上安装额外的模块。有关详细信息,请参阅WireGuard 安装指南。WireGuard 安装步骤将确保为您的操作系统安装了相应的内核模块。在尝试使用 WireGuard Flannel 后端之前,必须确保服务器和代理节点上都启用了 WireGuard 内核模块。
CLI 标志和值 | 描述 |
---|---|
--flannel-ipv6-masq | 将伪装规则应用于 IPv6 流量(IPv4 的默认设置)。仅适用于双栈或仅 IPv6 的集群。与除 none 之外的任何 Flannel 后端兼容。 |
--flannel-external-ip | 使用节点外部 IP 地址作为 Flannel 流量的目标,而不是内部 IP。仅当在节点上设置 --node-external-ip 时才适用。 |
--flannel-backend=vxlan | 使用 VXLAN 封装数据包。在树莓派上可能需要额外的内核模块。 |
--flannel-backend=host-gw | 通过节点 IP 使用 IP 路由到 Pod 子网。需要集群中所有节点之间的直接第 2 层连接。 |
--flannel-backend=wireguard-native | 使用 WireGuard 封装和加密网络流量。可能需要额外的内核模块。 |
--flannel-backend=ipsec | 使用 strongSwan IPSec 通过 swanctl 二进制文件加密网络流量。(已弃用;将在 v1.27.0 中删除) |
--flannel-backend=none | 完全禁用 Flannel。 |
从 2022 年 12 月版本(v1.26.0+k3s1、v1.25.5+k3s1、v1.24.9+k3s1、v1.23.15+k3s1)开始,K3s 不再包含 strongSwan swanctl
和 charon
二进制文件。如果您想使用 ipsec
后端,请在升级到或安装这些版本之前在您的节点上安装正确的软件包。
从 wireguard
或 ipsec
迁移到 wireguard-native
旧版 wireguard
后端需要在主机上安装 wg
工具。此后端在 K3s v1.26 及更高版本中不可用,取而代之的是 wireguard-native
后端,该后端直接与内核交互。
旧版 ipsec
后端需要在主机上安装 swanctl
和 charon
二进制文件。此后端在 K3s v1.27 及更高版本中不可用,取而代之的是 wireguard-native
后端。
我们建议用户尽快迁移到新的后端。迁移需要短暂的停机时间,在此期间节点将使用新的配置启动。您应该按照以下两个步骤操作
- 更新所有服务器节点上的 K3s 配置。如果使用配置文件,则
/etc/rancher/k3s/config.yaml
应包含flannel-backend: wireguard-native
而不是flannel-backend: wireguard
或flannel-backend: ipsec
。如果您通过 systemd 单元中的 CLI 标志配置 K3s,则应更改相应的标志。 - 重新引导所有节点,从服务器开始。
自定义 CNI
使用 --flannel-backend=none
启动 K3s 并安装您选择的 CNI。大多数 CNI 插件都自带自己的网络策略引擎,因此建议也设置 --disable-network-policy
以避免冲突。一些需要考虑的重要信息
- Canal
- Calico
- Cilium
访问Canal 文档网站。按照步骤安装 Canal。修改 Canal YAML,以便在 container_settings
部分允许 IP 转发,例如
"container_settings": {
"allow_ip_forwarding": true
}
应用 Canal YAML。
通过在主机上运行以下命令确保设置已应用
cat /etc/cni/net.d/10-canal.conflist
您应该会看到 IP 转发设置为 true。
按照Calico CNI 插件指南。修改 Calico YAML,以便在 container_settings
部分允许 IP 转发,例如
"container_settings": {
"allow_ip_forwarding": true
}
应用 Calico YAML。
通过在主机上运行以下命令确保设置已应用
cat /etc/cni/net.d/10-calico.conflist
您应该会看到 IP 转发设置为 true。
在运行 k3s-killall.sh
或 k3s-uninstall.sh
之前,必须手动删除 cilium_host
、cilium_net
和 cilium_vxlan
接口。如果未能执行此操作,则在停止 K3s 时可能会导致主机网络连接丢失
ip link delete cilium_host
ip link delete cilium_net
ip link delete cilium_vxlan
此外,还应删除 cilium 的 iptables 规则
iptables-save | grep -iv cilium | iptables-restore
ip6tables-save | grep -iv cilium | ip6tables-restore
控制平面出口选择器配置
K3s 代理和服务器在节点之间维护 Websocket 隧道,用于封装控制平面(apiserver)和代理(kubelet 和 containerd)组件之间的双向通信。这允许代理在不将 kubelet 和容器运行时流式端口公开给传入连接的情况下运行,并允许控制平面在禁用代理的情况下连接到集群服务。此功能等效于其他 Kubernetes 发行版中常用的Konnectivity服务,并通过 apiserver 的出口选择器配置进行管理。
默认模式为 agent
。当运行无代理服务器时,建议使用 pod
或 cluster
模式,以便在没有 flannel 和 kube-proxy 的情况下为 apiserver 提供对集群服务端点的访问。
可以通过 --egress-selector-mode
标志在服务器上配置出口选择器模式,它提供四种模式
disabled
:apiserver 不使用代理隧道与 kubelet 或集群端点通信。此模式要求服务器运行 kubelet、CNI 和 kube-proxy,并且与代理具有直接连接,否则 apiserver 将无法访问服务端点或执行kubectl exec
和kubectl logs
。agent
(默认):apiserver 使用代理隧道与 kubelet 通信。此模式要求服务器也运行 kubelet、CNI 和 kube-proxy,否则 apiserver 将无法访问服务端点。pod
:apiserver 使用代理隧道与 kubelet 和服务端点通信,通过监视节点和端点将端点连接路由到正确的代理。
注意:当使用使用自己的 IPAM 并且不尊重节点的 PodCIDR 分配的 CNI 时,此模式将无法正常工作。在这种情况下,应使用cluster
或agent
模式。cluster
:apiserver 使用代理隧道与 kubelet 和服务端点通信,通过监视 Pod 和端点将端点连接路由到正确的代理。此模式在不同的集群配置中具有最高的可移植性,但代价是增加了开销。
双栈(IPv4 + IPv6)网络
从v1.21.0+k3s1开始提供实验性支持。
从v1.23.7+k3s1开始提供稳定支持。
在 1.27 之前,Kubernetes问题 #111695会导致 Kubelet 忽略节点 IPv6 地址,如果您具有双栈环境并且未使用主网络接口进行集群流量。要避免此错误,请使用 1.27 或更高版本,或将以下标志添加到 K3s 服务器和代理
--kubelet-arg="node-ip=0.0.0.0" # To proritize IPv4 traffic
#OR
--kubelet-arg="node-ip=::" # To proritize IPv6 traffic
必须在首次创建集群时配置双栈网络。一旦集群以仅 IPv4 的方式启动,就无法在现有集群上启用它。
要在 K3s 中启用双栈,您必须在所有服务器节点上提供有效的双栈 cluster-cidr
和 service-cidr
。这是一个有效配置的示例
--cluster-cidr=10.42.0.0/16,2001:cafe:42::/56 --service-cidr=10.43.0.0/16,2001:cafe:43::/112
请注意,您可以配置任何有效的 cluster-cidr
和 service-cidr
值,但建议使用上述掩码。如果更改 cluster-cidr
掩码,则还应更改 node-cidr-mask-size-ipv4
和 node-cidr-mask-size-ipv6
值以匹配计划的每个节点的 Pod 数和节点总数。IPv4 支持的最大 service-cidr
掩码为 /12,IPv6 为 /112。如果您在公有云中部署,请记住允许 ipv6 流量。
当使用未公开路由的 IPv6 地址(例如在 ULA 范围内)时,您可能希望添加 --flannel-ipv6-masq
选项以启用 IPv6 NAT,因为默认情况下 Pod 使用其 Pod IPv6 地址进行出站流量。
如果您使用自定义 CNI 插件(即除 Flannel 之外的 CNI 插件),则可能需要额外的配置。请查阅插件的双栈文档并验证是否可以启用网络策略。
当使用 IPv6 作为主要族定义 cluster-cidr 和 service-cidr 时,应显式设置所有集群成员的 node-ip,并将节点所需的 IPv6 地址作为第一个地址。默认情况下,kubelet 始终使用 IPv4 作为主要地址族。
单栈 IPv6 网络
从v1.22.9+k3s1开始提供支持
如果您的 IPv6 默认路由由路由器通告 (RA) 设置,则需要设置 sysctl net.ipv6.conf.all.accept_ra=2
;否则,节点在默认路由过期后会将其丢弃。请注意,接受 RA 可能会增加 中间人攻击 的风险。
使用 --cluster-cidr
和 --service-cidr
标志,K3s 支持单栈 IPv6 集群(没有 IPv4 的集群)。这是一个有效配置的示例。
--cluster-cidr=2001:cafe:42::/56 --service-cidr=2001:cafe:43::/112
当使用未公开路由的 IPv6 地址(例如在 ULA 范围内)时,您可能希望添加 --flannel-ipv6-masq
选项以启用 IPv6 NAT,因为默认情况下 Pod 使用其 Pod IPv6 地址进行出站流量。
无主机名的节点
某些云提供商(例如 Linode)会创建主机名为“localhost”的机器,而其他云提供商可能根本没有设置主机名。这可能导致域名解析问题。您可以使用 --node-name
标志或 K3S_NODE_NAME
环境变量运行 K3s,这将传递节点名称以解决此问题。