gke에 옵션으로 cilium을 설치할 수 있는건 다들 해보셧을 거라 생각합니다.
하지만 gce에는..?
native-routing이란 ..!! 간단하게 설명하면 파드의 아이피를 overlay네트워크를 사용하거나 nat해서 노드의 아이피로 변환하지 않고 그대로 라우팅을 하는 라우팅 방법입니다.
공식 문서를 보면 alias ip를 사용해서 GKE 뿐만 아니라 GCE에서도 가능한것 처럼 소개되어있는데 구체적으로 어떻게 하면 되는지 나와있지 않아 삽질을 엄청 하였고.. 결국 방법을 찾아냈는데 그 내용을 공유해볼까 합니다.
https://docs.cilium.io/en/stable/network/concepts/routing/#google-cloud
참고로 이 글을 gce의 네트워크에 대해서는 잘 모르는 사람이 쓴 글로 틀린 내용이 있을 수 있습니다!!
GCE에 Cilium NativeRouting으로 구성하기
Alias IP란
구글 네트워크에 설정할 수 있는 alias ip란 VM의 인터페이스에 기본 아이피 외에 다른 아이피를 별칭으로 붙여둘 수 있는 기능입니다. 처음엔 이게 aws의 secondary ip같은 거로 생각을 하고 구성을 진행했었는데 구성이 잘 되지 않았었습니다. 확인해보니 해당 아이피로 arping을 하였을 때 응답을 받을 수 없는 것으로 보아 실제 인터페이스에 해당 아이피가 매핑되는 것이 아닌 다른 방식의 라우팅이 적용되어있는 것 같습니다.
Alias IP 설정하기
vm을 생성할때 네트워크 인터페이스 수정 탭을 눌러보면 별칭 IP 범위 아래에 IP 범위 추가라는 버튼이 있습니다.
사전에 만들어둔 서브넷 대역이 보이고 이 대역의 일부를 이 vm의 인터페이스에 매핑 시킬 수 있습니다.
근데 이제 일반적으로 한개의 서버에 24비트로 쪼개서 파드 아이피가 넣어지기 때문에 저도 24비트로 쪼개서 설정을 하도록 하겠습니다.
이상태로 vm을 만들면 파드 대역을 10.255.0.0/16 으로 만들 수 있는 클러스터를 생성할 준비가 완료됩니다.
클러스터 생성하기
이제 vm을 생성했다면 클러스터도 생성해보겠습니다. 설치는 다들하실 수 있을거라 생각하고 혹은 다른 블로그글을 참고해서 생성하시면 됩니다. kube-proxy 설치 없이 파드 대역도 vm에 설정된 서브넷 대역으로 맞춰서 생성만 하면 됩니다.
kubeadm init --skip-phases=addon/kube-proxy \
--apiserver-advertise-address=$KUBE_APISERVER \
--pod-network-cidr="10.255.0.0/16" \
--service-cidr="10.155.0.0/16"
cilium 설치하기
cilium은 다음과 같은 설정으로 설치하면 됩니다.
cilium install --version 1.16.6 \
--set envoy.enabled=false \
--set kubeProxyReplacement=true \
--set k8sServicePort=6443 \
--set k8sServiceHost="$KUBE_APISERVER" \
--set gke.enabled=true \
--set routingMode=native \
--set ipv4NativeRoutingCIDR="10.255.0.0/16"
클러스터 상태 확인해보기
하지만 여기서 문제가 발생합니다. 여기까지 읽지 않았다면 알수없는 문제!!
클러스터 상태를 확인해보면 cilium의 상태가 정상적이지 않고 coredns가 정상적이지 않은게 확인됩니다.
kubectl get pods -n kube-system
분명 cilium status 했을 때 결과는 OK인데
coredns로그를 확인해보면 API 서버와 통신이 안되는 로그가 보이고
[INFO] plugin/kubernetes: waiting for Kubernetes API before starting server
[INFO] plugin/ready: Still waiting on: "kubernetes"
[INFO] plugin/kubernetes: waiting for Kubernetes API before starting server
[INFO] plugin/kubernetes: waiting for Kubernetes API before starting server
[INFO] plugin/ready: Still waiting on: "kubernetes"
[INFO] plugin/kubernetes: waiting for Kubernetes API before starting server
[INFO] plugin/kubernetes: waiting for Kubernetes API before starting server
[INFO] plugin/ready: Still waiting on: "kubernetes"
에러 로그도 보인다.
[ERROR] plugin/kubernetes: pkg/mod/k8s.io/client-go@v0.29.3/tools/cache/reflector.go:229: Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: Get "https://10.155.0.1:443/apis/discovery.k8s.io/v1/endpointslices?limit=500&resourceVersion=0": dial tcp 10.155.0.1:443: i/o timeout
[INFO] plugin/ready: Still waiting on: "kubernetes
그냥 라우팅 정보 확인했을 땐 아래와 같이 나와서 문제가 없어 보였습니다.
root@cilium-master01:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.72.0.1 0.0.0.0 UG 100 0 0 ens4
10.0.2.60 0.0.0.0 255.255.255.255 UH 0 0 0 lxc_health
10.72.0.1 0.0.0.0 255.255.255.255 UH 100 0 0 ens4
169.254.169.254 10.72.0.1 255.255.255.255 UGH 100 0 0 ens4
정말 여기서 삽질을 엄청 했는데 알고봤더니 alias ip를 설정하면 자동으로 vm 내부에 라우팅 설정이 되는 것이 있었습니다.
root@cilium-master01:~# ip route show table all | grep 10.255.0.0
local 10.255.0.0/24 dev ens4 table local proto 66 scope host # <-- 여기서 나옴
두둔..
이 설정은 vm을 껏다 켜도 동일하게 설정이 되는데 어떻게 유지를 해야할지가 고민이네요
netplan이나 이런곳에 딱히 관련 설정이 안보여서..
삭제 명령어
10.255.0.0/24 대신 alias ip로 설정한 대역을 입력해서 삭제하면 됩니다.
ip route del local 10.255.0.0/24 dev eth0 table local
임시로 start script에 설정을 넣어서 유지할 수 있을 것 같습니다.
'K8S > cilium' 카테고리의 다른 글
[발표영상정리] Turning up Performance to 11: Cilium, NetKit Devices, and Going Big with TCP (4) | 2025.08.02 |
---|---|
cilium 1.18.0 달라진점 정리 (3) | 2025.08.02 |
네트워크 패킷 추적 도구 - PWRU: Packet, Where Are You? (1) | 2024.10.21 |
Bonding 인터페이스에서 Cilium XDP 활성화 하기 (2) | 2024.10.21 |
Maglev 알고리즘 사용해보기 (0) | 2024.10.18 |