본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Calico 정책 튜토리얼

원문 보기 위키 갱신

Calico 네트워크 정책은 Kubernetes 네트워크 정책의 기능을 확장해요. 이를 보여주기 위해 이 튜토리얼은 Kubernetes 고급 네트워크 정책 튜토리얼과 비슷한 흐름을 따르지만, 대신 Calico 네트워크 정책을 사용하고 두 정책 유형의 차이를 강조하며 Kubernetes 네트워크 정책에서는 쓸 수 없는 기능을 활용해요. 단계를 따라 하다 보면 default deny부터 선택적 허용까지 정책을 조립하는 감각이 잡힐 거예요.

출처: 문서

본문

Calico 네트워크 정책은 Kubernetes 네트워크 정책의 기능을 확장해요. 이 튜토리얼은 Kubernetes 고급 네트워크 정책 튜토리얼과 비슷한 접근을 따르지만, 대신 Calico 네트워크 정책을 사용하고 두 정책 유형의 차이점을 강조하며 Kubernetes 네트워크 정책에서는 쓸 수 없는 기능을 활용해요.

요구 사항

  • 동작하는 Kubernetes 클러스터와 kubectl, calicoctl로 접근할 수 있는 권한
  • Kubernetes 노드가 퍼블릭 인터넷에 연결되어 있어야 해요
  • Calico NetworkPolicy에 대해 익숙해야 해요

튜토리얼 흐름

  1. 네임스페이스와 NGINX 서비스 만들기
  2. default deny 구성하기
  3. busybox에서 나가는(egress) 트래픽 허용하기
  4. NGINX로 들어오는(ingress) 트래픽 허용하기
  5. 정리하기

1. 네임스페이스와 nginx 서비스 만들기

이 가이드에서는 새 네임스페이스를 사용해요. 다음 명령을 실행해서 네임스페이스와 포트 80에서 리슨하는 평범한 NGINX 서비스를 만드세요.

kubectl create ns advanced-policy-demo
kubectl create deployment --namespace=advanced-policy-demo nginx --image=nginx
kubectl expose --namespace=advanced-policy-demo deployment nginx --port=80

접근 확인 - 모든 ingress와 egress가 허용됨

Kubernetes 클러스터에 kubectl 연결이 있는 두 번째 셸 세션을 열고, 정책 접근을 테스트할 busybox 파드를 만드세요. 이 파드는 이 튜토리얼 전반에서 정책 접근 테스트에 사용돼요.

kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

다음과 같이 busybox 파드 안에 셸 세션이 열려요.

Waiting for pod advanced-policy-demo/access-472357175-y0m47 to be running, status is Pending, pod ready: false

If you don't see a command prompt, try pressing enter.
/ #

이제 busybox "access" 파드 안에서 다음 명령을 실행해서 nginx 서비스 접근을 테스트해요.

wget -q --timeout=5 nginx -O -

nginx 환영 페이지의 HTML이 반환돼요.

여전히 busybox "access" 파드 안에서 다음 명령을 실행해서 google.com 접근을 테스트해요.

wget -q --timeout=5 google.com -O -

google.com 홈 페이지의 HTML이 반환돼요.

2. 모든 트래픽 잠그기

먼저 제로 트러스트 네트워크 모델을 채택해 워크로드를 보호하는 모범 사례를 따르도록 돕는 default deny 글로벌 Calico 네트워크 정책(Calico로만 가능해요)을 사용해요. 글로벌 Calico 네트워크 정책은 네임스페이스에 속하지 않고, 정책 셀렉터와 일치하는 모든 파드에 적용돼요. 반면 Kubernetes 네트워크 정책은 네임스페이스 단위라서 같은 효과를 내려면 네임스페이스마다 default deny 정책을 만들어야 해요. 참고로 이 튜토리얼을 단순하게 유지하려고 kube-system, calico-system, calico-apiserver 네임스페이스의 파드는 제외해요. 그래야 default deny를 적용할 때 Kubernetes 자체가 원활하게 돌아가도록 유지하는 정책까지 고민하지 않아도 되거든요.

calicoctl 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

접근 확인 - 모든 ingress와 egress가 거부됨

