-
Kubernetes Network Policy 정리 및 예시K8S 2023. 11. 26. 23:51
CNI 구현체
Network Policy는 Container Network Interface(CNI)에 의해 구현된다. 만약 선택한 CNI가 Network Policy를 지원하지 않는다면, 리소스가 생성되더라도 실제로 적용되지 않는다.
파드 그룹 제어Network Policy를 사용하여 파드 그룹 간의 인그레스(Ingress)와 이그레스(Egress)를 제한할 수 있다. 이를 통해 파드 간의 네트워크 트래픽을 효과적으로 관리할 수 있다.
Selector 사용Namespace Selector나 Pod Selector를 사용하여 특정 네임스페이스 또는 파드 간의 네트워크 트래픽을 제어할 수 있다. 이는 네트워크 정책을 더욱 세밀하게 적용하는 데 도움을 준다.
IPBlock 제어특정 IP 범위(IPBlock)에 대한 트래픽을 제어하는 것도 가능하다. 이를 통해 특정 IP 주소 범위로부터의 트래픽을 관리할 수 있다.
다중 적용 가능하나의 파드에 여러 개의 Network Policy를 적용할 수 있다. 이를 통해 다양한 네트워크 제어 요구사항을 충족시킬 수 있다.
기본 정책특정 조건을 명시하지 않으면, 기본적으로 모든 트래픽을 차단하는 것이 기본 정책이다.
정책 적용 순서여러 개의 Network Policy가 적용되어 있을 때, 모든 정책이 적용된다. 정책을 만든 순서는 중요하지 않다.
Default Deny Policy기본적으로 모든 트래픽을 차단하는 Default Deny Network Policy를 만드는 것이 바람직하다. 이를 통해 네트워크 보안을 강화할 수 있다.
CoreDNS Egress 필수CoreDNS로 가는 Egress 정책을 만드는 것은 필수적이다. 이는 시스템의 안정성과 보안을 유지하는 데 중요하다.
Stateful 특성Network Policy는 Stateful한 성격을 가지고 있다. 이는 AWS Security Group의 접근 제어와 유사한 방식으로 작동한다.
사용 예시
1. app 네임스페이스에서 나가는 모든 traffic을 차단
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-out # 네트워크 정책의 이름은 'deny-out' namespace: app # 적용될 네임스페이스는 'app' spec: podSelector: {} # 모든 파드를 대상으로 하는 선택자 policyTypes: - Egress # 아웃바운드(밖으로 나가는) 트래픽에만 적용
2. app 네임스페이스의 모든 파드에 대해 포트 53을 사용하는 TCP 및 UDP 아웃바운드 트래픽만을 허용
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy # 네트워크 정책 리소스 종류 metadata: name: deny-out # 네트워크 정책의 이름 namespace: app # 적용될 네임스페이스 spec: podSelector: {} # 모든 파드를 대상으로 하는 선택자 policyTypes: - Egress # 아웃바운드(밖으로 나가는) 트래픽에 적용 egress: - ports: - port: 53 # 포트 53을 사용하는 TCP 트래픽 허용 protocol: TCP - port: 53 # 포트 53을 사용하는 UDP 트래픽 허용 protocol: UDP
3. Namespace간 트래픽 제어하기
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: np # 정책 이름: np namespace: space1 # 적용 네임스페이스: space1 spec: podSelector: {} # 모든 파드 대상 policyTypes: # 정책 유형 - Egress # 아웃바운드 트래픽 제어 egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: space2 # space2 네임스페이스로의 트래픽만 허용 ports: - protocol: TCP port: 53 # TCP 프로토콜의 53번 포트 허용 (DNS) - protocol: UDP port: 53 # UDP 프로토콜의 53번 포트 허용 (DNS) --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: np # 정책 이름: np namespace: space2 # 적용 네임스페이스: space2 spec: podSelector: {} # 모든 파드 대상 policyTypes: # 정책 유형 - Ingress # 인바운드 트래픽 제어 ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: space1 # space1 네임스페이스에서 오는 트래픽 허용
첫 번째 정책은 space1 네임스페이스의 모든 파드가 space2 네임스페이스로 TCP와 UDP 프로토콜을 사용하는 53번 포트(DNS)를 통한 아웃바운드 트래픽만을 허용한다.
두 번째 정책은 space2 네임스페이스의 모든 파드가 space1 네임스페이스에서 오는 모든 인바운드 트래픽을 허용한다.
4. 특정 pod가 메타데이터 서버로 접근 못하게끔하는 네트워크 정책
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: metadata-server # 정책 이름: metadata-server namespace: default # 적용 네임스페이스: default spec: podSelector: matchLabels: trust: nope # 레이블 'trust: nope'을 가진 파드 대상 policyTypes: - Egress # 아웃바운드 트래픽 제어 egress: - to: - ipBlock: cidr: 0.0.0.0/0 # 모든 IP 범위 대상 (인터넷 전체) except: - 1.1.1.1/32 # 1.1.1.1 주소를 제외
default 네임스페이스 내에서 'trust: nope' 레이블을 가진 모든 파드가 1.1.1.1 주소를 제외한 모든 대상으로의 아웃바운드 트래픽을 허용한다.
반응형'K8S' 카테고리의 다른 글
Kubernetes의 역할 및 바인딩 조합 이해 (0) 2023.12.29 Kube-bench 정리 및 사용 예시 (0) 2023.12.29 Nginx를 Istio Gateway로 expose하는 예제 (0) 2023.08.11 Netshoot: 컨테이너 환경에서의 네트워크 디버깅 도구 (0) 2023.08.11 Cert-manager 인증서 체인 만들기 (0) 2023.01.10