[k8s] CNI: Cilium (with k3s)
Cilium์ ๊ทผ๋์ ๊ฐ์ฅ ํซํ ์ฟ ๋ฒ์ฉ ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ์ด๋ค. ๋น ๋ฅธ ์ฑ๋ฅ๊ณผ ํ๋ฃกํ ๊ด์ธก์ฑ, ๋คํธ์ํฌ ๋ถ๊ฐ๊ธฐ๋ฅ๋ค์ ์ฅ์ ์ผ๋ก ๋ด์ธ์ด๋ค.
2018๋ ์ ๋์๊ณ , ๋น ๋ฅด๊ฒ CNI ํ๊ฒฝ์ ์ก์๋จน๊ณ ์๋ค.
๋๋ถ๋ถ์ ๋คํธ์ํฌ ๊ธฐ๋ฅ๋ค์ ์ฌ์ธ์-์คํ์์ค๋ก ์ ๊ณตํ๋ค. ๊ทธ๋์ ๋ฐํ์์ค๋ผ ์ํฐํ๋ผ์ด์ฆ ์ฌ์ฉ์ด ๊ฐ์ ๋๋ calico์ ๊ฐ๋ ฅํ ๋์์ผ๋ก ๋ถ์ํ๊ณ ์๋ค.
์ฌ๊ธฐ์๋ cilium์ ์ญํ ๊ณผ ๊ธฐ๋ฅ. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ๋ฐฉ๋ฒ ์ ๋๋ง ์ ๋ฆฌํด๋ณธ๋ค.
ํน์ง
๋ค๋ฅธ CNI ์คํ(ํนํ calico)๊ณผ ์ฐจ๋ณํ๋๋ ํน์ง๋ค์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
eBPF
์ปค๋ ๊ธฐ๋ฅ์ธ eBPF๋ฅผ ํ์ฉํด์ ์ปจํ
์ด๋๊ฐ-๋
ธ๋๊ฐ ํต์ ๋ฑ์ ์์ฃผ ํจ์จ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
https://blog.naver.com/sssang97/223412427281
์์ฒด ๊ด์ธก์ฑ ๋๊ตฌ
์์ฒด ๊ด์ธก์ฑ ๋๊ตฌ์ธ hubble์ ์ง์ํ๋ค. ํจํท ํ๋ฆ์ ํ๋์ ๋ณด๊ธฐ ์ฝ๋ค.
์คํ์์ค
calico์ฒ๋ผ ๊ธฐ๋ฅ์ผ๋ก ์ฅ๋์น๋ ๊ทธ๋ฐ ์คํ์์ค๊ฐ ์๋๊ณ , ์ค์ํ ๊ฑฐ์ ๋๋ถ๋ถ์ ๊ณ ๊ธ๊ธฐ๋ฅ์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฌผ๋ก ์ด๊ฒ๋ ์ํฐํ๋ผ์ด์ฆ ์๋ฃจ์
์ด ์๊ธด ํ๋ฐ, ์ด์ง๊ฐํ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค ์คํ์์ค๋ก ํ์ด๋จ๋ค.
์ง์ํ๋ ๊ธฐ๋ฅ๊ณผ ์ญํ
- CNI์ ๊ธฐ๋ณธ ์ญํ : Pod์ IP๋ฅผ ๋ถ์ด๊ณ ๋ผ์ฐํ ์ค์ ๊น์ง ํด์ค๋ค.
- datapath ์ฑ ์: ๋ ธ๋๊ฐ ํต์ ์ ์ฑ ์์ง๋ค. (flannel๋ฅผ ๋์ฒด)
- kube-proxy ๋์ฒด: kube-proxy๋ฅผ ์์ ํ ๋์ฒดํ ์ ์๋ค. iptable ๊ด๋ฆฌ๋ฅผ ์ฑ ์์ง๋ค.
- Service LB ์ฑ ์: ๊ธฐ๋ณธ ์๋น์ค ๋ก๋๋ฐธ๋ฐ์์ ๋์๊ณผ ๋ถ์ฐ๋ ์ฑ ์์ง๋ค. (MetalLB๋ ๋์ฒด ๊ฐ๋ฅ)
- NetworkPolicy: NetworkPolicy๋ฅผ ์ด์ฉํ ๋ฐฉํ๋ฒฝ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
- Service Mesh: ์ ๋นํ ์์ค์ Mesh ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. (istio๋ฅผ ๋ถ๋ถ ๋์ฒด)
- Ingress: ์์ฒด Ingress ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- Egress: Egress SNAT ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- Egress Gateway: Egress NAT ์๋ฒ๋ฅผ ๊ตฌ์ฑํด์ ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ซ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ด ์ ๋๊ณ , ์ด์ธ์๋ ๋ค์ํ ๋ถ๊ฐ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค.
cilium CLI ์ค์น (์ ํ)
cilium ์ ์ฉ CLI๋ฅผ ์ค์นํ๋ฉด cilium ํ๋ฌ๊ทธ์ธ ์ค์น๋ ๊ด๋ฆฌ ๋ฑ์ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋ค.
๋ค๋ง ์ด๊ฒ ํ์๋ ์๋๋ค. ์ด๊ฑฐ ์์ด๋ ์ค์นํ๊ณ ์ด์ํ ์ ์๋ค. ํนํ ๊ธฐ์กด ํด๋ฌ์คํฐ์ cilium์ ์ค์นํ๋๊ฑฐ๋ผ๋ฉด ์ด๊ฑด ๋ณ๋ก ๋์์ด ์๋๋ค.
bash์์
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
fish์์
set CILIUM_CLI_VERSION (curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
set CLI_ARCH amd64
if test (uname -m) = "aarch64"
set CLI_ARCH arm64
end
curl -LO https://github.com/cilium/cilium-cli/releases/download/$CILIUM_CLI_VERSION/cilium-linux-$CLI_ARCH.tar.gz
curl -LO https://github.com/cilium/cilium-cli/releases/download/$CILIUM_CLI_VERSION/cilium-linux-$CLI_ARCH.tar.gz.sha256sum
sha256sum --check cilium-linux-$CLI_ARCH.tar.gz.sha256sum
sudo tar -C /usr/local/bin -xzvf cilium-linux-$CLI_ARCH.tar.gz
rm cilium-linux-$CLI_ARCH.tar.gz cilium-linux-$CLI_ARCH.tar.gz.sha256sum
์ค์นํ๊ณ
cilium version --client
์ด๋ ๊ฒ ์คํ์ด ๋๋ฉด ๋๋ค.
์ ๊ท ํด๋ฌ์คํฐ์ ์ค์นํ๊ธฐ
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์, ํด๋ฌ์คํฐ๋ฅผ ์ด๊ธฐํํ ๋ CNI๋ฅผ cilium์ผ๋ก ๋ชป๋ฐ๊ณ ์์ํ๋ ๊ฒ์ด๋ค.
์ด๊ฒ ๊ธฐ์กด CNI๋ datapath๋ฅผ ๋์ฒดํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ผ๋จ ๋นํ์ฑํํ ์ฑ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด๊ธฐํํด์ผํ๋ค.
k3s์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์นํ ์ ์๋ค.
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC='--flannel-backend=none --disable-network-policy' sh -
๋จผ์ ๋ค ๋นํ์ฑํํ์ฑ๋ก ๊น๊ณ
cilium CLI๋ฅผ ํตํด ์ค์นํ๋ฉด ๋๋ค.
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
cilium install 1.20.2
๋ค๋ง ์ด ๋ฐฉ์์ ๊ธฐ์กด ํด๋ฌ์คํฐ์ ์ฌ์ฉํ ์ ์๊ณ , ์ธํ ๊ฐ ์กฐ์ ๋ ์ข ๋ถํธํ๋ค๋ ๋จ์ ์ด ์๋ค.
๊ธฐ์กด ํด๋ฌ์คํฐ์ ๊น๊ธฐ (k3s)
๊ธฐ์กด k3s ํด๋ฌ์คํฐ์ cilium์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๋ค.
์ด๊ฑด ๋ค์ดํ์์ ์ข ๊ฐ์ํด์ผํ๋ค.
๋จผ์ control plane ์์ด์ ํธ์ ์ค์ ๊ฐ์ ๋ฐ๊พธ๊ณ systemd๋ก ์ฌ๋ถํ ์ ํด์ค๋ค.
sudo mkdir -p /etc/rancher/k3s
sudo vim /etc/rancher/k3s/config.yaml
...
flannel-backend: none
disable-network-policy: true
disable-kube-proxy: true

์์ด์ ํธ ๋ ธ๋๋ ๊ฑด๋ค ํ์ ์๋ค. ์ปจํธ๋กคํ๋ ์ธ๋ง ๋ฐ๊พธ๋ฉด ๋๋ค.
sudo systemctl restart k3s # ๋ง์คํฐ๋
ธ๋
์ฌ๊ธฐ๊น์ง ์๋ค๋ฉด CLI๋ ์ธ๋ชจ์๊ณ , helm์ ํตํด์ ์ค์นํ๋๊ฒ ์ ์ผ ํธํ๋ค.
๋จผ์ values๋ฅผ ์ค๋นํ๊ณ , ์์ IP๋ฅผ ์ฑ์๋๋ค.
# โโ kube-proxy ๊ต์ฒด โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Egress Gateway ์ ์ ์กฐ๊ฑด. BPF ๋ก Service โ Backend ๋ก๋๋ฐธ๋ฐ์ฑ ์ํ.
kubeProxyReplacement: true
# kube-proxy ๊ฐ ์์ผ๋ฏ๋ก Cilium agent ๊ฐ API ์๋ฒ ์ฃผ์๋ฅผ ์ง์ ์์์ผ ํจ.
# control-plane์ LAN IP + k3s ๊ธฐ๋ณธ ํฌํธ.
k8sServiceHost: 192.168.88.202 # ์์์ ๋ฐ๊พธ์์ค
k8sServicePort: 6443
# โโ CNI ๊ต์ฒด ๋ชจ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ์ค์น ์ ๊ธฐ์กด flannel CNI ์ค์ ํ์ผ (/etc/cni/net.d/*) ์ Cilium ๊ฒ์ผ๋ก ๊ต์ฒด.
cni:
exclusive: true
# โโ IPAM โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# "kubernetes" = ๊ฐ ๋
ธ๋์ .spec.podCIDR ์ ๊ทธ๋๋ก ์ฌ์ฉ.
# ๊ธฐ์กด ํ ๋น (macmini-1: 10.42.0.0/24, macmini-2: 10.42.1.0/24,
# mini-pc-1: 10.42.2.0/24) ์ ์ง.
ipam:
mode: kubernetes
# โโ BPF โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# masquerade: Pod โ ์ธ๋ถ ํธ๋ํฝ SNAT ๋ฅผ iptables ๋์ BPF ๋ก. Egress GW ํ์์กฐ๊ฑด.
# distributedLRU: 1.17+ ํ
ํ๋ฆฟ์ด nil ์ฒดํฌ ์ ํด์ ๋ช
์ ํ์. ๊ธฐ๋ณธ off ์ ์ง.
bpf:
masquerade: true
distributedLRU:
enabled: false
# โโ Egress Gateway โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๊ธฐ๋ฅ ํ๋๊ทธ. CiliumEgressGatewayPolicy ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์๋ฌด ์์
์ ํจ.
# ์ค์น ํ ์๋น์ค๋ณ๋ก policy + pod label ๋ก opt-in.
egressGateway:
enabled: true
# โโ L7 Proxy โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Hubble L7 ๋ฉํธ๋ฆญ/HTTP NetworkPolicy ์ฉ.
l7Proxy: true
# โโ Standalone DNS Proxy โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 1.17+ ํ
ํ๋ฆฟ์ด nil ์ฒดํฌ ์ ํด์ ๋ช
์ ํ์. ๊ธฐ๋ณธ off ์ ์ง.
standaloneDnsProxy:
enabled: false
# โโ Hubble (๊ด์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
hubble:
enabled: true
relay:
enabled: true
# 1.17+ ํ
ํ๋ฆฟ์ด logOptions.format nil ์ฒดํฌ ์ ํด์ ๋ช
์ ํ์.
logOptions:
format: json
ui:
enabled: true
metrics:
enabled:
- dns
- drop
- tcp
- flow
- port-distribution
- icmp
๊ทธ๋ฆฌ๊ณ ์ฆ์ ์ค์นํ๋ค.
helm repo add cilium https://helm.cilium.io/
helm repo update
helm install cilium cilium/cilium --namespace kube-system --version 1.20.2 -f values.yaml

๊ทธ๋ฆฌ๊ณ pod๊ฐ ์ ์ค์ผ์ค๋ง๋๋์ง ํ์ธํ๋ค. ๋ธ๋ ค์ค๋ ๋ฆฌ์์ค๊ฐ ์ ๋ฒ ๋ง๋ค.
kubectl get all -A -l app.kubernetes.io/part-of=cilium

๊ทธ๋ฆฌ๊ณ ๋์ ๊ธฐ์กด Pod๋ค๋ ์ฌ์คํํด์ค์ผ ํ๋ค.
๊ธฐ์กด Pod๋ค์ ๊ตฌ ๋คํธ์ํฌ ๊ณ์ธต(flannel ๋ฑ)์ผ๋ก ์คํ๋๊ณ ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋คํธ์ํฌ ์์ ์ฑ์ด ํ์คํ ๊ฒ์ฆ๋๋ฉด, ๊ทธ ๋ค์ ์ฌ์คํ์ ๊ฐ์ ๋ก ๋๋ ค์ค๋ค.
for ns in argocd kube-system envoy-gateway-system observability curhouse app arc-systems arc-runners default; do
echo "=== $ns ==="
kubectl -n $ns rollout restart deploy,ds,sts 2>/dev/null | grep -v "no resources"
doneํธ๋ฌ๋ธ์ํ : ๋คํธ์ํฌ ํ์ธ
์ ์ค์น๋์๋ค๋ฉด ์ธ๋ถ์ ์๊น์ง ๋ค ์ ๋์ด์ผํ๋ค. ๋ค์์ DNS ์ฒดํฌ์ฉ ์คํฌ๋ฆฝํธ๋ค.
kubectl run t --rm -i --restart=Never --image=alpine:3.20 -- sh -c '
echo "-- cluster DNS --"
nslookup kubernetes.default.svc.cluster.local 2>&1 | tail -4
echo "-- external DNS --"
nslookup github.com 2>&1 | tail -3
echo "-- external TCP --"
nc -zvw3 github.com 443 2>&1
'

ํน์, cilium CLI๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข๋ค. ์ด๊ฑด ๋ชจ๋ ๋คํธ์ํฌ ๊ฑด์ ์ฑ์ ํ์ธํด์ค๋ค.
์ธ๋ถ ์ธํฐ๋ท ํต์ , ๋
ธ๋๊ฐ ํต์ , pod๊ฐ ํต์ ์ ํฌํจํด์ ๊ท์ฐฎ์ ๋ชจ๋ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ํ์ธํด์ฃผ๊ธฐ ๋๋ฌธ์, ๊ฝค ๊ด์ฐฎ๋ค.
cilium connectivity test --test-concurrency 2

๊ทผ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์์๊ฒ ์ ๋ฆฌํด์ฃผ์ง ์๋๋ค.
ํธ๋ฌ๋ธ์ํ : flannel ์์กด ์ ๊ฑฐ
๊ฐ๋ flannel์ด๋ ์์ cilium์ ๋ถ์ฐ๋ฌผ์ด ๊ตฌ์ฑ์ ๋ฐฉํดํด์ ๋ป๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๊ทธ๋ด ๋๋ ์ ๋นํ ๊ธฐ์กด ์ธํ
์ ์ง์์ค์ผ ํ๋ค. ๋ค์์ ์คํฌ๋ฆฝํธ์ฑ daemonset์ด๋ค.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cilium-cleanup
namespace: kube-system
spec:
selector:
matchLabels:
app: cilium-cleanup
template:
metadata:
labels:
app: cilium-cleanup
spec:
hostNetwork: true
tolerations:
- operator: Exists
containers:
- name: c
image: alpine:3.20
command:
- sh
- -c
- |
chroot /host sh -c '
# Cilium ๋๋ฐ์ด์ค
ip link del cilium_vxlan 2>/dev/null
ip link del cilium_net 2>/dev/null
ip link del cilium_host 2>/dev/null
ip link del cilium_wg0 2>/dev/null
# flannel ๋๋ฐ์ด์ค
ip link del flannel.1 2>/dev/null
ip link del cni0 2>/dev/null
# cni0 ์ ๋ถ์ด์๋ veth ๋ค
for v in $(ip -o link show | awk -F: "/@if[0-9]+/ {print \$2}" | awk -F@ "{print \$1}" | grep -E "^(veth|lxc)"); do
ip link del $v 2>/dev/null
done
# ์ํ ๋๋ ํ ๋ฆฌ + BPF fs + CNI ์ค์
rm -rf /var/run/cilium /var/lib/cilium
rm -rf /sys/fs/bpf/tc /sys/fs/bpf/cilium
rm -f /etc/cni/net.d/*flannel* /etc/cni/net.d/*cilium*
'
echo "done on $(hostname)"
sleep 3600
securityContext:
privileged: true Jump to bottom (ctrl+End) โ
volumeMounts:
- name: host Jump to bottom (ctrl+End) โ
mountPath: /host
volumes: Jump to bottom (ctrl+End) โ
- name: host
hostPath: Jump to bottom (ctrl+End) โ
path: /๊ด์ธก์ฑ ๋๊ตฌ: hubble
cilium์ ๋ผ์ฐํ ์ eBPF ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ, ๊ทธ ๊ณผ์ ์์ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ๋ ํจ์จ์ ์ผ๋ก ์์์ ๋ณด์ฌ์ค ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค. ๊ทธ๋์ Pod๊ฐ ๋คํธ์ํฌ ์ด๋์
์๋น์ค๋ฅผ ๋ณด๋ฉด ์ด๋ ๊ฒ ์๋๋ฐ
์ฌ๊ธฐ์ ์น UI๋ hubble-ui๋ผ๋ ๋
์์ด๋ค.
ํฌํธํฌ์๋ฉํ๊ฑฐ๋ ํฐ๋ ์ด์ด์ ๋ค์ด๊ฐ๋ฉด
์ด๋ ๊ฒ ๋จ๋๋ฐ
๋ค์์คํ์ด์ค ๊ณ ๋ฅด๋ฉด ์ด๋ ๊ฒ ํ๋์ ๊ทธ๋ํ๋ก ๋ณด์ฌ์ค๋ค.
์๋์์๋ ์ค์๊ฐ ํธ๋ํฝ์ด ๋น ๋ฅด๊ฒ ์ฌ๋ผ์จ๋ค.
์ข ๋ํ
์ผํ๊ฒ ์กฐ์ ํด์ ๋ณด๊ณ ์ถ๋ค๋ฉด hubble-CLI๋ฅผ ์ค์นํ๊ณ ๋ฆด๋ ์ด ์ด์ด์ ๋ณด๋ฉด ๋๋ค.
์์ธํ ๊ฒ์ ๋ณ๋ ํฌ์คํธ์์ ๋ค์ ์ ๋ฆฌํ๊ฒ ๋ค.
์ฐธ์กฐ
https://cilium.io/
https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/
https://blog.naver.com/sssang97/223412427281