파드들이 kube-system 네임스페이스에 있지 않으니 방금 만든 정책이 적용되고, 정책이 명시적으로 허용하지 않는 모든 트래픽은 거부돼요.

"access" 파드로 옮겨가서 nginx 서비스 접근을 시도하면 이를 확인할 수 있어요.

wget -q --timeout=5 nginx -O -

다음이 반환돼요:

wget: bad address 'nginx'

이번에는 google.com에 접근해 보세요.

wget -q --timeout=5 google.com -O -

다음이 반환돼요:

wget: bad address 'google.com'

3. busybox에서 나가는 트래픽 허용하기

busybox "access" 파드에서 나가는 트래픽을 허용하는 Calico 네트워크 정책을 만들어 봐요. 프로덕션 워크로드라면 보통 이 egress 규칙을 더 엄격하게 만들어 워크로드가 통신해야 하는 특정 서비스로만 나갈 수 있게 할 거예요. 하지만 이건 그냥 더미 access 파드니까, 이 경우에 어떤 트래픽이 허용되는지 탐침해 볼 수 있도록 모든 egress 트래픽을 허용할게요.

calicoctl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-busybox-egress
  namespace: advanced-policy-demo
spec:
  selector: run == 'access'
  types:
  - Egress
  egress:
  - action: Allow
EOF

egress 확인 - "access" 파드에서 google은 되고 nginx는 안 됨

모든 egress 트래픽을 허용했으니 이제 google에 접근할 수 있어야 해요.

google.com의 홈 페이지를 가져와 보세요.

wget -q --timeout=5 google.com -O -

google 홈 페이지의 HTML이 반환돼요.

nginx 파드에 접근하려고 하면, access 파드에서 나가는 egress는 허용되지만 default deny 정책이 nginx 파드로 들어오는 ingress 트래픽을 막고 있어서 연결은 여전히 거부돼요.

nginx 서비스에 접근할 수 없음을 확인하려면 명령을 실행해요.

wget -q --timeout=5 nginx -O -

다음이 반환돼요:

wget: download timed out

busybox access 파드의 모든 egress 트래픽을 허용했기 때문에 google 접근은 허용되지만, 그 서비스로 들어오는 ingress 트래픽을 아직 허용하지 않아서 nginx 서비스에는 접근할 수 없어요. 이제 그렇게 해 볼게요.

4. nginx로 들어오는 트래픽 허용하기

busybox access 파드에서 nginx 서비스로 들어오는 트래픽을 허용하는 Calico 네트워크 정책을 만들어 봐요.

calicoctl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-nginx-ingress
  namespace: advanced-policy-demo
spec:
  selector: app == 'nginx'
  types:
  - Ingress
  ingress:
  - action: Allow
    source:
      selector: run == 'access'
EOF

접근 확인 - "access" 파드에서 nginx로 들어오는 트래픽이 허용됨

이제 nginx 서비스에 접근할 수 있는지 확인하려면 명령을 실행해요.

wget -q --timeout=5 nginx -O -

nginx 환영 페이지의 HTML이 반환돼요.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>...

다음은 google.com의 홈 페이지를 가져와 보세요.

wget -q --timeout=5 google.com -O -

google 홈 페이지의 HTML이 반환돼요.

Calico 네트워크 정책으로 access 파드가 외부 인터넷과 nginx 서비스에 접근하도록 허용했어요!

5. 정리하기

이 튜토리얼 세션을 정리하려면 다음 명령을 실행해서 네트워크 정책을 정리하고 데모 네임스페이스를 제거하세요.

calicoctl delete policy allow-busybox-egress -n advanced-policy-demo
calicoctl delete policy allow-nginx-ingress -n advanced-policy-demo
calicoctl delete gnp default-deny
kubectl delete ns advanced-policy-demo

더 알아보기 (Learn more)

이 튜토리얼의 핵심은 "모두 거부한 뒤 필요한 것만 허용"이라는 제로 트러스트 흐름이에요. 글로벌 정책은 네임스페이스를 넘어 적용되지만 Kubernetes NetworkPolicy는 네임스페이스 단위라는 차이도 꼭 기억하세요. 다음 단계로는 source 셀렉터를 더 좁혀서 실전형 정책을 만들어 보는 걸 추천해요.