网络服务
本页介绍了 CoreDNS、Traefik Ingress 控制器、网络策略控制器和 ServiceLB 负载均衡器控制器在 K3s 中的工作原理。
有关 Flannel 配置选项和后端选择或如何设置自己的 CNI 的详细信息,请参阅安装网络选项页面。
有关 K3s 需要打开哪些端口的信息,请参阅网络需求。
CoreDNS
CoreDNS 在服务器启动时自动部署。要禁用它,请使用--disable=coredns
选项配置集群中的所有服务器。
如果未安装 CoreDNS,则需要自己安装集群 DNS 提供程序。
Traefik Ingress 控制器
Traefik 是一种现代 HTTP 反向代理和负载均衡器,旨在轻松部署微服务。它简化了在设计、部署和运行应用程序时的网络复杂性。
Traefik Ingress 控制器部署一个使用端口 80 和 443 的 LoadBalancer 服务,并在其管理的 Ingress 资源的状态中发布 LoadBalancer 服务的外部 IP。
默认情况下,ServiceLB 将使用集群中的所有节点来托管 Traefik LoadBalancer 服务,这意味着端口 80 和 443 将不可用于其他 HostPort 或 NodePort pod,并且 Ingress 资源的状态将显示所有集群成员的节点 IP。
要限制 Traefik 使用的节点,以及扩展 Ingress 状态中发布的节点 IP,您可以按照下面控制 ServiceLB 节点选择部分中的说明来限制 ServiceLB 运行的节点,或者通过将一些节点添加到 LoadBalancer 池中,并通过在 Traefik HelmChartConfig 中设置匹配的标签来将 Traefik 服务限制在该池中。
启动服务器时默认部署 Traefik。有关更多信息,请参阅管理打包组件。默认配置文件位于/var/lib/rancher/k3s/server/manifests/traefik.yaml
中。
不应手动编辑traefik.yaml
文件,因为 K3s 将在启动时用默认值替换该文件。相反,您应该通过在/var/lib/rancher/k3s/server/manifests
中创建额外的HelmChartConfig
清单来自定义 Traefik。有关更多详细信息和示例,请参阅使用 HelmChartConfig 自定义打包组件。有关可能的配置值的更多信息,请参阅官方的Traefik Helm 配置参数。
要从集群中删除 Traefik,请使用--disable=traefik
标志启动所有服务器。
K3s 包含 Traefik v2。K3s 版本 1.21 到 1.30 安装 Traefik v2,除非找到现有的 Traefik v1 安装,在这种情况下,Traefik 不会升级到 v2。K3s 版本 1.20 及更早版本包含 Traefik v1。有关 K3s 中包含的 Traefik 特定版本的更多信息,请参阅您版本的发布说明。
要从旧的 Traefik v1 实例迁移,请参阅Traefik 文档和迁移工具。
网络策略控制器
K3s 包含一个嵌入式网络策略控制器。底层实现是kube-router 的 netpol 控制器库(没有其他 kube-router 功能存在),可以在这里找到。
要禁用它,请使用--disable-network-policy
标志启动每个服务器。
如果 K3s 配置更改为禁用网络策略控制器,则不会删除网络策略 iptables 规则。要禁用网络策略控制器后清理配置的 kube-router 网络策略规则,请使用k3s-killall.sh
脚本,或使用iptables-save
和iptables-restore
清理它们。这些步骤必须在集群中的所有节点上手动运行。
iptables-save | grep -v KUBE-ROUTER | iptables-restore
ip6tables-save | grep -v KUBE-ROUTER | ip6tables-restore
服务负载均衡器
任何 LoadBalancer 控制器都可以部署到您的 K3s 集群中。默认情况下,K3s 提供一个名为ServiceLB(以前称为 Klipper LoadBalancer)的负载均衡器,它使用可用的主机端口。
上游 Kubernetes 允许创建类型为 LoadBalancer 的服务,但没有包含默认的负载均衡器实现,因此这些服务将保持pending
状态,直到安装一个为止。许多托管服务需要 Amazon EC2 或 Microsoft Azure 等云提供商来提供外部负载均衡器实现。相反,K3s ServiceLB 使得在没有云提供商或任何其他配置的情况下使用 LoadBalancer 服务成为可能。
ServiceLB 的工作原理
ServiceLB 控制器监视具有spec.type
字段设置为LoadBalancer
的 Kubernetes服务。
对于每个 LoadBalancer 服务,都会在kube-system
命名空间中创建一个DaemonSet。这个 DaemonSet 又会在每个节点上创建带有svc-
前缀的 ServiceLB Pod。这些 pod 利用主机端口使用服务端口,因此它们只会部署在具有可用该端口的节点上。如果没有任何具有该端口可用的节点,则 LB 将保持 Pending 状态。请注意,只要使用不同的端口,就可以在同一个节点上公开多个服务。
当 ServiceLB Pod 运行在配置了外部 IP 的节点上时,节点的外部 IP 将使用ipMode: VIP
填充到服务的status.loadBalancer.ingress
地址列表中。否则,将使用节点的内部 IP。
如果到外部 IP 的流量受到网络地址转换 (NAT)的影响(例如,在公共云中,当使用节点的公共 IP 作为外部 IP 时),则流量将通过主机端口路由到 ServiceLB pod 中。然后,pod 使用 iptables 将流量转发到服务的 ClusterIP 地址和端口。如果流量不受 NAT 影响,而是以匹配 LoadBalancer 地址的目标地址到达,则流量将被拦截(通常由 kube-proxy iptables 链或 ipvs)并转发到服务的 ClusterIP 地址和端口。
用法
在 K3s 中创建一个类型为 LoadBalancer 的服务。
控制 ServiceLB 节点选择
将svccontroller.k3s.cattle.io/enablelb=true
标签添加到一个或多个节点将 ServiceLB 控制器切换到允许列表模式,在这种模式下,只有具有该标签的节点才符合托管 LoadBalancer pod 的条件。未标记的节点将被排除在 ServiceLB 的使用范围之外。
默认情况下,节点不会被标记。只要所有节点都保持未标记状态,所有具有可用端口的节点都将被 ServiceLB 使用。
创建 ServiceLB 节点池
要选择特定节点子集来托管 LoadBalancer 的 pod,请将enablelb
标签添加到所需节点,并在节点和服务上设置匹配的lbpool
标签值。例如
- 使用
svccontroller.k3s.cattle.io/lbpool=pool1
和svccontroller.k3s.cattle.io/enablelb=true
标记节点 A 和节点 B - 使用
svccontroller.k3s.cattle.io/lbpool=pool2
和svccontroller.k3s.cattle.io/enablelb=true
标记节点 C 和节点 D - 在端口 443 上创建一个带有标签
svccontroller.k3s.cattle.io/lbpool=pool1
的 LoadBalancer 服务。该服务的 DaemonSet 仅将 Pod 部署到节点 A 和节点 B。 - 在端口 443 上创建另一个带有标签
svccontroller.k3s.cattle.io/lbpool=pool2
的 LoadBalancer 服务。该 DaemonSet 仅将 Pod 部署到节点 C 和节点 D。
禁用 ServiceLB
要禁用 ServiceLB,请使用--disable=servicelb
标志配置集群中的所有服务器。
如果您希望运行其他 LB(例如 MetalLB),则需要这样做。
部署外部云控制器管理器
为了减小二进制文件大小,K3s 移除所有“树内”(内置)云提供商。相反,K3s 提供一个嵌入式云控制器管理器 (CCM) 存根,执行以下操作
- 根据
--node-ip
和--node-external-ip
标志设置节点 InternalIP 和 ExternalIP 地址字段。 - 托管 ServiceLB LoadBalancer 控制器。
- 清除当 cloud-provider 设置为
external
时存在的node.cloudprovider.kubernetes.io/uninitialized
污点
在部署外部 CCM 之前,您必须使用 `--disable-cloud-controller` 标志启动所有 K3s 服务器以禁用嵌入式 CCM。
如果您禁用内置 CCM 且未部署和正确配置外部替代方案,节点将保持污染状态且无法调度。