LabHub

CKA — 쿠버네티스 관리자 · 서비스와 네트워킹 · 실습

네트워크폴리시로 통로 좁히기

LabHub 에서 이어서 보기

목표

NetworkPolicy 를 기본 거부에서 시작해 여섯 가지 형태로 좁혀 가며, 특히 from 항목의 AND/OR 구조를 손으로 구분합니다.

왜 중요한가

먼저 분명히 해 둡니다. 이 실습 환경에는 정책을 집행할 CNI 데이터플레인이 없습니다. 그래서 실제로 트래픽이 막히는지는 확인할 수 없고, 채점은 오브젝트 스펙만 봅니다. 이 제약은 오히려 시험과 닮았습니다. CKA 에서도 대부분 매니페스트가 정확한지를 봅니다.

NetworkPolicy 의 사고 방식은 방화벽과 다릅니다. 정책이 하나라도 어떤 파드를 고르는 순간, 그 파드의 해당 방향(Ingress/Egress) 트래픽은 기본 거부로 바뀌고 정책들이 허용한 것만 통과합니다. 정책은 서로 더해질 뿐 거부 규칙은 존재하지 않습니다. 그래서 "기본 거부 정책 하나 + 필요한 만큼의 허용 정책" 이 표준 패턴입니다.

egress 를 막을 때 DNS 를 함께 막아 버리는 사고도 흔합니다. 파드가 서비스 이름을 못 풀면 증상이 네트워크 차단이 아니라 애플리케이션 타임아웃으로 나타나 진단이 오래 걸립니다.

단계

1. 네임스페이스 cka-netpol (라벨 tier=app)과 cka-netpol-client (라벨 tier=client)를 만든다. cka-netpol 에 Deployment web (레플리카 2, 이미지 nginx:1.27, 파드 라벨 app=web)을 만든다.
2. cka-netpol 에 NetworkPolicy default-deny-ingress 를 만든다. podSelector 는 빈 오브젝트, policyTypes 는 [Ingress], ingress 규칙은 없다.
3. NetworkPolicy allow-frontend 를 만든다. podSelector app=web, ingress 의 from 은 podSelector app=frontend 하나만, 포트는 TCP 80.
4. NetworkPolicy allow-client-ns 를 만든다. podSelector app=web, ingress 의 from 은 namespaceSelector tier=client 하나만 (podSelector 를 함께 넣지 않는다).
5. NetworkPolicy egress-dns-only 를 만든다. podSelector app=web, policyTypes 는 [Egress], egress 의 to 는 namespaceSelector kubernetes.io/metadata.name=kube-system, 포트는 UDP 53 과 TCP 53 두 개.
6. NetworkPolicy allow-cidr 을 만든다. podSelector app=web, ingress 의 from 은 ipBlock cidr 10.0.0.0/16 이고 except 에 10.0.5.0/24.
7. NetworkPolicy web-final 을 만든다. podSelector app=web, policyTypes 는 [Ingress, Egress]. ingress 의 from 은 항목 하나 안에 namespaceSelector tier=client 와 podSelector app=frontend 를 함께 두고 포트는 TCP 8080. egress 의 to 는 ipBlock cidr 0.0.0.0/0 에 except 169.254.169.254/32, 포트는 TCP 443.

참고

단계 7개

  1. 대상과 출발지 준비하기
  2. 기본 거부 정책
  3. 같은 네임스페이스의 파드만 허용
  4. 다른 네임스페이스 전체 허용
  5. 나가는 트래픽을 DNS 만 남기고 막기
  6. CIDR 로 허용하고 일부 대역만 빼기
  7. 종합: AND 조건과 메타데이터 대역 차단