13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Calico

  • [Kubernetes] Cilium vs Calico 네트워킹 성능 실측 비교

    [Kubernetes] Cilium vs Calico 네트워킹 성능 실측 비교

    [Kubernetes] Cilium vs Calico 네트워킹 성능 실측 비교

    Cilium vs Calico 이야기는 Kubernetes CNI를 운영하는 분들이 한 번쯤 꼭 부딪히는 주제입니다. 클러스터가 작을 때는 둘 다 잘 돌아가는 것처럼 보이는데, 서비스(Service) 수가 늘고 네트워크 정책(NetworkPolicy, 네트워크 접근 제어)까지 얹기 시작하면 느낌이 꽤 달라지거든요. 저도 처음엔 ‘어차피 Pod to Pod 통신만 되면 되는 거 아닌가?’ 싶었는데, 실제로 홈랩에서 반복해서 붙였다 떼어보니 성능 자체보다도 어떤 경로에서 병목이 생기는지, 운영 중에 어디서 시간을 잡아먹는지가 더 중요하더라고요.

    이번 글은 특정 벤더 홍보가 아니라, Cilium vs Calico를 benchmark 관점에서 어떻게 비교해야 하는지, 그리고 제가 실제로 비교할 때 어떤 항목을 봤는지 정리한 글입니다. 숫자를 지어내서 화려하게 쓰는 대신, 실제로 재현 가능한 측정 방법과 해석 포인트 위주로 풀어보겠습니다. 혹시 지금 Kubernetes CNI 교체를 고민 중이시라면, 여기서 중요한 포인트를 먼저 잡고 가시면 삽질을 꽤 줄일 수 있어요.

    홈랩 Kubernetes 클러스터에서 Cilium과 Calico의 데이터 경로를 비교하는 전체 개요 이미지입니다.

    Kubernetes CNI에서 Cilium과 Calico를 왜 따로 봐야 할까요

    쉽게 말해 CNI(Container Network Interface, 컨테이너 네트워크 인터페이스)는 Pod가 네트워크에 붙는 방식을 정하는 레이어입니다. 그런데 운영해보면 단순히 IP 붙이는 수준에서 끝나지 않아요. 서비스 라우팅, 네트워크 정책, 트래픽 가시성, 디버깅 도구, 커널 의존성까지 같이 따라옵니다.

    Calico는 오래전부터 많이 써온 선택지라 운영 경험치가 쌓여 있고, 라우팅과 정책 측면에서 익숙한 분들이 많습니다. 반면 Cilium은 eBPF(이비피에프, 커널 내부에서 안전하게 패킷 처리 로직을 실행하는 기술)를 적극 활용해서 데이터 경로를 다르게 가져가는 게 핵심이죠. 처음엔 이게 뭔가 싶었는데, 관찰성(Observability, 트래픽을 들여다보는 능력) 쪽은 확실히 인상적이었어요.

    여기서 오해하면 안 되는 게 하나 있습니다. “무조건 Cilium이 빠르다” 혹은 “Calico는 오래돼서 느리다” 같은 식으로 단정하면 안 됩니다. 실제 Kubernetes CNI 성능 비교는 트래픽 패턴에 따라 결과가 달라집니다. Pod 간 단순 대역폭, NodePort 경유, Service 체인, NetworkPolicy 적용 여부, 암호화 사용 여부 같은 조건이 바뀌면 체감이 꽤 달라지거든요.

    Cilium vs Calico 핵심 차이 정리

    항목 Cilium Calico
    핵심 데이터 경로 eBPF 기반 iptables 기반 또는 eBPF dataplane 선택 가능
    강점 관찰성, 정책 처리, 서비스 트래픽 가시화 성숙한 운영 사례, 익숙한 구성, 다양한 환경 적응력
    운영 난이도 커널과 기능 이해가 필요함 상대적으로 익숙한 운영 패턴
    디버깅 관점 Hubble 등 생태계가 강점 전통적인 네트워크 관점에서 접근이 쉬움
    비교 포인트 정책 많을 때, 관찰성 중요할 때 안정적 표준 운영, 기존 경험 활용 시

    제가 직접 해보니, Kubernetes CNI 성능 비교에서 제일 많이 놓치는 부분이 순수 처리량(throughput)만 보고 결론 내리는 것이었습니다. 실제 운영에서는 지연(latency), 정책 적용 후 변화, 장애 났을 때 추적 가능성까지 같이 봐야 하더라고요. 특히 멀티테넌트 비슷하게 네임스페이스를 나눠 쓰는 환경이면 더 그렇습니다.

    비교 전에 먼저 정해야 할 질문

    • 단순 Pod to Pod 성능이 궁금한지
    • NetworkPolicy 적용 후 성능 변화가 궁금한지
    • Service 트래픽까지 포함한 실제 운영 경로가 궁금한지
    • 관찰성과 디버깅 속도를 포함해 평가할지

    이 질문부터 정리하고 들어가면 benchmark 해석이 훨씬 깔끔해집니다.

    실전 비교 환경 구성: 같은 조건으로 맞추는 게 먼저입니다

    여기서 제일 중요한 건 두 CNI를 최대한 같은 조건에서 비교하는 겁니다. CPU, 메모리, 커널, Kubernetes 버전, MTU, 노드 수, Pod 수가 다르면 결과가 섞여버립니다. 저도 초반에는 클러스터를 급하게 갈아엎다가 조건이 달라져서 다시 측정했었어요. 삽질 꽤 했습니다 ㅎㅎ

    1. 동일한 노드 사양으로 테스트 클러스터를 준비합니다.
    2. 한 번에 하나의 CNI만 설치합니다.
    3. 테스트 워크로드는 똑같이 유지합니다.
    4. 측정 항목을 미리 고정합니다. 예: 대역폭, 지연, 정책 적용 전후, Service 경유 성능.

    아래는 Helm(헬름, 쿠버네티스 패키지 매니저) 기준으로 Cilium vs Calico 비교 환경을 잡을 때 자주 쓰는 흐름입니다.

    helm repo add cilium https://helm.cilium.io/
    helm repo update
    
    helm install cilium cilium/cilium \
      --namespace kube-system \
      --set kubeProxyReplacement=false

    ⚠️ 주의: 위 설정의 kubeProxyReplacement=false는 kube-proxy를 계속 사용한다는 뜻입니다. Cilium의 eBPF 이점을 제대로 보려면 --set kubeProxyReplacement=strict 또는 =probe로 설정하는 게 낫습니다. 비교 목적이라면 두 CNI 모두 같은 서비스 경로 구성을 유지해야 한다는 점을 잊지 마세요.

    helm repo add projectcalico https://docs.tigera.io/calico/charts
    helm repo update
    
    helm install calico projectcalico/tigera-operator \
      --namespace tigera-operator \
      --create-namespace

    환경에 따라 설치 방식은 달라질 수 있습니다. 중요한 건 설치 명령보다도 비교 조건을 고정하는 습관입니다.

    동일 조건의 Kubernetes CNI 테스트 환경에서 Cilium vs Calico를 비교하는 구성 이미지

    동일한 노드 조건에서 Cilium과 Calico를 각각 분리해 테스트하는 구성 다이어그램입니다.

    Benchmark 워크로드 만들기: iperf3와 정책 테스트를 같이 봐야 합니다

    Kubernetes CNI 성능 비교를 할 때 저는 보통 iperf3(아이퍼프3, 네트워크 처리량 측정 도구)부터 올립니다. 이유는 단순해요. 가장 빠르게 Pod 간 대역폭과 TCP/UDP 흐름을 볼 수 있거든요. 다만 이것만 보면 반쪽짜리입니다. 실제 운영은 Service, DNS, NetworkPolicy가 얹히니까요.

    기본 테스트 Pod 배포

    apiVersion: v1
    kind: Pod
    metadata:
      name: iperf3-server
      labels:
        app: iperf3-server
    spec:
      containers:
        - name: iperf3
          image: networkstatic/iperf3
          args: ["-s"]
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: iperf3-client
    spec:
      containers:
        - name: iperf3
          image: networkstatic/iperf3
          command: ["sleep", "3600"]
    kubectl apply -f iperf3.yaml
    kubectl get pods -o wide
    kubectl exec -it iperf3-client -- iperf3 -c <SERVER_POD_IP> -t 30

    여기서 중요한 포인트! 같은 노드에 붙은 경우와 다른 노드에 붙은 경우를 분리해서 봐야 합니다. 같은 노드면 오버레이(overlay) 영향을 덜 받고, 다른 노드면 실제 네트워크 경로가 더 잘 드러나거든요.

    Service 경유 테스트도 꼭 해보세요

    apiVersion: v1
    kind: Service
    metadata:
      name: iperf3-service
    spec:
      selector:
        app: iperf3-server
      ports:
        - protocol: TCP
          port: 5201
          targetPort: 5201
    kubectl apply -f iperf3-service.yaml
    kubectl exec -it iperf3-client -- iperf3 -c iperf3-service.default.svc.cluster.local -t 30

    이렇게 보면 직접 Pod IP로 붙었을 때와 Service를 경유했을 때 차이를 비교할 수 있어요. 실제로 써보니까 이 구간에서 체감 차이를 보는 경우가 꽤 있더라고요.

    NetworkPolicy 적용 후도 따로 측정

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-iperf3
    spec:
      podSelector:
        matchLabels:
          app: iperf3-server
      policyTypes:
        - Ingress
      ingress:
        - from:
            - podSelector: {}
          ports:
            - protocol: TCP
              port: 5201

    정책 없을 때 한 번, 정책 적용 후 한 번. 최소 이 두 번은 돌려보셔야 합니다. 정책이 많아질수록 Cilium vs Calico의 dataplane 특성이 드러나는 경우가 있거든요.

    제가 실제로 체크한 관찰 포인트

    단순히 결과 숫자만 기록하면 나중에 해석이 안 됩니다. 그래서 저는 아래 항목을 같이 봤어요.

    • Pod to Pod 처리량: 같은 노드 / 다른 노드 분리
    • Service 경유 지연: kube-proxy 경로 포함 여부 확인
    • NetworkPolicy 적용 전후 차이: 정책 수가 늘어날 때 체감 확인
    • CPU 사용 경향: 네트워크 부하 중 어느 쪽이 더 민감한지
    • 디버깅 편의성: 장애 시 원인 추적 시간

    특히 마지막 항목은 문서만 보면 잘 안 보입니다. 성능 수치가 약간 좋아도, 운영 중 원인 파악이 너무 오래 걸리면 결국 전체 효율은 떨어지더라고요. 저는 예전에 정책 충돌 때문에 Pod 통신이 막힌 적이 있었는데, 그때부터는 관찰성도 성능의 일부라고 생각하게 됐습니다.

    Kubernetes 네트워킹 성능 비교를 위해 Cilium vs Calico benchmark를 수행하는 시각화 이미지

    iperf3 실행과 정책 테스트를 병행하면서 측정하는 과정을 보여주는 시각 자료입니다.

    ⚠️ 주의사항과 트러블슈팅: 여기서 많이 막힙니다

    이 섹션은 진짜 중요합니다. Kubernetes CNI benchmark가 이상하게 나오면 대개 CNI 자체보다 테스트 환경 변수가 문제인 경우가 많거든요.

    1. MTU 불일치

    오버레이 네트워크나 터널링이 들어가면 MTU(Maximum Transmission Unit, 최대 전송 단위)가 어긋나면서 성능이 이상하게 흔들릴 수 있습니다. 겉보기엔 통신이 되는데, 처리량이 들쑥날쑥하거나 재전송이 늘어나는 식이죠.

    kubectl exec -it iperf3-client -- ip link
    kubectl exec -it iperf3-server -- ip addr

    MTU 값이 환경 전체에서 일관적인지 먼저 확인해보세요.

    2. 같은 노드에만 스케줄링되는 문제

    처음엔 결과가 너무 좋게 나와서 ‘와, 이거 엄청 빠른데?’ 했었는데, 알고 보니 서버와 클라이언트 Pod가 같은 노드에 올라가 있었던 적이 있어요. 이러면 진짜 비교가 안 됩니다.

    kubectl get pods -o wide

    노드 분산이 필요하면 nodeSelector나 podAntiAffinity도 같이 고려해보세요.

    3. 정책 테스트인데 DNS를 빼먹는 문제

    Service 이름으로 붙는 테스트를 할 때 DNS 허용 정책을 빼먹으면 결과가 꼬여요. 통신 자체가 안 되는 걸 성능 문제로 오해하기 쉽거든요.

    4. 관찰 도구가 없는 상태에서 디버깅 시작

    Calico든 Cilium이든 로그와 패킷 경로를 볼 수단을 먼저 확보해두는 게 좋습니다. 특히 Cilium은 Hubble(Hubble, 네트워크 관찰 도구) 같은 생태계를 같이 보는 분들이 많고, Calico도 운영 환경에 맞춰 상태 확인 경로를 준비해두는 편이 낫습니다.

    💡 팁: benchmark 전에 무부하 상태 baseline을 한 번 기록해두세요. 나중에 결과가 흔들려도 비교 기준점이 생깁니다.

    검증과 결과 해석: 숫자보다 패턴을 보셔야 합니다

    이제 제일 궁금한 부분이죠. 그래서 뭐가 더 빨랐냐고요? 제가 홈랩과 소규모 테스트 클러스터에서 여러 번 Cilium vs Calico를 비교해본 느낌은 이랬습니다.

    • 단순 Pod to Pod 처리량만 보면 둘 다 충분히 빠른 편이라, 환경에 따라 큰 차이가 안 보일 때도 많았어요.
    • Service 경유, 정책 적용, 관찰성 포함으로 범위를 넓히면 체감 차이가 생겼습니다.
    • Cilium은 eBPF 기반 흐름과 관찰성 덕분에 문제를 추적하는 시간이 줄어드는 느낌이 있었어요.
    • Calico는 운영 경험이 이미 쌓인 팀이라면 구성과 장애 대응이 익숙해서 안정감이 있더라고요.

    즉, Kubernetes CNI benchmark 결과는 단순히 ‘누가 더 빠르다’로 끝내면 아쉬워요. 운영 모델까지 포함한 성능 비교가 맞습니다. 특히 네트워크 정책을 많이 쓰고 서비스 메시에 가까운 복잡한 흐름이 있다면 Cilium이 주는 장점이 더 잘 보일 수 있습니다. 반대로 단순하고 예측 가능한 구조, 기존 팀 역량 활용이 중요하다면 Calico도 여전히 아주 현실적인 선택입니다.

    테스트 항목 해석 포인트 제가 본 체감
    Pod to Pod 순수 데이터 경로 성능 환경 따라 큰 차이 없을 수 있음
    Service 경유 서비스 라우팅 오버헤드 구성 차이가 드러날 수 있음
    Policy 적용 후 정책 엔진 영향 워크로드 구조에 따라 차이 발생
    운영 디버깅 문제 추적 시간 Cilium 관찰성이 인상적이었음
    Kubernetes CNI에서 Cilium vs Calico benchmark 결과 해석을 요약한 비교 이미지

    Cilium vs Calico benchmark 결과를 숫자보다 해석 포인트 중심으로 요약한 인포그래픽입니다.

    어떤 환경에 Cilium, 어떤 환경에 Calico가 맞을까요

    정리하면 이렇습니다.

    • Cilium 추천: eBPF 기반 기능, 네트워크 가시성, 정책 중심 운영, 트래픽 분석이 중요할 때
    • Calico 추천: 익숙한 운영 모델, 폭넓은 도입 사례, 단계적 운영 안정성이 중요할 때

    여기서 중요한 포인트! 팀의 운영 역량도 반드시 포함해서 판단해야 합니다. 도구가 아무리 좋아도, 팀이 이해하지 못하면 장애 대응 시간은 길어집니다. 저도 처음에는 기능표만 보고 혹했었는데, 결국 오래 남는 건 운영 난이도와 추적 가능성이더라고요.

    정리와 다음 단계

    이번 글에서는 Cilium vs Calico를 Kubernetes CNI와 네트워킹 성능 비교 관점에서 풀어봤습니다. 핵심은 간단해요. Benchmark는 같은 조건에서 측정하고, 결과는 처리량만이 아니라 정책/서비스/디버깅까지 함께 해석해야 한다는 점입니다. 제가 직접 해보니 결국 ‘더 빠른 CNI’보다 ‘내 환경에서 더 잘 설명되는 CNI’를 고르는 쪽이 맞았습니다.

    ✅ 지금 바로 해보실 일은 세 가지입니다.

    1. 동일 조건의 테스트 클러스터를 준비합니다.
    2. Pod to Pod, Service, NetworkPolicy 세 가지 축으로 나눠 측정합니다.
    3. 결과 표에 숫자뿐 아니라 장애 추적 난이도까지 같이 적습니다.

    다음 글에서는 Hubble을 활용한 Cilium 트래픽 관찰이나, 반대로 Calico NetworkPolicy 운영 팁을 더 깊게 다뤄볼 예정입니다. Kubernetes 네트워크 기본기 관련 이전 글들도 함께 읽으시면 Cilium vs Calico 비교의 흐름이 더 잘 잡히실 거예요.

    자주 묻는 질문

    Cilium이 항상 Calico보다 빠른가요?

    아니에요. 트래픽 패턴, 정책 수, 서비스 경로, 커널 환경에 따라 달라집니다. 단순 benchmark 하나로 일반화하면 위험합니다.

    Calico도 eBPF를 쓰나요?

    Calico는 전통적인 방식으로 많이 알려져 있지만, eBPF dataplane 관련 선택지도 존재합니다. 다만 실제 비교에서는 어떤 dataplane을 쓰는지를 명확히 맞춰야 합니다.

    Kubernetes CNI 비교에서 제일 중요한 항목은 뭔가요?

    제 기준으로는 정책 적용 후의 변화와 운영 중 추적 가능성입니다. 실서비스는 그 구간에서 차이가 크게 느껴지거든요.

    🎉 결론적으로, Cilium이든 Calico든 무작정 유행 따라 고르기보다 내 클러스터의 네트워크 구조와 운영 방식에 맞춰 Cilium vs Calico를 직접 benchmark 해보는 게 가장 확실합니다.

  • [k8s] Calico 네트워크 정책 베스트 프랙티스: 프로덕션 환경 보안 강화 체크리스트

    [k8s] Calico 네트워크 정책 베스트 프랙티스: 프로덕션 환경 보안 강화 체크리스트

    Calico 네트워크 정책 베스트 프랙티스: 프로덕션 환경 보안 강화 체크리스트

    안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 Kubernetes(쿠버네티스) 환경에서 네트워크 보안을 단단하게 다지는 핵심 요소인 Calico 네트워크 정책(Network Policy)에 대해 이야기해보려고 합니다. 프로덕션 환경에서 보안은 아무리 강조해도 지나치지 않거든요. 특히 마이크로서비스 아키텍처(MSA)가 보편화되면서 수많은 Pod(파드)들이 서로 통신하게 되는데, 이때 제대로 된 네트워크 격리(Network Isolation)가 이루어지지 않으면 작은 취약점이 전체 시스템으로 퍼질 수 있는 무서운 상황이 발생합니다. 저도 처음엔 ‘에이, 그냥 Pod끼리 통신 잘 되면 됐지 뭐’ 하고 안일하게 생각했었는데, 한 번 크게 데이고 나서는 Calico 네트워크 정책의 중요성을 뼈저리게 느꼈습니다. 오늘은 제가 직접 삽질하면서 터득한 Calico 네트워크 정책 베스트 프랙티스와 함께, 프로덕션 환경 보안 강화를 위한 체크리스트를 공유해보겠습니다. Pod 간 불필요한 통신으로 고민이 많으셨다면, 이 글이 좋은 가이드가 될 거예요!

    Kubernetes 클러스터에서 Calico 네트워크 정책이 적용되어 Pod 간 통신을 제어하는 개념도

    1. Calico 네트워크 정책, 쉽게 말해 뭘까요? 💡

    Calico는 Kubernetes 클러스터의 CNI(Container Network Interface, 컨테이너 네트워크 인터페이스) 솔루션 중 하나입니다. Calico 네트워크 정책은 바로 이 Calico가 제공하는 Pod 간 통신 규칙을 정의하는 도구거든요. 쉽게 말해, ‘어떤 Pod가 어떤 Pod와 통신할 수 있고, 어떤 포트로 통신할 수 있는지’를 명확하게 지정해주는 방화벽(Firewall) 역할을 Kubernetes 레벨에서 해주는 거라고 생각하시면 돼요.

    Kubernetes 자체적으로도 NetworkPolicy 리소스가 있긴 한데, Calico는 이를 확장해서 더 강력하고 유연한 기능을 제공합니다. 예를 들어, Namespace(네임스페이스)를 넘어선 통제나, Host(호스트) 레벨의 정책, 그리고 GlobalNetworkPolicy(글로벌 네트워크 정책) 같은 기능들이 대표적이에요. 저도 처음엔 Kubernetes NetworkPolicy만으로 충분하다고 생각했었는데, 실제 운영 환경에서는 Calico의 확장 기능이 훨씬 유용하더라고요. 특히 클러스터 전체에 걸쳐 일관된 보안 정책을 적용해야 할 때 GlobalNetworkPolicy가 정말 빛을 발합니다.

    2. 프로덕션 환경을 위한 Calico 네트워크 정책 베스트 프랙티스 체크리스트 ✅

    자, 이제 본론으로 들어가서 프로덕션 환경에서 제가 추천하는 Calico 네트워크 정책 베스트 프랙티스들을 하나씩 살펴보겠습니다. 이 체크리스트만 잘 따라 하셔도 보안 레벨을 한 단계 업그레이드할 수 있을 거예요.

    2.1. 기본은 ‘Deny All’ (모든 트래픽 차단)부터 시작하기

    가장 중요한 원칙 중 하나입니다. 처음부터 모든 통신을 허용하고 필요한 것만 차단하는 방식(Permissive Policy)은 보안에 구멍이 생기기 쉬워요. 기본적으로 모든 Ingress(인그레스, 외부에서 들어오는 트래픽)와 Egress(이그레스, 내부에서 나가는 트래픽)를 차단한 다음, 허용해야 할 통신만 명시적으로 열어주는 방식(Restrictive Policy)을 채택해야 합니다. 이게 바로 Zero Trust(제로 트러스트) 보안 모델의 핵심이기도 하죠. 처음엔 좀 귀찮을 수 있지만, 장기적으로 보면 훨씬 안전합니다.

    apiVersion: projectcalico.org/v3
    kind: NetworkPolicy
    metadata:
      name: default-deny-all
      namespace: default
    spec:
      selector: {}
      types:
      - Ingress
      - Egress
      ingress:
      - {}
      egress:
      - {}
    

    위 정책은 default 네임스페이스의 모든 Pod에 대해 Ingress와 Egress를 차단하는 정책입니다. selector: {}는 모든 Pod를 의미하고, ingress: - {}와 egress: - {}는 아무런 규칙도 없으므로 기본적으로 모든 트래픽을 차단해요. ⚠️ 주의: 이 정책을 적용하면 해당 네임스페이스의 Pod들이 통신을 전혀 할 수 없게 되니, 바로 이어서 필요한 허용 정책을 적용해야 합니다.

    2.2. 필요한 통신만 최소한으로 허용하기

    default-deny-all 정책을 적용했다면, 이제 애플리케이션이 정상적으로 동작하는 데 필요한 통신만 정확히 허용해야 합니다. 예를 들어, 프론트엔드(Frontend) Pod는 백엔드(Backend) Pod의 특정 포트로만 접근할 수 있게 하고, 백엔드 Pod는 데이터베이스(Database) Pod의 특정 포트로만 접근할 수 있게 하는 식이죠.

    apiVersion: projectcalico.org/v3
    kind: NetworkPolicy
    metadata:
      name: allow-frontend-to-backend
      namespace: default
    spec:
      selector: app == 'backend'
      types:
      - Ingress
      ingress:
      - from:
        - selector: app == 'frontend'
        ports:
        - protocol: TCP
          port: 8080 # 백엔드 서비스 포트
    

    이 정책은 app: backend 레이블을 가진 Pod에게, app: frontend 레이블을 가진 Pod로부터 8080 포트로 들어오는 TCP 트래픽만 허용합니다. Pod Selector(파드 셀렉터)와 Port(포트)를 명확히 지정하는 게 정말 중요해요.

    2.3. 레이블 기반 정책 활용하기

    Pod의 레이블(Label)은 네트워크 정책을 관리하는 데 있어 강력한 도구입니다. app: myapp, tier: frontend, env: production 같은 레이블을 잘 활용하면, 수십, 수백 개의 Pod가 생겨나더라도 정책을 쉽게 적용하고 관리할 수 있어요. 저도 처음엔 IP 기반으로 정책을 만들까 고민했었는데, Kubernetes 환경에서는 Pod IP가 동적으로 할당되니 레이블 기반이 훨씬 효율적이고 유지보수하기 좋더라고요.

    Calico 네트워크 정책이 레이블 셀렉터를 이용해 다양한 Pod 그룹 간 통신을 제어하는 다이어그램

    Calico 네트워크 정책이 레이블 셀렉터를 이용해 다양한 Pod 그룹 간 통신을 제어하는 다이어그램

    2.4. GlobalNetworkPolicy 활용하여 클러스터 전역 정책 적용하기

    특정 네임스페이스에 국한되지 않고 클러스터 전체에 적용해야 하는 정책들이 있습니다. 예를 들어, 모든 Pod가 DNS 서버에 접근할 수 있도록 허용하거나, 특정 관리용 Pod만 Kubernetes API 서버에 접근할 수 있도록 하는 정책 같은 거죠. 이럴 때 GlobalNetworkPolicy를 사용합니다.

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: allow-dns-egress
    spec:
      selector: {}
      order: 100 # 우선순위, 숫자가 낮을수록 높음
      types:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        ports:
        - protocol: UDP
          port: 53 # DNS (UDP)
        - protocol: TCP
          port: 53 # DNS (TCP)
    

    위 정책은 모든 Pod가 53번 포트로 DNS 쿼리를 날릴 수 있도록 허용하는 GlobalNetworkPolicy입니다. order 필드는 정책의 우선순위를 결정하는데, 숫자가 낮을수록 우선순위가 높아요. 여러 정책이 겹칠 때 어떤 정책이 먼저 적용될지 잘 고려해야 합니다.

    2.5. Egress 정책도 Ingress만큼 중요하게 다루기

    보통 네트워크 정책을 만들 때 Ingress(들어오는 트래픽)에만 집중하는 경향이 있는데, Egress(나가는 트래픽) 정책도 보안에 아주 중요해요. 악성 Pod가 외부로 데이터를 유출하거나 C2(Command & Control) 서버와 통신하는 것을 막으려면 Egress 정책을 꼼꼼하게 설정해야 합니다. 예를 들어, 개발 Pod들은 특정 개발용 리포지토리(Repository)에만 접근할 수 있게 하고, 운영 Pod들은 외부에 전혀 접근하지 못하게 할 수도 있어요.

    2.6. 테스트 환경에서 충분히 검증하기 ⚠️

    네트워크 정책은 잘못 설정하면 서비스 장애로 직결될 수 있습니다. 그래서 프로덕션에 적용하기 전에 반드시 개발/스테이징 환경에서 충분히 테스트해야 해요. 저도 한 번은 너무 엄격하게 정책을 설정해서 핵심 서비스의 DB 연결이 끊긴 적이 있었거든요. 결국 밤샘 삽질 끝에 겨우 복구했었죠. calicoctl 명령어나 kubectl describe networkpolicy 등으로 정책이 제대로 적용되었는지 확인하고, curl이나 ping 명령어로 통신 테스트를 꼼꼼히 해보는 게 좋습니다.

    3. Calico 네트워크 정책 검증/결과 🎉

    정책을 적용하고 나면, 예상대로 통신이 차단되거나 허용되는지 확인해야 합니다. kubectl exec 명령으로 Pod에 접속해서 curl 등의 도구를 사용하거나, calicoctl 명령으로 정책 상태를 확인할 수 있어요.

    # 특정 Pod에서 다른 Pod로 통신 테스트
    kubectl exec -it <my-app-pod> -- curl <target-service-ip>:<port>
    
    # Calico 네트워크 정책 목록 확인
    calicoctl get networkpolicy -o wide
    calicoctl get globalnetworkpolicy -o wide
    
    # 특정 Pod에 적용된 정책 확인 (이건 Calico Enterprise 기능일 수 있으니 확인 필요)
    # calicoctl get activepolicy --namespace <namespace> --workload <pod-name>
    

    만약 통신이 안 된다면, calicoctl의 log 명령어를 활용해서 어떤 정책에 의해 트래픽이 차단되었는지 확인할 수 있어요. 저도 이 로그를 보면서 ‘아, 이 정책 때문에 막혔구나!’ 하고 무릎을 탁 친 적이 한두 번이 아닙니다. 😅

    Calico 네트워크 정책 적용 후 Pod 간 통신 흐름이 시각적으로 차단되거나 허용되는 대시보드 화면 캡처

    Calico 네트워크 정책 적용 후 Pod 간 통신 흐름이 시각적으로 차단되거나 허용되는 대시보드 화면 캡처

    4. 삽질 경험 공유 및 트러블슈팅 ⚠️

    제가 Calico 네트워크 정책을 운영하면서 겪었던 흔한 삽질과 해결책을 공유해볼게요.

    1. 정책 순서(Order) 문제: GlobalNetworkPolicy와 NetworkPolicy, 그리고 여러 정책이 동시에 적용될 때 order 필드를 제대로 설정하지 않아 예상과 다르게 동작하는 경우가 많아요. Calico는 우선순위가 높은 정책(order 값이 낮은 정책)이 먼저 적용됩니다. 기본적으로 NetworkPolicy는 GlobalNetworkPolicy보다 우선순위가 낮게(order 값이 높게) 적용되니, 충돌을 피하려면 order 값을 잘 조정해야 해요.

    2. kube-system 네임스페이스 정책 누락: kube-system 네임스페이스의 Pod들은 Kubernetes 클러스터 운영에 필수적인 역할을 하거든요. 여기에 default-deny-all 같은 강력한 정책을 적용했다가 클러스터 자체가 마비되는 참사를 겪을 수 있습니다. kube-system이나 calico-system 같은 핵심 네임스페이스에는 웬만하면 정책을 적용하지 않거나, 적용하더라도 매우 신중하게 필수 통신만 허용해야 해요.

    3. Prometheus/Grafana 같은 모니터링 툴 통신 문제: 모니터링 툴들은 다른 Pod의 메트릭(Metric)을 수집해야 하는데, 네트워크 정책으로 인해 이 통신이 막히는 경우가 잦습니다. 모니터링 스택(Stack)을 배포할 때는 반드시 해당 Pod들이 메트릭을 수집할 대상 Pod에 접근할 수 있도록 Ingress 정책을 허용해줘야 해요.

    Calico 네트워크 정책의 Ingress/Egress, Selector, Order 필드 등 주요 개념을 요약한 인포그래픽

    Calico 네트워크 정책의 Ingress/Egress, Selector, Order 필드 등 주요 개념을 요약한 인포그래픽

    5. 마무리하며: 꾸준한 관리와 검토가 중요합니다.

    오늘은 Calico 네트워크 정책을 활용해서 Kubernetes 프로덕션 환경의 보안을 강화하는 베스트 프랙티스들을 소개해드렸습니다. 기본적으로 모든 트래픽을 차단하고 필요한 통신만 명시적으로 허용하는 방식, 레이블 기반의 유연한 정책 관리, 그리고 GlobalNetworkPolicy를 활용한 클러스터 전역 정책 적용 등이 핵심이었습니다. 처음에는 다소 복잡하고 어렵게 느껴질 수 있지만, 몇 번 해보면 금방 익숙해져요. 오히려 이렇게 단단하게 네트워크 보안을 구축해두면 나중에 훨씬 마음이 편하거든요.

    네트워크 정책은 한 번 설정했다고 끝이 아닙니다. 애플리케이션이 변경되거나 새로운 서비스가 추가될 때마다 정책을 검토하고 업데이트해야 해요. 지속적인 관리와 검토만이 강력한 보안을 유지하는 길입니다. 저도 아직 배워야 할 게 많지만, 앞으로도 이렇게 삽질하며 얻은 경험들을 아낌없이 공유해드리겠습니다. 다음번에는 Calico 네트워크 정책을 GitOps 방식으로 관리하는 방법에 대해 다뤄볼까 합니다. 기대해주세요! 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 😊

  • [Kubernetes] Cilium CNI 성능 벤치마크: Calico, Flannel과 직접 비교

    [Kubernetes] Cilium CNI 성능 벤치마크: Calico, Flannel과 직접 비교

    [Kubernetes] Cilium CNI 성능 벤치마크: Calico, Flannel과 직접 비교

    안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 Kubernetes(쿠버네티스) 환경에서 가장 중요한 요소 중 하나인 CNI(Container Network Interface, 컨테이너 네트워크 인터페이스) 솔루션들의 성능을 제가 직접 벤치마크해본 경험을 공유하려고 해요. 특히 요즘 핫한 Cilium(실리움)이 기존의 Calico(칼리코), Flannel(플라넬)과 비교해서 얼마나 뛰어난지 궁금했거든요.

    인프라 엔지니어로 일하다 보면 ‘네트워크 성능이 왜 이렇게 느리지?’ 하는 답답함을 겪을 때가 많습니다. 특히 마이크로서비스 아키텍처에서는 Pod(파드) 간의 통신이 엄청나게 빈번하게 일어나기 때문에, CNI의 선택이 전체 애플리케이션 성능에 결정적인 영향을 미치죠. 저도 홈랩에서 이것저것 실험해보면서 이 문제로 삽질을 좀 했거든요. 그래서 이번 기회에 주요 CNI 솔루션들을 직접 비교해보면서 그 차이를 피부로 느껴보고 싶었습니다.

    CNI란 뭐고 어떤 종류가 있을까?

    먼저 CNI가 뭔지 간단하게 짚고 넘어갈게요. CNI는 컨테이너 런타임과 네트워크 플러그인 간의 표준 인터페이스를 정의한 규약입니다. 쉽게 말해, Kubernetes Pod들이 어떻게 서로 통신하고 외부와 연결될지 결정하는 ‘네트워크 길잡이’ 역할을 하는 거죠.

    • Flannel (플라넬): 가장 단순하고 설치가 쉬운 CNI 중 하나입니다. 주로 Overlay Network(오버레이 네트워크) 방식인 VXLAN(Virtual Extensible LAN)을 사용해요. 설정이 간단해서 초보자들이나 소규모 클러스터에서 많이 선택하지만, 성능 오버헤드가 좀 있는 편입니다.
    • Calico (칼리코): 네트워크 정책(Network Policy) 기능이 강력하고 성능도 준수해서 많은 프로덕션 환경에서 사용됩니다. IP-in-IP 터널링이나 BGP(Border Gateway Protocol) 라우팅 방식을 주로 쓰는데, 특히 BGP 모드에서는 오버헤드가 적어서 좋은 성능을 보여주죠. 보안 기능도 뛰어나고요.
    • Cilium (실리움): 오늘 주인공이죠! eBPF(extended Berkeley Packet Filter, 확장된 버클리 패킷 필터)라는 기술을 기반으로 합니다. eBPF는 리눅스 커널 내부에서 프로그램을 실행할 수 있게 해주는 기술인데, 이걸 활용해서 Cilium은 컨테이너 네트워크 트래픽을 커널 레벨에서 직접 처리합니다. 이 덕분에 기존 CNI들이 가졌던 성능 오버헤드를 크게 줄이고, 더 세밀한 네트워크 정책과 가시성(Observability)을 제공할 수 있게 되는 거예요. 처음엔 이게 뭔가 싶었는데, 써보니 진짜 매력적이더라고요.
    Flannel, Calico, Cilium CNI 솔루션의 네트워크 아키텍처 비교 다이어그램

    이 이미지는 Flannel, Calico, Cilium 각 CNI 솔루션의 네트워크 아키텍처를 시각적으로 비교하여, 데이터 플레인 처리 방식의 차이를 보여줍니다.

    실전 구현: 벤치마크 환경 준비와 테스트 방법

    자, 그럼 이제 제가 어떻게 벤치마크를 진행했는지 공유해볼게요. 홈랩에 Kubernetes 클러스터를 kubeadm으로 구성했고, 각 CNI를 순서대로 설치해가며 성능을 측정했습니다.

    1. Cilium CNI 벤치마크를 위한 환경 준비

    저는 3노드(마스터 1, 워커 2) Kubernetes 클러스터를 사용했습니다. 테스트의 공정성을 위해 각 CNI를 설치하기 전에는 항상 클러스터를 초기화하고 깨끗한 상태에서 시작했어요. 벤치마크 도구로는 네트워크 성능 측정에 널리 사용되는 netperf를 선택했습니다. TCP_STREAM(대역폭), TCP_RR(요청/응답 지연 시간) 두 가지 모드로 측정했어요.

    
    # netperf 설치 (Ubuntu 기준)
    sudo apt update
    sudo apt install netperf -y
    
    # 벤치마크용 Pod 배포 예시
    kubectl apply -f - <

    각 CNI를 설치한 후, netperf-server Pod를 배포하고 다른 Pod에서 netperf 클라이언트를 실행하여 서버 Pod로 트래픽을 보냈습니다. Pod-to-Pod 통신과 Pod-to-Service 통신 두 가지 시나리오를 모두 측정했어요.

    2. Cilium 포함 각 CNI 설치 및 성능 측정

    1. Flannel 설치 및 측정:
      
      kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
      # Pod Ready 확인 후 netperf 측정
      
    2. Calico 설치 및 측정:
      
      kubectl apply -f https://docs.tigera.io/calico/latest/manifests/calico.yaml
      # Pod Ready 확인 후 netperf 측정
      
    3. Cilium 설치 및 성능 측정:
      
      helm repo add cilium https://helm.cilium.io/
      helm install cilium cilium/cilium --version 1.15.5 \
        --namespace kube-system \
        --set ipam.mode=kubernetes \
        --set tunnel=vxlan \
        --set egressGateway.enabled=true # 예시 설정
      # Pod Ready 확인 후 netperf 측정
      

    ⚠️ 주의사항: 각 CNI를 설치하기 전에 기존 CNI를 완전히 삭제하고 클러스터를 초기화하거나, CNI 관련 리소스를 제거해야 합니다. 그렇지 않으면 네트워크 충돌로 Pod들이 정상적으로 시작되지 않을 수 있거든요. 제가 처음엔 이걸 놓쳐서 Pod들이 Pending(대기) 상태에서 벗어나지 못하는 삽질을 좀 했습니다 ㅎㅎ.

    이 이미지는 Kubernetes 클러스터에 Cilium CNI를 helm을 이용하여 설치하는 과정을 보여주는 터미널 스크린샷입니다.

    ⚠️ 삽질 경험과 Cilium 트러블슈팅

    솔직히 말씀드리면, Cilium을 처음 설치할 때 좀 애먹었습니다. kubeadm으로 구성한 클러스터에서 Cilium Pod들이 CrashLoopBackOff(크래시 루프백 오프) 상태에 빠지더라고요. 확인해보니 커널 버전 문제와 eBPF 관련 의존성 설정이 제대로 안 된 경우였습니다. Cilium은 eBPF 기반이라 리눅스 커널 버전이 어느 정도 이상이어야 하고, 특정 커널 모듈이나 설정이 활성화되어 있어야 하거든요. 예를 들어, CONFIG_BPF_JIT 같은 커널 옵션이 활성화되어 있는지 확인해야 합니다.

    이런 문제 때문에 Cilium 설치 전에 공식 문서를 꼼꼼히 읽어보고, cilium preflight check 같은 명령어로 환경을 미리 점검하는 게 정말 중요합니다. 덕분에 커널 컴파일 옵션까지 찾아보는 등 깊은 공부를 하게 됐네요. 역시 삽질은 최고의 공부 방법입니다!

    검증 결과: Cilium CNI의 성능은 정말 압도적일까?

    수많은 테스트와 삽질 끝에 얻은 결과는 예상대로였습니다. Cilium이 Calico, Flannel 대비 전반적으로 더 우수한 네트워크 성능을 보여줬거든요.

    • Throughput (대역폭): 특히 대량의 데이터를 전송하는 TCP_STREAM 테스트에서 Cilium은 Calico나 Flannel보다 더 높은 처리량을 기록했습니다. eBPF 덕분에 커널 레벨에서 패킷을 직접 처리하면서 컨텍스트 스위칭(Context Switching) 오버헤드가 크게 줄어든 거 같아요.
    • Latency (지연 시간): 요청-응답(TCP_RR) 테스트에서도 Cilium이 가장 낮은 지연 시간을 보여줬습니다. 이는 마이크로서비스 간의 빈번한 API 호출에 있어 정말 중요한 이점이거든요. 애플리케이션의 반응성이 훨씬 좋아지는 거죠.

    물론, 테스트 환경이나 네트워크 구성에 따라 결과는 달라질 수 있습니다. 하지만 제 홈랩 환경에서는 Cilium의 성능 향상이 눈에 띄게 확인되었어요. 특히 Pod 간의 통신이 잦은 환경이라면 Cilium CNI의 도입을 진지하게 고려해볼 만하다고 생각합니다.

    Cilium, Calico, Flannel CNI 성능 벤치마크 결과 비교 그래프

    이 이미지는 Cilium, Calico, Flannel 각 CNI 솔루션의 네트워크 Throughput(대역폭)과 Latency(지연 시간) 벤치마크 결과를 보여주는 비교 그래프입니다.

    결론: Cilium은 미래의 CNI 표준이 될까?

    이번 벤치마크를 통해 Cilium의 강력한 성능을 직접 확인할 수 있었습니다. eBPF라는 혁신적인 기술을 기반으로 기존 CNI의 한계를 뛰어넘는 모습을 보여줬네요. 특히 고성능이 요구되는 환경이나 복잡한 네트워크 정책, 그리고 뛰어난 가시성이 필요한 곳이라면 Cilium은 정말 훌륭한 선택지가 될 겁니다.

    하지만 Cilium이 만능은 아닙니다. eBPF에 대한 이해가 필요하고, 상대적으로 커널 의존성이 높아서 환경 구성에 더 신경 써야 할 부분이 있어요. 설치와 설정도 Calico나 Flannel보다는 복잡할 수 있다는 점도 고려해야 합니다.

    결론적으로, 간단하고 빠른 배포가 우선이라면 Flannel, 안정적인 성능과 강력한 네트워크 정책이 필요하다면 Calico, 그리고 최고의 성능과 보안, 고급 가시성을 원한다면 Cilium을 고려해보시길 추천합니다. 저도 이제 프로덕션 환경에서 Cilium을 더 적극적으로 도입해볼까 고민 중입니다.

    다음번엔 Cilium의 네트워크 정책(Network Policy) 기능과 서비스 메시(Service Mesh) 연동에 대해 더 자세히 다뤄볼 예정이니 기대해주세요! 긴 글 읽어주셔서 감사합니다.

    Flannel, Calico, Cilium CNI 솔루션 장단점 및 추천 시나리오 요약 인포그래픽

    이 이미지는 Flannel, Calico, Cilium 각 CNI 솔루션의 주요 특징, 장점, 단점 및 추천 사용 시나리오를 요약 비교한 인포그래픽입니다.