Kube-Router로 BGP 실행하기

Kube-Router로 BGP 실행하기 (deprecated)

이 가이드는 BGP 피어링과 라우트 전파에는 kube-router를, 정책 집행과 로드 밸런싱에는 Cilium을 사용하도록 Cilium과 kube-router를 함께 구성하는 방법을 설명해요.

출처: Using Kube-Router to Run BGP (deprecated)

본문

이 가이드는 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.227
    • 10.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

더 알아보기 (Learn more)