Cilium DSR(转载)
一、环境信息
主机 | IP |
---|---|
ubuntu | 10.0.0.234 |
软件 | 版本 |
---|---|
docker | 26.1.4 |
helm | v3.15.0-rc.2 |
kind | 0.18.0 |
kubernetes | 1.23.4 |
ubuntu os | Ubuntu 22.04.6 LTS |
kernel | 5.15.0-106 内核升级文档 |
使用 5.11.5 内核版本的 20.04 版本,发起 curl 请求无法代理到 pod 上去
curl: (7) Failed to connect to 172.18.0.2 port 32000: Connection refused
,换成了 22.04 默认的 5.15 内核版本,可能是 dsr 对内核有要求
二、Cilium DSR 模式架构对比
传统模式下:
-
外部流量通过 NodePort、ExternalIPs 或 LoadBalancer 访问 Kubernetes 服务,当backend pod运行在与请求发送到的节点不同的节点上时,Kubernetes 工作节点可能会将请求重定向到远程节点。
-
请求将经过 SNAT处理,这也会导致后端不会看到客户端的源 IP 地址。此外,后端的回程报文将通过初始节点(在该节点执行反向 SNAT 转换)再发送回客户端,这会引入额外的网络开销和延迟。
Cilium Direct server return(DSR)模式:
- 虽然Kubernetes 提供了 externalTrafficPolicy=Local,如果接收请求的节点不运行任何后端pod,它会通过删除对服务的请求来保留客户端源 IP 地址(访问失败)。然而,这也会使负载均衡的实现变得更加复杂,并可能导致负载均衡失效。
- 为了解决上述问题从cilium 1.7开始,借助ebpf实现了direct server return,从而加速了南北向流量的通信效率(在向客户端回包时避免额外的一跳),同时也增加了保持客户端源IP特性。
三、Cilium DSR 模式的约束
-
Cilium DSR 不支持在VXLAN模式下运行,只能在native routing模式下运行。UDP报文没有SYN包。对于 TCP 服务,Cilium 仅对 SYN 数据包的服务 IP/端口进行编码
-
由于underlay 网路结构可能会删除 cilium特定的ip包的扩展头信息,因此在某些公共云提供商环境中使用 DSR 模式可能不起作用。
-
在某些实施源/目标 IP 地址检查(例如 AWS)的公共云提供商环境中,必须禁用该检查才能使 DSR 模式正常工作
四、Cilium DSR 模式环境搭建
kind
配置文件信息
root@kind:~# cat install.sh
#!/bin/bash
date
set -v
# 1.prep noCNI env
cat <<EOF | kind create cluster --name=cilium-dsr --image=kindest/node:v1.23.4 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
# kind 默认使用 rancher cni,cni 我们需要自己创建
disableDefaultCNI: true
# kind 安装 k8s 集群需要禁用 kube-proxy 安装,是 cilium 代替 kube-proxy 功能
kubeProxyMode: "none"
nodes:
- role: control-plane
- role: worker
- role: worker
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.evescn.com"]
endpoint = ["https://harbor.evescn.com"]
EOF
# 2.remove taints
controller_node_ip=`kubectl get node -o wide --no-headers | grep -E "control-plane|bpf1" | awk -F " " '{print $6}'`
# kubectl taint nodes $(kubectl get nodes -o name | grep control-plane) node-role.kubernetes.io/master:NoSchedule-
kubectl get nodes -o wide
# 3.install cni
helm repo add cilium https://helm.cilium.io > /dev/null 2>&1
helm repo update > /dev/null 2>&1
helm install cilium cilium/cilium \
--set k8sServiceHost=$controller_node_ip \
--set k8sServicePort=6443 \
--version 1.13.0-rc5 \
--namespace kube-system \
--set debug.enabled=true \
--set debug.verbose=datapath \
--set monitorAggregation=none \
--set ipam.mode=cluster-pool \
--set cluster.name=cilium-dsr \
--set kubeProxyReplacement=strict \
--set tunnel=disabled \
--set autoDirectNodeRoutes=true \
--set ipv4NativeRoutingCIDR="10.0.0.0/8" \
--set bpf.masquerade=true \
--set installNoConntrackIptablesRules=true \
--set loadBalancer.mode=dsr
# 4.install necessary tools
for i in $(docker ps -a --format "table {{.Names}}" | grep cilium)
do
echo $i
docker cp /usr/bin/ping $i:/usr/bin/ping
docker exec -it $i bash -c "sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list"
docker exec -it $i bash -c "apt-get -y update >/dev/null && apt-get -y install net-tools tcpdump lrzsz bridge-utils >/dev/null 2>&1"
done
--set
参数解释
-
--set kubeProxyReplacement=strict
- 含义: 启用 kube-proxy 替代功能,并以严格模式运行。
- 用途: Cilium 将完全替代 kube-proxy 实现服务负载均衡,提供更高效的流量转发和网络策略管理。
-
--set tunnel=disabled
- 含义: 禁用隧道模式。
- 用途: 禁用后,Cilium 将不使用 vxlan 技术,直接在主机之间路由数据包,即 direct-routing 模式。
-
--set autoDirectNodeRoutes=true
- 含义: 启用自动直接节点路由。
- 用途: 使 Cilium 自动设置直接节点路由,优化网络流量。
-
--set ipv4NativeRoutingCIDR="10.0.0.0/8"
- 含义: 指定用于 IPv4 本地路由的 CIDR 范围,这里是
10.0.0.0/8
。 - 用途: 配置 Cilium 使其知道哪些 IP 地址范围应该通过本地路由进行处理,不做 snat , Cilium 默认会对所用地址做 snat。
- 含义: 指定用于 IPv4 本地路由的 CIDR 范围,这里是
-
--set bpf.masquerade
- 含义: 启用 eBPF 功能。
- 用途: 使用 eBPF 实现数据路由,提供更高效和灵活的网络地址转换功能。
-
--set installNoConntrackIptablesRules=true
:- 安装无连接跟踪的 iptables 规则,这样可以减少 iptables 规则集中的连接跟踪负担。
-
--set loadBalancer.mode=dsr
:- 设置负载均衡器(Load Balancer)的模式为 DSR(Direct Server Return),这是一种负载均衡技术,允许负载均衡器将数据包直接发送回源服务器,而不是经过负载均衡器本身。
- 安装
k8s
集群和cilium
服务
root@kind:~# ./install.sh
Creating cluster "cilium-dsr" ...
✓ Ensuring node image (kindest/node:v1.23.4)
标签:set,节点,--,DSR,dsr,cilium,172.18,转载,Cilium
From: https://www.cnblogs.com/evescn/p/18297815