ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 주소를 제외한 모든 대상으로의 아웃바운드 트래픽을 허용한다.

     

     

    반응형

    댓글

Designed by Tistory.