Cilium系列-5-Cilium替换KubeProxy

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

系列文章

前言

将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于:

  • 启用本地路由(Native Routing)
  • 完全替换 KubeProxy
  • IP 地址伪装(Masquerading)切换为基于 eBPF 的模式
  • Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
  • 绕过 iptables 连接跟踪(Bypass iptables Connection Tracking)
  • 主机路由(Host Routing)切换为给予 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • 启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
  • 禁用 Hubble(但是不建议, 可观察性比一点点的性能提升更重要)
  • 修改 MTU 为巨型帧(jumbo frames) (需要网络条件允许)
  • 启用带宽管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
  • 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
  • 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)
  • (高级用户可选)调整 eBPF Map Size
  • Linux Kernel 优化和升级

    • CONFIG_PREEMPT_NONE=y

  • 其他:

    • tuned network-* profiles, 如: tuned-adm profile network-latency 或 network-throughput
    • CPU 调为性能模式
    • 停止 irqbalance,将网卡中断引脚指向特定 CPU

在网络/网卡设备/OS等条件满足的情况下, 我们尽可能多地启用这些调优选项, 相关优化项会在后续文章逐一更新. 敬请期待.
上篇文章我们启用了Cilium本地路由, 启用后对网络吞吐量提升明显.
今天我们来使用 Cilium 完全替换 KubeProxy, 创建一个没有 KubeProxy 的 Kubernetes 集群, 以此来大幅减少 iptables 规则链(还有 netfilter), 从而全方位提升网络性能.
测试环境


  • Cilium 1.13.4
  • K3s v1.26.6+k3s1
  • OS

    • 3台 Ubuntu 23.04 VM, Kernel 6.2, x86

背景

Kubernetes 集群中, 在 Kube Proxy 里大量用到了 iptables, 在 Kubernetes 集群规模较大的情况下, 数以千/万计的 iptables 规则会极大地拖慢 Kubernetes 网络性能, 导致网络请求响应缓慢.
大量 IPTables 规则链的示例如下:

Kube Proxy 的用途

Kube Proxy 的负责以下几个方面的流量路由:

  • ClusterIP: 集群内通过 ClusterIP 的访问
  • NodePort: 集群内外通过 NodePort 的访问
  • ExternalIP: 集群外通过 external IP 的访问
  • LoadBalancer: 集群外通过 LoadBalancer 的访问.
而 Cilium 完全实现了这些功能, 并做到了性能上的大幅提升, 具体 Cilium 官方测试结果如下:

启用了 DSR 后性能会更强:

实施步骤

接下来我们开始实施替换, Cilium 的 eBPF kube-proxy 可在直接路由和隧道模式下进行替换。
重新安装 K3s
  1. # Server Node
  2. curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='--write-kubeconfig-mode=644 --flannel-backend=none --disable-network-policy --disable=servicelb --prefer-bundled-bin --disable-kube-proxy' INSTALL_K3S_VERSION=v1.26.6+k3s1 sh -
复制代码
说明如下:

  • --disable=servicelb K3s servicelb 不是 Kubernetes 的标准组件, 为了减少干扰, 先去掉它.
  • --disable-kube-proxy 禁用 Kube Proxy
重新安装 Cilium

视情况不同, 可能需要卸载 Cilium:
  1. helm uninstall cilium -n kube-system
复制代码
重新安装, 重新安装时直接加上 kubeProxyReplacement 参数:
  1. helm install cilium cilium/cilium --version 1.13.4 \
  2.    --namespace kube-system \
  3.    --set operator.replicas=1 \
  4.    --set k8sServiceHost=192.168.2.43 \
  5.    --set k8sServicePort=6443 \
  6.    --set hubble.relay.enabled=true \
  7.    --set hubble.ui.enabled=true \
  8.    --set tunnel=disabled \
  9.    --set autoDirectNodeRoutes=true \
  10.    --set ipv4NativeRoutingCIDR=10.0.0.0/22 \
  11.    --set kubeProxyReplacement=strict
复制代码
说明如下:

  • kubeProxyReplacement=strict Kube Proxy 替换使用严格模式. 而在默认情况下, Helm 会设置 kubeProxyReplacement=disabled,这只会启用 ClusterIP 服务的群集内负载平衡。
基本信息验证

执行完成后进行验证:
  1. $ kubectl -n kube-system exec ds/cilium -- cilium status | grep KubeProxyReplacement
  2. KubeProxyReplacement:    Strict   [eth0 192.168.2.3 (Direct Routing)]
复制代码
使用 --verbose 查看全部细节:
  1. $ kubectl -n kube-system exec ds/cilium -- cilium status --verbose
  2. ...
  3. KubeProxyReplacement Details:
  4.   Status:                 Strict
  5.   Socket LB:              Enabled
  6.   Socket LB Tracing:      Enabled
  7.   Socket LB Coverage:     Full
  8.   Devices:                eth0 192.168.2.3 (Direct Routing)
  9.   Mode:                   SNAT
  10.   Backend Selection:      Random
  11.   Session Affinity:       Enabled
  12.   Graceful Termination:   Enabled
  13.   NAT46/64 Support:       Disabled
  14.   XDP Acceleration:       Disabled
  15.   Services:
  16.   - ClusterIP:      Enabled
  17.   - NodePort:       Enabled (Range: 30000-32767)
  18.   - LoadBalancer:   Enabled
  19.   - externalIPs:    Enabled
  20.   - HostPort:       Enabled
复制代码
实战验证

接下来, 我们可以创建一个 Nginx 部署。然后,创建一个新的 NodePort 服务,并验证 Cilium 是否正确安装了该服务。
创建 Nginx Deploy:
  1. cat << EOF | kubectl apply -f -
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: my-nginx
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       run: my-nginx
  10.   replicas: 2
  11.   template:
  12.     metadata:
  13.       labels:
  14.         run: my-nginx
  15.     spec:
  16.       containers:
  17.       - name: my-nginx
  18.         image: nginx
  19.         ports:
  20.         - containerPort: 80
  21. EOF
复制代码
同时,我们还可以使用主机名空间中的 iptables 验证是否存在针对该服务的 iptables 规则:
  1. $ kubectl expose deployment my-nginx --type=NodePort --port=80
  2. service/my-nginx exposed
复制代码
上方结果为空, 证明已经没有了 KUBE-SVC 相关的 IPTables 规则.
我们可以使用 curl 对 NodePort ClusterIP PodIP 等进行测试:
  1. $ kubectl get svc my-nginx
  2. NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
  3. my-nginx   NodePort   10.43.204.231   <none>        80:32727/TCP   96s
复制代码
<blockquote>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表