Calico
Project Calico
Kubernetes CNI 플러그인으로 NetworkPolicy와 BGP 기반 라우팅을 지원하는 컨테이너 네트워킹 솔루션. 마이크로세그멘테이션으로 Pod 간 세밀한 보안 정책을 구현합니다.
Project Calico
Kubernetes CNI 플러그인으로 NetworkPolicy와 BGP 기반 라우팅을 지원하는 컨테이너 네트워킹 솔루션. 마이크로세그멘테이션으로 Pod 간 세밀한 보안 정책을 구현합니다.
Calico(Project Calico)는 컨테이너, 가상 머신, 베어메탈 워크로드를 위한 오픈소스 네트워킹 및 보안 솔루션입니다. Tigera가 개발하고 유지 관리하며, Kubernetes에서 가장 널리 사용되는 CNI(Container Network Interface) 플러그인 중 하나입니다. AWS EKS, Google GKE, Azure AKS 등 주요 클라우드 Kubernetes 서비스에서 기본 또는 옵션 CNI로 제공됩니다.
Calico의 핵심 특징은 BGP(Border Gateway Protocol) 기반의 순수 Layer 3 네트워킹입니다. 일반적인 오버레이 네트워크(VXLAN, Geneve)와 달리 패킷 캡슐화 없이 직접 라우팅하므로, 네트워크 오버헤드가 적고 성능이 우수합니다. 필요시 VXLAN 모드도 지원하여 클라우드 환경에서의 유연성을 제공합니다.
Calico는 Kubernetes NetworkPolicy를 완벽하게 지원하며, 추가로 GlobalNetworkPolicy, NetworkSet 등 확장된 정책 리소스를 제공합니다. 이를 통해 마이크로세그멘테이션(Microsegmentation)을 구현하여 Pod 간 트래픽을 라벨 기반으로 세밀하게 제어할 수 있습니다. 예를 들어 "frontend Pod는 backend Pod의 8080 포트만 접근 가능"과 같은 정책을 선언적으로 정의합니다.
대규모 프로덕션 환경에서 Calico는 수만 개의 Pod를 지원하며, eBPF 모드를 활성화하면 iptables 대신 커널 레벨에서 네트워크 처리를 수행하여 더욱 향상된 성능을 제공합니다. 금융, 헬스케어 등 보안이 중요한 환경에서 Zero Trust 네트워크 구현에 필수적인 도구입니다.
# Kubernetes NetworkPolicy - frontend에서 backend로만 접근 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
---
# 기본 거부 정책 - 모든 ingress 차단 (화이트리스트 방식)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: production
spec:
podSelector: {} # 모든 Pod에 적용
policyTypes:
- Ingress
---
# 데이터베이스 접근 제한 - backend에서만 MySQL 접근
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mysql-allow-backend
namespace: production
spec:
podSelector:
matchLabels:
app: mysql
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- port: 3306
# Calico 설치 (Kubernetes 클러스터)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
# Calico 상태 확인
kubectl get pods -n calico-system
kubectl get nodes -o wide
# calicoctl 설치 (Calico CLI)
curl -L https://github.com/projectcalico/calico/releases/download/v3.27.0/calicoctl-linux-amd64 -o calicoctl
chmod +x calicoctl && sudo mv calicoctl /usr/local/bin/
# Calico 노드 상태 확인
calicoctl node status
# NetworkPolicy 목록 조회
kubectl get networkpolicy -A
# NetworkPolicy 상세 확인
kubectl describe networkpolicy backend-allow-frontend -n production
# Calico IPAM 정보 확인
calicoctl ipam show
# Pod IP 할당 확인
kubectl get pods -o wide -n production
# BGP Peer 상태 확인
calicoctl get bgpPeer -o yaml
# 네트워크 정책 적용 테스트
kubectl run test-pod --image=busybox --rm -it -- wget -qO- http://backend:8080
# Calico GlobalNetworkPolicy - 클러스터 전체에 적용
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: deny-external-egress
spec:
selector: all()
types:
- Egress
egress:
# 내부 Pod 통신 허용
- action: Allow
destination:
nets:
- 10.0.0.0/8
# DNS 허용 (UDP/TCP 53)
- action: Allow
protocol: UDP
destination:
ports:
- 53
# 나머지 외부 통신 차단
- action: Deny
---
# Calico NetworkSet - IP 범위 그룹화
apiVersion: projectcalico.org/v3
kind: GlobalNetworkSet
metadata:
name: trusted-external-services
spec:
nets:
- 52.94.0.0/16 # AWS API
- 35.190.0.0/16 # GCP API
- 13.107.0.0/16 # Azure API
---
# NetworkSet 사용하는 정책
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: allow-cloud-apis
spec:
selector: app == 'api-gateway'
types:
- Egress
egress:
- action: Allow
destination:
selector: projectcalico.org/name == 'trusted-external-services'
protocol: TCP
destination:
ports:
- 443
"CNI는 Calico를 사용하겠습니다. NetworkPolicy가 완벽히 지원되고, BGP 모드로 오버레이 없이 직접 라우팅하면 VXLAN 대비 10-15% 성능 향상을 기대할 수 있습니다. 온프레미스 네트워크 팀과 BGP 피어링 설정만 조율하면 됩니다."
"Calico NetworkPolicy로 마이크로세그멘테이션을 구현했습니다. 기본 정책은 deny-all이고, 필요한 통신만 화이트리스트로 허용합니다. frontend는 backend의 8080만, backend는 DB의 3306만 접근 가능합니다. calicoctl로 정책 적용 현황을 실시간 모니터링하고 있습니다."
"Pod 간 통신이 안 되면 먼저 NetworkPolicy 확인하세요. kubectl describe networkpolicy로 selector가 맞는지, 포트가 열려있는지 확인하고, calicoctl node status로 BGP 연결 상태도 체크해야 합니다. Felix 로그도 확인해보시고요."
NetworkPolicy가 없으면 모든 Pod가 서로 통신 가능합니다. 보안을 위해 default-deny 정책을 먼저 적용하고, 필요한 트래픽만 허용하는 화이트리스트 방식을 사용하세요.
NetworkPolicy의 podSelector 라벨이 실제 Pod 라벨과 일치하지 않으면 정책이 적용되지 않습니다. kubectl get pods --show-labels로 라벨을 정확히 확인하세요.
Egress deny-all 정책 적용 시 DNS(UDP 53) 트래픽도 차단됩니다. 서비스 이름 해석이 안 되어 통신이 실패합니다. kube-system의 CoreDNS로 나가는 DNS 트래픽은 반드시 허용하세요.
default-deny 정책 후 필요한 트래픽만 허용. DNS egress는 항상 허용. calicoctl로 정기적으로 정책 검증. eBPF 모드 사용 시 커널 5.3+ 필수. Felix, BIRD 로그 모니터링 설정.