首页 > 其他分享 >Cilium系列-5-Cilium替换KubeProxy

Cilium系列-5-Cilium替换KubeProxy

时间:2023-07-26 10:24:27浏览次数:34  
标签:iptables 启用 KubeProxy 替换 Cilium -- NodePort cilium

系列文章

前言

将 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-latencynetwork-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 规则链的示例如下:

So Many Iptables Rules

Kube Proxy 的用途

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

  1. ClusterIP: 集群内通过 ClusterIP 的访问
  2. NodePort: 集群内外通过 NodePort 的访问
  3. ExternalIP: 集群外通过 external IP 的访问
  4. LoadBalancer: 集群外通过 LoadBalancer 的访问.

而 Cilium 完全实现了这些功能, 并做到了性能上的大幅提升, 具体 Cilium 官方测试结果如下:

NodePort Latency Performance

启用了 DSR 后性能会更强:

NodePort Latency Performance with DSR

实施步骤

接下来我们开始实施替换, Cilium 的 eBPF kube-proxy 可在直接路由和隧道模式下进行替换。

重新安装 K3s

# Server Node
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:

helm uninstall cilium -n kube-system

重新安装, 重新安装时直接加上 kubeProxyReplacement 参数:

helm install cilium cilium/cilium --version 1.13.4 \
   --namespace kube-system \
   --set operator.replicas=1 \
   --set k8sServiceHost=192.168.2.43 \
   --set k8sServicePort=6443 \
   --set hubble.relay.enabled=true \
   --set hubble.ui.enabled=true \
   --set tunnel=disabled \
   --set autoDirectNodeRoutes=true \
   --set ipv4NativeRoutingCIDR=10.0.0.0/22 \
   --set kubeProxyReplacement=strict

说明如下:

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

基本信息验证

执行完成后进行验证:

$ kubectl -n kube-system exec ds/cilium -- cilium status | grep KubeProxyReplacement
KubeProxyReplacement:    Strict   [eth0 192.168.2.3 (Direct Routing)]

使用 --verbose 查看全部细节:

$ kubectl -n kube-system exec ds/cilium -- cilium status --verbose
...
KubeProxyReplacement Details:
  Status:                 Strict
  Socket LB:              Enabled
  Socket LB Tracing:      Enabled
  Socket LB Coverage:     Full
  Devices:                eth0 192.168.2.3 (Direct Routing)
  Mode:                   SNAT
  Backend Selection:      Random
  Session Affinity:       Enabled
  Graceful Termination:   Enabled
  NAT46/64 Support:       Disabled
  XDP Acceleration:       Disabled
  Services:
  - ClusterIP:      Enabled
  - NodePort:       Enabled (Range: 30000-32767)
  - LoadBalancer:   Enabled
  - externalIPs:    Enabled
  - HostPort:       Enabled

实战验证

接下来, 我们可以创建一个 Nginx 部署。然后,创建一个新的 NodePort 服务,并验证 Cilium 是否正确安装了该服务。

创建 Nginx Deploy:

cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

下一步,为这两个实例创建一个 NodePort 服务:

$ kubectl expose deployment my-nginx --type=NodePort --port=80
service/my-nginx exposed

查看 NodePort 服务端口等信息:

$ kubectl get svc my-nginx
NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
my-nginx   NodePort   10.43.204.231   <none>        80:32727/TCP   96s

借助 cilium service list 命令,我们可以验证 Cilium 的 eBPF kube-proxy 替代程序是否创建了新的 NodePort 服务。在本例中,创建了端口号为 32727 的服务(位于网卡设备 eth0):

$ kubectl -n kube-system exec ds/cilium -- cilium service list
ID   Frontend             Service Type   Backend
...
32   192.168.2.3:32727    NodePort       1 => 10.0.0.70:80 (active)
                                         2 => 10.0.2.96:80 (active)
33   0.0.0.0:32727        NodePort       1 => 10.0.0.70:0 (active)
                                         2 => 10.0.2.96:80 (active)

同时,我们还可以使用主机名空间中的 iptables 验证是否存在针对该服务的 iptables 规则:

casey@cilium-62-1:~$ sudo iptables-save | grep KUBE-SVC
[sudo] casey 的密码:
casey@cilium-62-1:~$

上方结果为空, 证明已经没有了 KUBE-SVC 相关的 IPTables 规则.

我们可以使用 curl 对 NodePort ClusterIP PodIP 等进行测试:

