多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] Kubernetes 集群中, 在 Kube Proxy 里大量用到了 iptables, 在 Kubernetes 集群规模较大的情况下, 数以千/万计的 iptables 规则会极大地拖慢 Kubernetes 网络性能, 导致网络请求响应缓慢. # Kube Proxy 的用途 Kube Proxy 的负责以下几个方面的流量路由: 1. ClusterIP: 集群内通过 ClusterIP 的访问 2. NodePort: 集群内外通过 NodePort 的访问 3. ExternalIP: 集群外通过 external IP 的访问 4. LoadBalancer: 集群外通过 LoadBalancer 的访问. 以上功能 cilium 均已实现,并且性能更加强悍。 # cilium与kubeProxy性能对比 Cilium 完全实现了 kube-proxy 功能, 并做到了性能上有所提升, 具体 [Cilium 官方测试结果](https://cilium.io/blog/2019/08/20/cilium-16/) >[info] 下图显示了通过 Kubernetes 服务发送到远程主机上运行的 nginx Pod 的每个 HTTP GET 请求的延迟(越低越好),使用 `ab` 发送 100,000 个连续请求来测量。 正如我们所看到的,eBPF 服务实现不依赖于集群中部署的服务数量,而使用 iptables 的 kube-proxy 实现却依赖于集群中部署的服务数量。 ![](https://cilium.io/static/81bd650b0c6e51860472f409e3c03d37/21910/k8s-service-benchmark.png) 在 [Google文档](https://docs.google.com/presentation/d/1cZJ-pcwB9WG88wzhDm2jxQY4Sh8adYg0-N3qWQ8593I/edit?pli=1#slide=id.g708c5740c0_0_216) 找到提及多个转发(iptables, ipvs, eBPF)方式对比结果。该文档创建者也是撰写 [cilium官网替换kube-proxy性能提升](https://cilium.io/blog/2019/08/20/cilium-16/) 的两位测试之中的一员。数据估计是可靠的 ![](https://img.kancloud.cn/4a/68/4a6828f17d60edc7312592fe80bf0d8a_911x487.png) >[info] 从这个结果来看,kubeProxy中 ipvs 模式与 eBPF 相差不远。两者都不会跟随 Service 增加而降低性能 # 实施 cilium 替换 kube-proxy ## 前提条件 - Cilium 的 kube-proxy 替换依赖于 socket-LB 功能,这需要 v4.19.57、v5.1.16、v5.2.0 或更高版本的 Linux 内核 ## 逐步替换节点 1. kube-proxy 设置节点反亲和性 ```shell $ kubectl -n kube-system patch daemonset kube-proxy --patch '{"spec": {"template": {"spec": {"affinity": {"nodeAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions": [{"key": "io.cilium.migration/kube-proxy-replacement", "operator": "NotIn", "values": ["strict"]}]}]}}}}}}}' ``` 2. 设置cilium节点配置 ```shell $ cat <<EOF | kubectl apply --server-side -f - apiVersion: cilium.io/v2alpha1 kind: CiliumNodeConfig metadata: namespace: kube-system name: kube-proxy-replacement-strict spec: nodeSelector: matchLabels: io.cilium.migration/kube-proxy-replacement: strict defaults: kube-proxy-replacement: strict kube-proxy-replacement-healthz-bind-address: "0.0.0.0:10256" EOF ciliumnodeconfig.cilium.io/kube-proxy-replacement-strict serverside-applied ``` 3. 节点禁止调度 ```shell $ export NODE=192.168.32.127 $ kubectl cordon $NODE ``` 4. 节点设置label ```shell $ export NODE=192.168.32.127 $ kubectl label node $NODE --overwrite 'io.cilium.migration/kube-proxy-replacement=strict' ``` 5. 重启cilium ```shell $ export NODE=192.168.32.127 $ kubectl -n kube-system delete pod -l k8s-app=cilium --field-selector spec.nodeName=$NODE ``` 6. 确认cilium启动参数 ```shell $ export NODE=192.168.32.127 $ kubectl -n kube-system exec $(kubectl -n kube-system get pod -l k8s-app=cilium --field-selector spec.nodeName=$NODE -o name) -c cilium-agent -- cilium config get kube-proxy-replacement $ kubectl -n kube-system exec $(kubectl -n kube-system get pod -l k8s-app=cilium --field-selector spec.nodeName=$NODE -o name) -c cilium-agent -- cilium status --verbose ... KubeProxyReplacement Details: Status: Strict Socket LB: Enabled Socket LB Tracing: Enabled Socket LB Coverage: Full Devices: ens33 192.168.32.127 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 ... ``` 7. 节点运行调度 ```shell $ export NODE=192.168.32.127 $ kubectl uncordon $NODE ``` 8. 逐步替换其他节点 替换其他节点,只需从第 `3-7` 步执行。将 NODE 变量改成需要替换的k8s节点名称 9. 修改cilium配置文件 >[info] 集群中所有节点都替换完成后才执行此步骤 ```shell # 获取当前版本号 cilium_version=$(helm -n kube-system ls | awk '/cilium/ {print $NF}') echo $cilium_version # 备份上一次安装的参数 helm -n kube-system get values cilium > cilium_custom.yaml sed -i '1d' cilium_custom.yaml # 添加参数 cat <<EOF | tee -a cilium_custom.yaml >> /dev/null # 在 Cilium BPF 数据路径中配置 kube-proxy 替换 kubeProxyReplacement: "strict" # 用于 kube-proxy 替换的 healthz 服务器绑定地址 kubeProxyReplacementHealthzBindAddr: "0.0.0.0:10256" EOF # 修改参数 helm -n kube-system upgrade cilium cilium/cilium --version $cilium_version -f cilium_custom.yaml ``` 10. 删除cilium节点配置 ```shell $ kubectl -n kube-system delete ciliumnodeconfig kube-proxy-replacement-strict ``` 11. 卸载kube-proxy服务 ```shell $ kubectl -n kube-system delete ds kube-proxy $ kubectl -n kube-system delete cm kube-proxy $ iptables-save | grep -v KUBE | iptables-restore ``` 12. 取消节点 label 标签 ```shell $ kubectl label node --all --overwrite 'io.cilium.migration/kube-proxy-replacement-' ```