이번 블로그에서는 Kubernetes 클러스터에서 네트워크 정책과 보안을 제공하는 네트워크 플러그인 Calico에 대한 글을 작성해보겠습니다.
Calico 개념
Calico는 컨테이너와 가상 머신을 위한 네트워킹 솔루션입니다. 즉 여러 컴퓨터나 서버에서 실행되는 애플리케이션들이 서로 안전하고 효율적으로 통신할 수 있도록 도와주는 도구라고 생각하시면 될 것 같습니다.
Calico는 아래의 주요 특징을 가지고 있습니다.
- 다양한 환경 지원 : Kubernetes, OpenShift 등 여러 플랫폼에서 사용할 수 있습니다.
- 빠른 성능 : 최신 기술(eBPF)이나 기존 리눅스 네트워킹을 사용해 빠른 속도를 제공합니다.
- 일관된 사용 경험 : 클라우드에서든 회사 내부 서버에서든, 작은 규모에서든 큰 규모에서든 동일한 방식으로 사용할 수 있습니다.
Calico 구성요소

Calico CNI 설치시 Daemonset 으로 calico-node 파드가 생성됩니다. 이때, calico-node 파드에는 3가지(bird/felix/confd) 중요한 프로그램이 동작합니다.
파드 생성 시 Calico Datastore를 기반으로 CNI 및 IPAM 플러그인이 파드 네트워크를 설정하며, 노드 간 파드 통신은 bird가 학습한 경로 정보를 felix가 호스트의 라우팅 테이블과 iptables에 적용해 처리합니다.
Calico Datastore

Calico 동작을 위한 데이터들을 저장하는 곳으로, 쿠버네티스 API 저장소 혹은 ETCD 를 선택할 수 있습니다.
bird

BGP(Border Gateway Protocol)를 사용하여 노드 간 라우팅 정보를 교환합니다.
felix

bird로 학습한 상대방 노드의 파드 네트워크 대역을 호스트의 라우팅 테이블에 최종적으로 업데이트하는 역할을 하며, IPtables 규칙 설정 관리를 합니다. 즉, 인터페이스 관리, 라우팅 정보 관리, ACL 관리, 상태 체크를 담당합니다.
condif

BGP 설정 등으로 Calico Datastore에 변경이 발생하면, bird 설정 파일을 갱신하고 이를 bird에 적용합니다.
구축 방안
- a → b 파드 통신은 허용하고, c → a 파드에서의 통신은 되지 않도록 구성해보겠습니다.
먼저 Helm을 이용해 Calico를 설치하고 curl을 이용해 Calicoctl도 설치해주겠습니다.
helm repo add projectcalico https://docs.tigera.io/calico/charts
helm repo update
kubectl create namespace tigera-operator
helm install calico projectcalico/tigera-operator --version v3.29.2 --namespace tigera-operator
kubectl patch installation default --type='json' -p='[{"op": "replace", "path": "/spec/cni", "value": {"type":"Calico"} }]'
다음으로 NetworkPolicy를 정의해주겠습니다. ingress는 인바운드 규칙, egress는 아웃바운드규칙입니다.
- 아래의 정책은 selector를 이용해 a 파드에 적용이 되며, b 파드에서 들어오는 트래픽은 허용하고 c 파드에서 들어오는 트래픽은 차단하는 정책입니다.
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-communication-for-a-pod
spec:
selector: app == 'a-pod'
egress:
- action: Allow
ingress:
- action: Allow
source:
selector: app == 'b-pod'
- action: Deny
source:
selector: app == 'c-pod'
다음으로 통신을 테스트 할 Sample Pod(a, b, c)를 구성해주겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: a-pod
labels:
app: a-pod
spec:
containers:
- name: a-container
image: nginx:latest
apiVersion: v1
kind: Pod
metadata:
name: b-pod
labels:
app: b-pod
spec:
containers:
- name: b-container
image: nginx:latest
apiVersion: v1
kind: Pod
metadata:
name: c-pod
labels:
app: c-pod
spec:
containers:
- name: c-container
image: nginx:latest
kubectl apply -f a-pod.yaml && kubectl apply -f b-pod.yaml && kubectl apply -f c-pod.yaml
Result
kubectl exec -it a-pod -- curl <b-pod-ip>
kubectl exec -it c-pod -- curl <a-pod-ip>
위 설정을 올바르게 했다면 아래의 사진과 같이 a → b 파드로는 통신이 되는것을 확인 할 수 있으며 c → a 파드에서의 통신은 안되는 것을 볼 수있습니다.

이것으로 Calico CNI에 대한 글을 마치겠습니다. 감사합니다!
[참고]
'Cloud > Kubernetes' 카테고리의 다른 글
| NodeLocalDNS (0) | 2025.10.27 |
|---|---|
| Istio Keycloak 인증 연동 (0) | 2025.09.29 |
| 쿠버네티스 기본 명령어를 알아보자 (0) | 2025.05.01 |
| 쿠버네티스(k8s)의 구성요소 및 작동원리 (0) | 2025.05.01 |