node_port=$(kubectl get svc my-nginx -o=jsonpath='{@.spec.ports[0].nodePort}')
# localhost+NodePort
curl 127.0.0.1:$node_port
# eth0+NodePort
curl 192.168.2.3:$node_port
# ClusterIP
curl 10.43.204.231:80
# 本机PodIP
curl 10.0.0.70:80
# 其他Node PodIP
curl 10.0.2.96:80

标签:iptables,启用,KubeProxy,替换,Cilium,--,NodePort,cilium
From: https://www.cnblogs.com/east4ming/p/17581739.html

相关文章

  • python批量替换文件名中的字符
    Python批量替换文件名中的字符作为一名经验丰富的开发者,你要教一位刚入行的小白如何实现“Python批量替换文件名中的字符”。在本文中,我将介绍整个流程,并提供代码示例,以帮助这位小白快速理解和掌握该技巧。流程概览实现批量替换文件名中的字符可以分为以下几个步骤:获取目标文......
  • Beanshell 替换和大小写转换
    #d15ac656-d917-4eb4-bf81-029080e16fad转成D15AC656D9174EB4BF81029080E16FADStringMEM_AcctId="d15ac656-d917-4eb4-bf81-029080e16fad";Stringnew_MEM_AcctId=MEM_AcctId.replaceAll("-","");StringUp_MEM_AcctId=new_MEM_Acc......
  • Cilium系列-4-Cilium本地路由
    系列文章Cilium系列文章前言在前文中我们提到,ciliuminstall默认安装后,Cilium功能启用和禁用情况如下:datapathmode:tunnel:因为兼容性原因,Cilium会默认启用tunnel(基于vxlan)的datapatch模式,也就是overlay网络结构。KubeProxyReplacement:DisabledCil......
  • Cilium 系列-3-Cilium 的基本组件和重要概念
    系列文章Cilium系列文章前言安装完了,我们看看Cilium有哪些组件和重要概念。Cilium组件如上所述,安装Cilium时,会安装几个运行组件(有些是可选组件),它们各是什么用途?CiliumOperatorCiliumOperator可以理解为Cilium的管理平面或操作运维平面。CiliumOperator不......
  • 正则表达式之子表达式与分组替换
    参考地址一、正则表达式元字符字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,’n’匹配字符“n”。’\n’匹配一个换行符。序列'\\'匹配“\”而"\("则匹配“(“。^匹配输入字符串的开始位置。如......
  • java替换中文分号
    替换中文分号的步骤为了帮助刚入行的小白实现“java替换中文分号”,我将提供以下步骤来完成这个任务。每个步骤都将包含必要的代码和代码注释,以便小白能够理解和实施。步骤1:导入必要的类和包在开始替换中文分号之前,我们需要导入java.io和java.util包中的类。importjava.io.......
  • jquery替换当前页面
    jQuery替换当前页面在Web开发中,有时候我们需要动态地替换当前页面的内容,而不需要重新加载整个页面。这可以通过使用jQuery来实现。jQuery是一个广泛应用于前端开发的JavaScript库,它简化了DOM操作、事件处理、动画效果等任务。为什么需要替换当前页面在Web应用中,有时候我们需要根......
  • Cilium 系列-2-Cilium 快速安装
    系列文章Cilium系列文章前言在本章中,我们将直接将Cilium安装到Kubernetes集群中。在实验中,我们用到的组件及版本为:Cilium1.13.4K3sv1.26.6+k3s1OSDebian10,Kernel4.19.232,arm64Ubuntu23.04,Kernel6.2,x86......
  • python方法遍历文件a.txt,并将所有的“好”字替换为“张三”,并另存为b.txt
    Python方法遍历文件并替换指定内容在Python中,我们可以使用各种方法来遍历文件和操作文件内容。本文将介绍如何使用Python来遍历文件,并将其中的指定内容进行替换,并将处理后的内容保存为新的文件。1.打开文件首先,我们需要打开文件并读取文件内容。使用Python的open()函数可以轻松......
  • python替换特殊符号
    Python替换特殊符号在Python的字符串处理中,有时候需要替换特殊符号,例如删除或替换字符串中的标点符号、空格等。本文将介绍如何使用Python来替换特殊符号,并提供代码示例来帮助读者更好地理解。什么是特殊符号特殊符号是指在文本中具有特殊含义的字符,例如标点符号、空格、制表符......