KubeCon + CloudNativeCon Europe 2024 :Supercharge Kubernetes Networking with Cilium and IPv6
ปีนี้ได้มีโอกาศไปร่วมงานสัมมนา KubeCon + CloudNativeCon Europe 2024 พบว่า Cilium + eBPF เป็นหัวข้อหนึ่งที่มีคนสนใจมากๆ แบบต้องเข้าไปรอในห้องสัมนาก่อน 30 นาทีเลย
ผมได้เข้าฟัง หัวข้อ
Supercharge Kubernetes Networking with Cilium and IPv6
ของคุณ Daneyon Hansen
หัวข้อนี้เป็นการเพิ่มประสิทธิภาพ ของ kubernetes network โดยใช้ Cilium + IPv6
โดยคุณ Daneyon ใช้ kind ในการ Demo
เริ่มต้นจากสร้าง kind ที่ enable IPv6
แล้ว install cilium ลงไป
cilium install --version v1.15.1 \
--set debug.enabled=true \
--set ipv4.enabled=false \
--set ipv6.enabled=true \
--set routingMode=native \
--set autoDirectNodeRoutes=true \
--set ipv6NativeRoutingCIDR=fd00:10::/32 \
--set bpf.masquerade=true \
--set kubeProxyReplacement=true
Run simple app เพื่อไว้ทดสอบ
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: client
labels:
app: client
spec:
containers:
- name: curl-client
image: curlimages/curl
imagePullPolicy: IfNotPresent
command: ["/bin/sh"]
args: ["-c", "while true; do sleep 1000; done"]
nodeSelector:
kubernetes.io/hostname: kind-control-plane
---
apiVersion: v1
kind: Pod
metadata:
name: server
labels:
app: server
spec:
containers:
- name: server
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/hostname: kind-worker
EOF
ต่อด้วย Demo Hubble และ Network Policy
BIG TCP เป็นเรื่องที่น่าสนใจมาก
IPv6 BIG TCP ช่วยให้สแตกเครือข่ายสามารถจัดการแพ็กเก็ตข้อมูลขาส่งและขารับที่มีขนาดใหญ่ขึ้น (192kb) ซึ่งจะช่วยลดจำนวนครั้งที่ต้องส่งผ่านสแตก ส่งผลให้ประสิทธิภาพและความหน่วงดีขึ้น นอกจากนี้ยังช่วยลดภาระของ CPU และช่วยให้ได้ความเร็วที่สูงขึ้น
เริ่มจากการตรวจสอบว่ายังไม่เปิดใช้งาน
$ cilium config view | grep big
enable-ipv6-big-tcp false
ตรวจสอบค่าปรับตั้ง GSO ของโหนด
for node in kind-control-plane kind-worker; do
echo "$node gso_max_size:"
docker exec $node ip -d -j link show dev eth0 | jq -c '.[0].gso_max_size'
done
kind-control-plane gso_max_size:
65536
kind-worker gso_max_size:
65536
สร้าง netperf client server ไว้ทดสอบ
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: np-server
spec:
containers:
- name: netperf
image: cilium/netperf
imagePullPolicy: IfNotPresent
ports:
- containerPort: 12865
nodeSelector:
kubernetes.io/hostname: kind-worker
---
apiVersion: v1
kind: Pod
metadata:
name: np-client
spec:
containers:
- name: netperf
args:
- sleep
- infinity
image: cilium/netperf
imagePullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/hostname: kind-control-plane
EOF
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
np-client 1/1 Running 0 31s fd00:10:244::96 kind-control-plane <none> <none>
np-server 1/1 Running 0 31s fd00:10:244:1::35b7 kind-worker <none> <none>
...
รันทดสอบ
kubectl exec np-client -- netperf -t TCP_RR -H fd00:10:244:1::35d7 -- -r80000:80000 -O MIN_LATENCY,P90_LATENCY,P99_LATENCY,THROUGHPUT
จะได้ผลทดสอบก่อนเปิดใช้งาน BIG TCP
MIGRATED TCP REQUEST/RESPONSE TEST from ::0 (::) port 0 AF_INET6 to fd00:10:244:1::35d7 () port 0 AF_INET6 : first burst 0
Minimum 90th 99th Throughput
Latency Percentile Percentile
Microseconds Latency Latency
Microseconds Microseconds
86 160 247 7515.80
จากนั้นเปิดใช้งาน BIG TCP
cilium config set enable-ipv6-big-tcp true
cilium status --wait
รอจน “ready” status แล้ว ตรวจสอบค่าปรับตั้ง GSO ของโหนดดูว่ามีการเพิ่ม size จากเดิมหรือไม่
for node in kind-control-plane kind-worker; do echo "$node gso_max_size:"; docker exec $node ip -d -j link show dev eth0 | jq -c '.[0].gso_max_size'; done
kind-control-plane gso_max_size:
196608
kind-worker gso_max_size:
196608
แล้วจึง restart POD
kubectl delete po/np-client --force
kubectl delete po/np-server --force
ทำการทดสอบอีกครั้ง
kubectl exec np-client -- netperf -t TCP_RR -H fd00:10:244:1::e32e -- -r80000:80000 -O MIN_LATENCY,P90_LATENCY,P99_LATENCY,THROUGHPUT
MIGRATED TCP REQUEST/RESPONSE TEST from ::0 (::) port 0 AF_INET6 to fd00:10:244:1::e32e () port 0 AF_INET6 : first burst 0
Minimum 90th 99th Throughput
Latency Percentile Percentile
Microseconds Latency Latency
Microseconds Microseconds
45 106 152 14370.36
จะเห็นได้ว่าหลังจากเปิดใช้งาน BIG TCP Throughput ได้เพิ่มขึ้นมาพอสมควร เมื่อได้เห็นผลทดสอบแล้วทำให้ Cilium + IPv6 นี่สนใจมากในการนำมาปรับใช้งานกับ kubernetes cluster มากๆๆครับ