Kube-Router로 BGP 실행하기
Kube-Router로 BGP 실행하기 (deprecated)
이 가이드는 BGP 피어링과 라우트 전파에는 kube-router를, 정책 집행과 로드 밸런싱에는 Cilium을 사용하도록 Cilium과 kube-router를 함께 구성하는 방법을 설명해요.
본문
이 가이드는 Cilium과 kube-router가 협력하도록 구성해서, BGP 피어링과 라우트 전파에는 kube-router를, 정책 집행과 로드 밸런싱에는 Cilium을 사용하는 방법을 설명해요.
Note 이는 베타 기능이에요. 문제가 발생하면 피드백을 주고 GitHub issue를 제출해 주세요.
kube-router 배포 (Deploy kube-router)
kube-router DaemonSet 템플릿을 내려받으세요:
curl -LO https://raw.githubusercontent.com/cloudnativelabs/kube-router/v1.2/daemonset/generic-kuberouter-only-advertise-routes.yaml
generic-kuberouter-only-advertise-routes.yaml 파일을 열고 args: 섹션을 편집하세요. 다음 인자는 반드시 정확히 이 값으로 설정해야 해요:
- "--run-router=true"
- "--run-firewall=false"
- "--run-service-proxy=false"
- "--enable-cni=false"
- "--enable-pod-egress=false"
다음 인자는 선택사항이며 필요에 따라 설정할 수 있어요. 이 가이드를 단순하게 유지하기 위해, 클러스터에서 준비가 가장 적게 필요한 다음 값들을 사용할게요. 자세한 내용은 kube-router user guide를 참고하세요.
- "--enable-ibgp=true"
- "--enable-overlay=true"
- "--advertise-cluster-ip=true"
- "--advertise-external-ip=true"
- "--advertise-loadbalancer-ip=true"
다음 인자는 선택사항이며 외부 라우터와 BGP 피어링을 원한다면 설정해야 해요. 외부에서 라우팅 가능한 Kubernetes Pod 및 Service IP를 원할 때 유용해요. 여기 사용된 값들은 외부 라우터에 구성된 IP와 ASN에 맞게 바꿔야 해요.
- "--cluster-asn=65001"
- "--peer-router-ips=10.0.0.1,10.0.2"
- "--peer-router-asns=65000,65000"
DaemonSet 파일을 적용해 kube-router를 배포하고 올바르게 떠올랐는지 확인하세요:
$ kubectl apply -f generic-kuberouter-only-advertise-routes.yaml
$ kubectl -n kube-system get pods -l k8s-app=kube-router
NAME READY STATUS RESTARTS AGE
kube-router-n6fv8 1/1 Running 0 10m
kube-router-nj4vs 1/1 Running 0 10m
kube-router-xqqwc 1/1 Running 0 10m
kube-router-xsmd4 1/1 Running 0 10m
Cilium 배포 (Deploy Cilium)
라우팅을 kube-router에 위임하려면 터널링/캡슐화를 비활성화해야 해요. 이를 위해 ConfigMap cilium-config에서 routing-mode=native를 설정하거나, DaemonSet을 조정해 cilium-agent를 --routing-mode=native 인자로 실행하면 돼요. 또한 같은 ConfigMap에서 ipam: kubernetes를 명시적으로 설정해야 해요. kube-router가 Pod CIDR을 K8s에서 직접 가져오기 때문이에요:
# Encapsulation mode for communication between nodes
# Possible values:
# - disabled
# - vxlan (default)
# - geneve
routing-mode: "native"
ipam: "kubernetes"
그런 다음 Requirements 섹션의 지침에 따라 Cilium을 설치하면 돼요.
Cilium이 실행 중인지 확인하세요:
$ kubectl -n kube-system get pods -l k8s-app=cilium
NAME READY STATUS RESTARTS AGE
cilium-fhpk2 1/1 Running 0 45m
cilium-jh6kc 1/1 Running 0 44m
cilium-rlx6n 1/1 Running 0 44m
cilium-x5x9z 1/1 Running 0 45m
설치 확인 (Verify Installation)
kube-router가 라우트를 설치했는지 확인하세요:
$ kubectl -n kube-system exec ds/cilium -- ip route list scope global
default via 172.0.32.1 dev eth0 proto dhcp src 172.0.50.227 metric 1024
10.2.0.0/24 via 10.2.0.172 dev cilium_host src 10.2.0.172
10.2.1.0/24 via 172.0.51.175 dev eth0 proto 17
10.2.2.0/24 dev tun-172011760 proto 17 src 172.0.50.227
10.2.3.0/24 dev tun-1720186231 proto 17 src 172.0.50.227
위 예시에서 설치된 라우트의 세 가지 카테고리를 볼 수 있어요:
-
로컬 PodCIDR: 이 라우트는 호스트에서 실행 중인 모든 파드를 가리키며, 이 파드들을 이용 가능하게 만들어요.
10.2.0.0/24 via 10.2.0.172 dev cilium_host src 10.2.0.172
-
BGP 라우트: kube-router가 원격 PodCIDR이 로컬 호스트에 알려진 라우터를 통해 도달 가능하다고 판단하면 이 유형의 라우트가 설치돼요. 캡슐화 없이 파드-파드 트래픽이 해당 라우터로 직접 전달되도록 지시해요.
10.2.1.0/24 via 172.0.51.175 dev eth0 proto 17
-
IPIP 터널 라우트: 직접 라우팅 경로가 없으면 kube-router는 오버레이를 사용해 노드 간 IPIP 터널을 구축해요.
10.2.2.0/24 dev tun-172011760 proto 17 src 172.0.50.22710.2.3.0/24 dev tun-1720186231 proto 17 src 172.0.50.227
설치 검증 (Validate the Installation)
Cilium CLI Manually Cilium CLI의 최신 버전을 설치하세요. Cilium CLI는 Cilium 설치, Cilium 설치 상태 조회, 다양한 기능(예: clustermesh, Hubble) 활성화/비활성화에 사용할 수 있어요.
Linux macOS Other
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}
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "arm64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
shasum -a 256 -c cilium-darwin-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-darwin-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
releases의 전체 페이지를 참고하세요.
Cilium이 제대로 설치됐는지 검증하려면 다음을 실행하면 돼요:
$ cilium status --wait
/¯\
/¯\__/¯\ Cilium: OK
\__/¯\__/ Operator: OK
/¯\__/¯\ Hubble: disabled
\__/¯\__/ ClusterMesh: disabled
\__/
DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2
Deployment cilium-operator Desired: 2, Ready: 2/2, Available: 2/2
Containers: cilium-operator Running: 2
cilium Running: 2
Image versions cilium quay.io/cilium/cilium:v1.9.5: 2
cilium-operator quay.io/cilium/operator-generic:v1.9.5: 2
다음 명령을 실행해 클러스터에 올바른 네트워크 연결성이 있는지 검증하세요:
$ cilium connectivity test
ℹ️ Monitor aggregation detected, will skip some flow validation steps
✨ [k8s-cluster] Creating namespace for connectivity check...
(...)
---------------------------------------------------------------------------------------------------------------------
📋 Test Report
---------------------------------------------------------------------------------------------------------------------
✅ 69/69 tests successful (0 warnings)
Note 연결성 테스트는 파드 하나 이상에서 열린 파일이 너무 많아 배포에 실패할 수 있어요. 이 오류가 보이면 호스트 머신의
inotify리소스 한도를 늘리면 돼요 ("too many open files"로 인한 파드 오류 참고).
축하합니다! Cilium이 탑재된 완전히 동작하는 Kubernetes 클러스터를 갖추셨어요. 🎉
Cilium과 모든 필수 컴포넌트가 설치되는 것을 모니터링할 수 있어요:
$ kubectl -n kube-system get pods --watch
NAME READY STATUS RESTARTS AGE
cilium-operator-cb4578bc5-q52qk 0/1 Pending 0 8s
cilium-s8w5m 0/1 PodInitializing 0 7s
coredns-86c58d9df4-4g7dd 0/1 ContainerCreating 0 8m57s
coredns-86c58d9df4-4l6b2 0/1 ContainerCreating 0 8m57s
모든 컴포넌트가 뜨는 데 몇 분 걸릴 수 있어요:
cilium-operator-cb4578bc5-q52qk 1/1 Running 0 4m13s
cilium-s8w5m 1/1 Running 0 4m12s
coredns-86c58d9df4-4g7dd 1/1 Running 0 13m
coredns-86c58d9df4-4l6b2 1/1 Running 0 13m
"connectivity-check"를 배포해 파드 간 연결성을 테스트할 수 있어요. 이를 위해 별도의 네임스페이스를 만드는 것이 좋아요.
kubectl create ns cilium-test
다음으로 체크를 배포하세요:
kubectl apply -n cilium-test -f https://raw.githubusercontent.com/cilium/cilium/1.20.2/examples/kubernetes/connectivity-check/connectivity-check.yaml
이것은 다양한 연결성 경로를 사용해 서로 연결되는 일련의 deployment를 배포해요. 연결성 경로에는 서비스 로드 밸런싱 유무와 다양한 네트워크 정책 조합이 포함돼요. 파드 이름은 연결성 변형을 나타내고, readiness 및 liveness 게이트는 테스트의 성공/실패를 나타내요:
$ kubectl get pods -n cilium-test
NAME READY STATUS RESTARTS AGE
echo-a-76c5d9bd76-q8d99 1/1 Running 0 66s
echo-b-795c4b4f76-9wrrx 1/1 Running 0 66s
echo-b-host-6b7fc94b7c-xtsff 1/1 Running 0 66s
host-to-b-multi-node-clusterip-85476cd779-bpg4b 1/1 Running 0 66s
host-to-b-multi-node-headless-dc6c44cb5-8jdz8 1/1 Running 0 65s
pod-to-a-79546bc469-rl2qq 1/1 Running 0 66s
pod-to-a-allowed-cnp-58b7f7fb8f-lkq7p 1/1 Running 0 66s
pod-to-a-denied-cnp-6967cb6f7f-7h9fn 1/1 Running 0 66s
pod-to-b-intra-node-nodeport-9b487cf89-6ptrt 1/1 Running 0 65s
pod-to-b-multi-node-clusterip-7db5dfdcf7-jkjpw 1/1 Running 0 66s
pod-to-b-multi-node-headless-7d44b85d69-mtscc 1/1 Running 0 66s
pod-to-b-multi-node-nodeport-7ffc76db7c-rrw82 1/1 Running 0 65s
pod-to-external-1111-d56f47579-d79dz 1/1 Running 0 66s
pod-to-external-fqdn-allow-google-cnp-78986f4bcf-btjn7 1/1 Running 0 66s
Note 연결성 체크를 단일 노드 클러스터에 배포하면 multi-node 기능을 확인하는 파드는
Pending상태로 남아 있어요. 이 파드들은 성공적으로 스케줄링되려면 최소 2개 노드가 필요하므로 예상된 동작이에요.
테스트가 끝나면 cilium-test 네임스페이스를 삭제하세요:
kubectl delete ns cilium-test