Calico 퀵스타트 가이드
이 퀵스타트 가이드는 Calico를 설치하고, 네트워크 정책으로 클러스터를 보호하고, Calico Whisker로 네트워크 트래픽을 모니터링하는 방법을 보여줘요. kind로 개인 워크스테이션에 단일 호스트 Kubernetes 클러스터를 만들고 약 15분 안에 따라 할 수 있어요. NGINX·BusyBox 트래픽 실습과 기본 거부(default deny) 정책 적용까지 이어져요.
출처: 문서
본문
시작하기 전에
이 튜토리얼을 완료하려면 몇 가지 도구를 설치해야 해요:
kind. 워크스테이션에 클러스터를 만들 때 사용해요. 설치 지침은kind문서를 참고하세요.- Docker Engine 또는 Docker Desktop.
kind유틸리티가 컨테이너를 실행하는 데 필요해요. 설치 지침은 Docker 문서를 참고하세요. kubectl. 클러스터와 상호작용할 때 사용하는 도구예요. 설치 지침은 Kubernetes 문서를 참고하세요.
단계 1: 클러스터 만들기
이 단계에서 할 일은:
- 클러스터 만들기:
kind로 Kubernetes 클러스터를 만들어요. - 클러스터 확인: 클러스터가 실행 중이고 준비됐는지 점검해요.
-
config.yaml이라는 파일을 만들고 다음 내용을 넣어요:kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker networking: disableDefaultCNI: true podSubnet: 192.168.0.0/16이 구성 파일은
kind에게 컨트롤 플레인 노드 하나와 워커 노드 두 개로 이루어진 클러스터를 만들라고 알려줘요. CNI 없이 클러스터를 만들라고 지시하는 부분도 있어요.podSubnet범위는 Kubernetes가 파드에 사용할 IP 주소를 정의해요. -
다음 명령을 실행해 구성 파일로 Kubernetes 클러스터를 시작해요:
kind create cluster --name=calico-cluster --config=config.yamlkind가 구성 파일을 읽고 몇 분 안에 클러스터를 만들어요.예상 출력
Creating cluster "calico-cluster" ... ✓ Ensuring node image (kindest/node:v1.29.2) 🖼 ✓ Preparing nodes 📦 📦 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing StorageClass 💾 ✓ Joining worker nodes 🚜 Set kubectl context to "kind-calico-cluster" You can now use your cluster with: kubectl cluster-info --context kind-calico-cluster Thanks for using kind! 😊 -
클러스터가 동작하는지 확인하려면 다음 명령을 실행해요:
kubectl get nodes클러스터에 지정한 이름이 붙은 세 개의 노드가 보일 거예요.
예상 출력
NAME STATUS ROLES AGE VERSION calico-cluster-control-plane NotReady control-plane 5m46s v1.29.2 calico-cluster-worker NotReady <none> 5m23s v1.29.2 calico-cluster-worker2 NotReady <none> 5m22s v1.29.2노드가
Ready상태가 되길 기다리지 마세요. 다음 단계에서 네트워킹을 구성하기 전까지는NotReady상태로 남아 있어요.
단계 2. Calico 설치하기
이 단계에서는 클러스터에 Calico를 설치해요.
-
Calico 커스텀 리소스 정의를 설치해요.
클러스터가 Kubernetes 1.36 이상 기반이라면:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org.yaml클러스터가 Kubernetes 1.34 또는 1.35 기반이라면:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org-v1beta1.yaml -
Tigera Operator를 설치해요.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/tigera-operator.yaml예상 출력
namespace/tigera-operator created serviceaccount/tigera-operator created clusterrole.rbac.authorization.k8s.io/tigera-operator-secrets created clusterrole.rbac.authorization.k8s.io/tigera-operator created clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created rolebinding.rbac.authorization.k8s.io/tigera-operator-secrets created deployment.apps/tigera-operator created -
필요한 커스텀 리소스를 만들어 Calico를 설치해요.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/custom-resources.yaml예상 출력
installation.operator.tigera.io/default created apiserver.operator.tigera.io/default created goldmane.operator.tigera.io/default created whisker.operator.tigera.io/default created -
다음 명령으로 배포를 모니터링해요:
watch kubectl get tigerastatus몇 분 후에는 모든 Calico 컴포넌트가
AVAILABLE열에True로 표시돼요.예상 출력
NAME AVAILABLE PROGRESSING DEGRADED SINCE apiserver True False False 4m9s calico True False False 3m29s goldmane True False False 3m39s ippools True False False 6m4s whisker True False False 3m19s
단계 3. Calico Whisker에서 네트워크 트래픽 모니터링하기
Whisker 웹 콘솔은 자동으로 배포되지만 기본적으로 클러스터 밖에서 접근할 수 없어요. 웹 콘솔을 보려면 접근을 허용해야 해요.
이 단계에서 할 일은:
- 포트 포워딩 설정: 브라우저에서 Whisker 웹 콘솔에 접근할 수 있게 해줘요.
- Whisker 웹 콘솔 열기: 네트워크 트래픽 로그를 실시간으로 봐요.
-
터미널에서 다음 명령을 실행해요:
kubectl port-forward -n calico-system service/whisker 8443:8443예상 출력
Forwarding from 127.0.0.1:8443 -> 8443 Forwarding from [::1]:8443 -> 8443튜토리얼이 끝날 때까지 이 터미널을 열어 두세요. Whisker 웹 콘솔이 로그를 받으려면 포트 포워딩이 활성 상태여야 해요.
-
Calico Whisker를 열려면 브라우저를 열고
https://localhost:8443으로 가세요. Calico Whisker는 자체 서명 인증서를 사용하기 때문에 처음에는 브라우저가 보안 경고를 표시해요. 경고를 수락하고 계속하세요. 처음에는 어떤 흐름도 보이지 않아요. 하지만 잠시 후 콘솔이 흐름 로그를 받으면 연결 목록이 보이기 시작해요.
Figure 1: Whisker 웹 콘솔에 표시된 핵심 Kubernetes 서비스의 허용된 흐름.
웹 콘솔은 흐름 로그를 실시간으로 쌓아요. 튜토리얼이 끝날 때까지 이 창을 열어 두면 파드가 만드는 연결 로그를 볼 수 있어요.
단계 4. NGINX와 BusyBox로 트래픽 만들기
이제 네트워크 트래픽을 만들 차례예요. 먼저 NGINX 서버를 배포하고 클러스터 안에서 서비스로 노출할 거예요. 그다음 클러스터의 다른 파드에서 NGINX 서버와 외부 웹사이트로 HTTP 요청을 보낼 거예요. 이를 위해 BusyBox 유틸리티를 사용해요.
이 단계에서 할 일은:
- 서버 만들기: Kubernetes 클러스터에 NGINX 웹 서버를 배포해요.
- 서버 노출: NGINX 서버를 클러스터 안에서 접근 가능하게 만들어요.
- 연결 테스트: BusyBox 파드로 NGINX 서버와 공용 인터넷에 대한 연결을 확인해요.
-
애플리케이션용 네임스페이스를 만들어요:
kubectl create namespace quickstart예상 출력
namespace/quickstart created -
quickstart네임스페이스에 NGINX 웹 서버를 배포해요:kubectl create deployment --namespace=quickstart nginx --image=nginx예상 출력
deployment.apps/nginx created -
NGINX 배포를 노출해서 클러스터 안에서 접근 가능하게 만들어요:
kubectl expose --namespace=quickstart deployment nginx --port=80예상 출력
service/nginx exposed -
NGINX 서버에 접근할 수 있는지 테스트하기 위해 BusyBox 세션을 시작해요.
kubectl run --namespace=quickstart access --rm -ti --image busybox /bin/sh이 명령은
quickstart네임스페이스 안에 BusyBox 파드를 만들고 파드 안에서 셸 세션을 시작해요.예상 출력
If you don't see a command prompt, try pressing enter. / # -
BusyBox 셸에서 다음 명령을 실행해 NGINX 서버와의 통신을 테스트해요:
wget -qO- http://nginxNGINX 환영 페이지의 HTML 내용이 보일 거예요.
예상 출력
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>BusyBox 파드가 NGINX 서버에 접근할 수 있다는 뜻이에요.
-
BusyBox 셸에서 다음 명령을 실행해 공용 인터넷과의 통신을 테스트해요:
wget -qO- https://docs.tigera.io/pod-connection-test.txtpod-connectivity-test.txt파일의 내용이 보일 거예요.예상 출력
You successfully connected to https://docs.tigera.io/pod-connection-test.txt.BusyBox 파드가 공용 인터넷에 접근할 수 있다는 뜻이에요.
-
브라우저로 돌아가서 Whisker 웹 콘솔에 연결이 나타나는지 보세요. 새로운 연결 유형 세 개가 보일 거예요:
coredns로 가는 것,nginx로 가는 것, 그리고PUBLIC NETWORK로 가는 것이에요.
Figure 2: NGINX 서버와
https://docs.tigera.io로의 허용된 흐름을 보여주는 Whisker 웹 콘솔.
단계 5. 기본 거부 정책으로 모든 트래픽 제한하기
클러스터를 효과적으로 보호하려면 모든 트래픽을 거부하는 것에서 시작하고, 필요한 트래픽만 점진적으로 허용하는 게 가장 좋아요. 여기서는 모든 인그레스와 이그레스 트래픽을 기본적으로 거부하는 글로벌 Calico 네트워크 정책을 적용해 볼 거예요.
이 단계에서 할 일은:
- 글로벌 기본 거부 정책 구현: 글로벌 Calico 네트워크 정책으로 모든 인그레스와 이그레스 트래픽을 기본적으로 거부해요.
- 접근이 거부되는지 확인: BusyBox 파드로 정책이 기대대로 동작하는지 확인해요.
-
필요한 시스템 네임스페이스를 제외한 모든 트래픽을 거부하는 글로벌 Calico 네트워크 정책을 만들어요:
kubectl create -f - <<EOF apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: default-deny spec: selector: projectcalico.org/namespace not in {'kube-system', 'calico-system', 'calico-apiserver'} types: - Ingress - Egress EOF예상 출력
globalnetworkpolicy.projectcalico.org/default-deny created -
이제 BusyBox 셸로 돌아가서 NGINX 서버 접근을 다시 테스트해요:
wget -qO- http://nginx접근이 거부됐다는 뜻의 다음 출력이 보일 거예요:
예상 출력
wget: bad address 'nginx' -
공용 인터넷 접근도 다시 테스트해요:
wget -qO- https://docs.tigera.io/pod-connection-test.txt이그레스 트래픽도 거부됐다는 뜻의 다음 출력이 보일 거예요:
예상 출력
wget: bad address 'docs.tigera.io' -
브라우저로 돌아가서 Whisker 웹 콘솔에 거부된 흐름 로그가 나타나는지 보세요.
coredns로 가는 거부된 흐름 두 개가 보일 거예요.
Figure 3: NGINX 서버와
https://docs.tigera.io로의 거부된 흐름을 보여주는 Whisker 웹 콘솔.이 단계들을 따라 하면 글로벌 기본 거부 정책을 성공적으로 구현하고 기대대로 동작하는지 확인한 거예요.
단계 6. 허용할 트래픽을 위한 타깃 네트워크 정책 만들기
이제 기본 거부 정책이 자리 잡았으니, 애플리케이션이 동작하는 데 필요한 트래픽만 허용하는 개별 정책을 만들어야 해요. default-deny 정책은 시스템 네임스페이스에 있지 않은 파드의 모든 인그레스와 이그레스 트래픽을 막아요. quickstart 네임스페이스의 access(BusyBox)와 nginx 파드도 포함해서요.
이 단계에서 할 일은:
- BusyBox의 이그레스 트래픽 허용 BusyBox 파드에서 공용 인터넷으로 가는 이그레스 트래픽을 허용하는 네트워크 정책을 만들어요.
- NGINX로의 인그레스 트래픽 허용 NGINX 서버로 들어오는 인그레스 트래픽을 허용하는 네트워크 정책을 만들어요.
-
quickstart네임스페이스에access파드를 선택하고 그 파드의 모든 이그레스 트래픽을 허용하는 Calico 네트워크 정책을 만들어요.kubectl create -f - <<EOF apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-busybox-egress namespace: quickstart spec: selector: run == 'access' types: - Egress egress: - action: Allow EOF예상 출력
networkpolicy.projectcalico.org/allow-busybox-egress created -
BusyBox 셸로 돌아가서 공용 인터넷 접근을 다시 테스트해요. 이 파드의 이그레스 트래픽이 이제 허용되기 때문에 성공해야 해요:
wget -qO- https://docs.tigera.io/pod-connection-test.txt예상 출력
You successfully connected to https://docs.tigera.io/pod-connection-test.txt. -
NGINX 서버 접근을 다시 테스트해요.
access파드 에서의 이그레스는 새 정책이 허용하지만,nginx파드 로의 인그레스는 여전히default-deny정책이 막고 있어요. 이 요청은 실패해야 해요.wget -qO- http://nginx예상 출력
wget: bad address 'nginx'
-
quickstart네임스페이스에 또 다른 Calico 네트워크 정책을 만들어요. 이 정책은nginx파드를 선택하고(레이블app=nginx사용) 레이블이run=access인 파드 에서 오는 인그레스 트래픽을 구체적으로 허용해요.kubectl create -f - <<EOF apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-nginx-ingress namespace: quickstart spec: selector: app == 'nginx' types: - Ingress ingress: - action: Allow source: selector: run == 'access' EOF예상 출력
networkpolicy.org/allow-nginx-ingress created -
NGINX 서버 접근을 다시 테스트해요. BusyBox 셸에서 NGINX 서버 접근을 한 번 더 테스트해요:
wget -qO- http://nginx이제
access에서 오는 이그레스와nginx로 들어오는(access에서 오는) 인그레스가 모두 허용되기 때문에 연결이 성공해야 해요. NGINX 환영 페이지가 보일 거예요:예상 출력
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
이제 기본 거부 정책을 성공적으로 구현한 뒤, 타깃 허용 정책을 만들어 애플리케이션에만 연결성을 되돌려 준 거예요.
단계 7. 정리하기
-
kind클러스터를 제거하려면 다음 명령을 실행해요:kind delete cluster --name calico-cluster예상 출력
Deleting cluster "calico-cluster" ... Deleted nodes: ["calico-cluster-control-plane" "calico-cluster-worker2" "calico-cluster-worker"]
추가 리소스
- 더 깊이 들어가고 싶나요? 브라우저에서 바로 진행하는 무료 인터랙티브 워크숩으로 Calico 기초, Whisker를 활용한 Kubernetes 옵저버빌리티 등을 배워 보세요.
더 알아보기 (Learn more)
이 퀵스타트의 핵심 흐름은 "모두 거부 → 필요한 것만 허용"이에요. 기본 거부 정책을 먼저 걸고 인그레스·이그레스를 하나씩 열어 주는 습관이 실전 클러스터 보안의 기본이 돼요. Whisker 콘솔의 흐름 로그를 함께 보면 정책이 실제로 트래픽에 어떻게 적용되는지 즉시 확인할 수 있어요.