콘텐츠로 이동

2025 06 27

2025-06-27

k8s networkPolicy

참고: https://kubernetes.io/ko/docs/concepts/services-networking/network-policies/

  • 개요
    • NetworkPolicy를 통해 Pod가 네트워크 상 "엔티티"와 통신할 수 있도록 허용하는 방법 지정
    • NetworkPolicy 한쪽-양쪽 종단인 파드인 연결에만 적용됨
    • 파드가 통신할 수 있는 엔티티는 다음 3가지 조합을 통해 식별
      1. 허용되는 다른 파드
      2. 허용되는 네임스페이스
      3. IP 블록 (CIDR 범위 기반)
    • selector를 사용하여 pod-/namespace- 기반의 네트워크 폴리시 정의 가능
  • Pod 격리의 2가지 종류
    1. Egress에 대한 격리/비격리
      • 기본적으로 Pod는 Egress에 대해 비격리 되어 있음 (모든 아웃바운드 연결이 허용)
      • Pod가 Egress에 의해 격리되면, Pod에서 나가는 연결중에서 Pod Egress에 적용된 NetworkPolicy의 egress 리스트에 허용된 연결만 허용
    2. Ingress에 대한 격리/비격리
      • 기본적으로 Pod는 Ingress에 대해 비격리 되어 있음 (모든 인바운드 연결이 허용)
      • Pod가 Ingress에 의해 격리되면, Pod에 들어오는 연결 중에서 Pod Ingress에 적용된 NetworkPolicy의 ingress 리스트에 허용된 연결만 허용
  • 예시
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      namespace: default
    spec:
      podSelector:  # 적용되는 pod 그룹 선택
        matchLabels:
          role: db
      policyTypes:
    
        - Ingress
        - Egress
      ingress:
    
        - from: # Ingress를 허용할 대상은 다음과 같음
            - ipBlock:  # 하위 IP 주소들
                cidr: 172.17.0.0/16
                except:
    
                  - 172.17.1.0./24
            - namespaceSelector:  # namespace와 "project=myproject"를 레이블로 가지는 파드
                matchLabels:
                  project: myproject
    
            - podSelector:  # "role=frontend" 레이블의 "default" 네임스페이스 파드
                matchLabels:
                  role: frontend
          ports:
    
            - protocol: TCP
              port: 6379
      egress:
    
        - to: # Egress를 허용할 대상은 다음과 같음
            - ipBlock:
                cidr: 10.0.0.0/24
          ports:
    
            - protocol: TCP
              port: 5978
    
  • 기본 정책

    1. 기본적으로 모든 인그레스 트래픽 거부

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: default-deny-ingress
      spec:
        podSelector: {}
        policyTypes:
      
          - Ingress
      

    2. 모든 인그레스 트래픽 허용

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: allow-all-ingress
      spec:
        podSelector: {}
        ingress:
      
          - {}
        policyTypes:
      
          - Ingress
      

    3. 기본적으로 모든 이그레스 트래픽 거부

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: default-deny-egress
      spec:
        podSelector: {}
        policyTypes:
      
          - Egress
      

    4. 모든 이그레스 트래픽 허용

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: default-deny-egress
      spec:
        podSelector: {}
        egress:
      
          - {}
        policyTypes:
      
          - Egress
      

    5. 기본적으로 모든 인그레스/모든 이그레스 트래픽 거부

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: default-deny-all
      spec:
        podSelector: {}
        policyTypes:
      
        - Ingress
        - Egress
      

k8s pod CIDR

  • 개요
    • Pod들이 사용할 IP 주소 범위
    • 각 Pod에게 고유한 IP를 부여해야하고, Node 별로 생성되기에 충돌없이 관리하기 위해 Node 별로 IP 대역 나눔
  • 클러스터 전체 Pod CIDR
    • 클러스터 전체에서 지정한 IP 범위
      • ex) kubeadm init 시 설정: kubeadm init --pod-network-cidr=10.244.0.0/16
  • 각 Node의 Pod CIDR
    • 노드별로 나눠진 하위 범위
    • CNI(Flannel)이 각 노드에 자동 분배
      • Node A: 10.244.1.0/24
      • Node B: 10.244.2.0/24
      • Node C: 10.244.3.0/24

k8s ServiceAccounts

k8s priorityclass