CCA — 실리움 인증 어소시에이트 · 네트워킹과 kube-proxy 대체 · 실습
kube-proxy 없는 클러스터 선언하기
목표
kube-proxy 를 대체하는 Cilium 설정을 값 파일로 정확히 선언하고, 실제 워크로드와 서비스로 백엔드가 잡히는 과정을 확인하며, "정말 kube-proxy 가 없는가"를 스스로 증명하는 스크립트를 만듭니다.
왜 중요한가
kubeProxyReplacement: true 한 줄이면 끝날 것 같지만 현장에서는 그렇지 않습니다. k8sServiceHost 를 빼면 Cilium 이 부팅 중 API 서버를 찾지 못해 클러스터 전체가 올라오지 않고, 기존 클러스터에서 kube-proxy 를 제거하며 전환하면 노드에 남은 KUBE- 체인이 eBPF 경로와 충돌합니다. 그래서 실무의 정석은 처음부터 설치하지 않는 것이고, 그것이 실제로 이뤄졌는지는 체인 개수를 세어 확인해야 합니다.
이 실습은 그 과정을 세 갈래로 나눠 익힙니다. 값 파일 작성은 "무엇을 켜는가"를, 실제 리소스 apply 는 "라벨과 셀렉터가 어떻게 백엔드를 만드는가"를, 검증 스크립트는 "어떻게 증명하는가"를 다룹니다. 세 번째가 특히 중요합니다. 문서에 적힌 기능과 이 노드에서 실제로 동작하는 것은 다른 명제입니다.
Cilium Helm values 와 스크립트는 /root/cca-config/ 아래에 작성하고, Kubernetes 기본 리소스는 실제로 apply 합니다.
단계
1. 네임스페이스 cca-net 을 만드세요.
2. /root/cca-config/cilium-values.yaml 을 만들고 최상위에 kubeProxyReplacement: true, k8sServiceHost: 10.0.0.120, k8sServicePort: 6443, 그리고 ipam.mode: kubernetes 를 쓰세요.
3. 같은 파일에 이어서 routingMode: tunnel, tunnelProtocol: vxlan, bpf.masquerade: true, l7Proxy: true, encryption.enabled: true, encryption.type: wireguard 를 추가하세요.
4. 노드 lab-node-0 과 lab-node-1 에 라벨 cca.homelab/tier=gpu 를, 노드 lab-node-2 에 라벨 cca.homelab/tier=cpu 를 붙이세요.
5. 네임스페이스 cca-net 에 디플로이먼트 web 을 3 레플리카로 배포하세요. 파드 라벨은 app=web, 이미지는 nginx:1.27-alpine, 파드 스펙의 nodeSelector 는 cca.homelab/tier: gpu 입니다.
6. 같은 네임스페이스에 서비스 web 을 만드세요. 타입은 ClusterIP, port 는 80, targetPort 는 8080, selector 는 app=web 입니다.
7. /root/cca-config/verify-kubeproxy-free.sh 를 작성하고 실행 권한을 주세요. 이 스크립트는 (1) kubectl 로 kube-system 의 kube-proxy 파드 개수를 세고, (2) iptables-save 출력에서 KUBE- 체인 개수를 세고, (3) cilium 상태에서 KubeProxyReplacement 값을 확인해야 합니다. 개수가 0 이 아니면 메시지를 출력하고 exit 1 로 끝내세요.
참고
- 값 파일의 중첩은
ipam.mode처럼 점으로 쓰지 말고 실제 YAML 계층으로 작성하세요.ipam:아래mode: kubernetes입니다. - 라벨 키에 슬래시가 들어가면
kubectl label node lab-node-0 cca.homelab/tier=gpu처럼 그대로 쓰면 됩니다. - 파드가 Pending 이면
kubectl describe pod의 이벤트에서 nodeSelector 불일치를 확인하세요. - 흔한 실수 1: 서비스의
targetPort를 빠뜨려port와 같은 값으로 두는 것. 컨테이너가 듣는 포트와 서비스 포트는 별개입니다. - 흔한 실수 2: 검증 스크립트가 개수를 출력만 하고 판정하지 않는 것. 0 과 비교해 실패를 만들어야 검증입니다.
단계 7개
- 실습 네임스페이스 만들기
- kube-proxy 대체 핵심 값 쓰기
- 데이터패스 옵션 채우기
- 노드에 체급 라벨 붙이기
- 배치 제약이 붙은 워크로드 배포
- 서비스로 묶고 백엔드 확인하기
- 검증 스크립트 작성하기