CCA — 실리움 인증 어소시에이트 · 네트워크 정책 · 실습
기본 거부에서 L7 까지 쌓아 올리기
목표
표준 NetworkPolicy 로 기본 거부와 셀렉터 기반 허용을 실제로 적용해 보고, CiliumNetworkPolicy 로만 가능한 L7·FQDN·명시적 거부를 매니페스트로 작성합니다.
왜 중요한가
네트워크 정책은 apply 가 성공했다고 해서 의도대로 동작한다는 보장이 없습니다. 특히 세 가지가 조용히 사람을 속입니다.
첫째, 방향별 독립입니다. ingress 정책만 걸어 두고 "격리했다"고 생각하면 egress 는 여전히 인터넷 전체로 열려 있습니다. 데이터 유출 경로는 대부분 egress 쪽입니다.
둘째, 셀렉터 오타는 에러가 아니라 "아무것도 선택하지 않음"으로 조용히 실패합니다. 적용 후 실제로 몇 개의 엔드포인트가 강제 상태인지 확인해야 합니다.
셋째, toFQDNs 는 DNS 규칙 없이는 영원히 매칭되지 않습니다. 이것이 Cilium 정책에서 가장 흔한 설정 실수이고, 시험에도 반복해서 나옵니다.
표준 NetworkPolicy 는 실제로 apply 하고, CiliumNetworkPolicy 는 /root/cca-policy/ 아래 파일로 작성합니다. 실습 클러스터에 Cilium CRD 가 설치돼 있지 않기 때문이며, 시험에서 요구하는 능력 역시 매니페스트를 정확히 쓰는 것입니다.
단계
1. 네임스페이스 cca-shop 과 cca-mon 을 만들고, cca-mon 에는 라벨 tier=monitoring 을 붙이세요.
2. 네임스페이스 cca-shop 에 디플로이먼트 frontend 와 backend 를 각각 1 레플리카로 배포하세요. 파드 라벨은 각각 app=frontend, app=backend 이고 이미지는 nginx:1.27-alpine 입니다. 그리고 서비스 backend 를 포트 8080 으로 만드세요.
3. 네임스페이스 cca-shop 에 NetworkPolicy default-deny 를 만드세요. podSelector 는 비어 있고, policyTypes 에는 Ingress 와 Egress 를 모두 적으며, 허용 규칙은 하나도 두지 않습니다.
4. 같은 네임스페이스에 NetworkPolicy allow-frontend-to-backend 를 만드세요. podSelector 는 app=backend, policyTypes 는 Ingress 하나, ingress 규칙은 podSelector 가 app=frontend 인 출발지에서 포트 8080 / 프로토콜 TCP 로만 허용합니다.
5. 같은 네임스페이스에 NetworkPolicy allow-monitoring 을 만드세요. podSelector 는 app=backend 이고, ingress 규칙의 from 항목은 namespaceSelector 로 tier=monitoring 인 네임스페이스 하나만 두며 포트는 9090 입니다.
6. /root/cca-policy/cnp-l7.yaml 에 CiliumNetworkPolicy 를 작성하세요. apiVersion 은 cilium.io/v2, metadata.namespace 는 cca-shop, endpointSelector 는 app: backend 입니다. ingress 규칙은 fromEndpoints 가 app: frontend 이고 toPorts 의 포트 8080/TCP 아래 rules.http 에 두 항목을 둡니다. 첫째는 method GET / path /api/v1/orders, 둘째는 method POST / path /api/v1/orders 입니다.
7. /root/cca-policy/cnp-fqdn.yaml 에 CiliumNetworkPolicy 를 작성하세요. endpointSelector 는 app: frontend 이고 egress 규칙은 정확히 두 개입니다. 첫째는 toEndpoints 가 k8s-app: kube-dns 인 대상에 포트 53/UDP 를 열고 rules.dns 에 matchPattern: "*" 를 둡니다. 둘째는 toFQDNs 의 matchName 이 api.pgprovider.example 이고 포트 443/TCP 를 엽니다.
8. /root/cca-policy/cnp-deny.yaml 에 이름이 block-metadata 인 CiliumNetworkPolicy 를 작성하세요. endpointSelector 는 비어 있고, egress 규칙에 toCIDRSet 으로 cidr: 0.0.0.0/0 을 허용하되 except 에 169.254.169.254/32 를 두며, 추가로 egressDeny 의 toCIDR 에도 169.254.169.254/32 를 명시하세요.
참고
kubectl get netpol -n cca-shop -o yaml로 적용 결과를 다시 읽어 의도와 맞는지 확인하세요.- CiliumNetworkPolicy 의 포트는 문자열로 적는 것이 관례입니다.
port: "8080"형태입니다. - 흔한 실수 1: 기본 거부에
policyTypes를 한 방향만 적는 것. 반대 방향은 그대로 열려 있습니다. - 흔한 실수 2:
fromEndpoints: []와fromEndpoints: [{}]를 혼동하는 것. 앞은 아무것도 허용하지 않고, 뒤는 같은 네임스페이스 전체를 허용합니다. - 흔한 실수 3: toFQDNs 만 쓰고 DNS 규칙을 빠뜨리는 것. 프록시가 응답을 학습하지 못하면 그 이름은 영원히 매칭되지 않습니다.
단계 8개
- 애플리케이션과 모니터링 네임스페이스 만들기
- 프런트엔드와 백엔드 배포
- 양방향 기본 거부 만들기
- 파드 셀렉터로 한 경로만 열기
- 네임스페이스 셀렉터로 다른 네임스페이스 열기
- HTTP 메서드와 경로로 제한하기
- 도메인 이름으로 외부 API 허용하기
- 메타데이터 엔드포인트 봉인하기