Network Policy

네트워크 정책 요약

IP 주소 또는 포트 수준에서 Kubernetes 네트워크를 제어할 수 있는 네임스페이스 수준 리소스입니다.

IP 주소 또는 포트 수준에서 Kubernetes 네트워킹을 제어할 수 있습니다.

네트워크 정책이 적용되는 포드를 식별하는 방법으로 포드, 네임스페이스, IP 주소를 조합하여 생성할 수 있습니다.

특정 네트워크 정책이 적용된 포드는 해당 네트워크 정책을 제외한 모든 트래픽을 거부합니다.

  • 네트워크 정책이 없으면 네임스페이스의 모든 트래픽이 열려 있습니다(기본적으로 허용됨).
  • 네트워크 정책이 있으면 네트워크 정책의 영향을 받는 포드는 네트워크 정책을 제외한 다른 모든 트래픽을 차단합니다(기본적으로 거부).

  • 네트워크 정책은 포드에만 적용됩니다.

  • 기본적으로 Kubernetes 클러스터에 대한 네트워크 정책은 설정되지 않습니다.

네트워크 정책 매니페스트 파일 이해

정책 유형

  • 네트워크 정책 트래픽 유형을 지정합니다.

포드 셀렉터

  • 네트워크 정책이 적용되는 포드를 지정합니다.

출구:

  • 아웃바운드 수락 정책을 정의합니다.

  • egress 필드가 {}와 같이 비어 있으면 모두 허용됩니다.

침투:

  • 인바운드 트래픽에 대한 수락 정책을 정의합니다.

  • 수신 필드가 {}와 같이 비어 있으면 모두 허용됩니다.

포드 셀렉터

  • 특정 레이블이 있는 포드에서 인바운드/아웃바운드 통신 허용

네임스페이스 선택기

  • 특정 네임스페이스의 포드에서 인바운드/아웃바운드 통신 허용
  • 지정된 레이블이 있는 네임스페이스의 모든 포드에 적용됩니다.

아이블록

  • 특정 CIDR의 인바운드/아웃바운드 통신 허용

(힌트 ) ipBlock 식별자에 대해 알아두면 좋은 점

  • ipBlock 식별자는 주로 Kubernetes 클러스터 “외부”의 네트워크 트래픽을 제어하는 ​​데 사용됩니다.

    포드의 IP는 일시적이고 예측할 수 없기 때문입니다.

  • 수신 및 송신의 CIDR이 동일할 필요는 없습니다.

( 참조) 네임스페이스에 라벨을 지정하는 방법

# 코드
kubectl label namespace <namespace_name> <label_key>=<label_value>

# 예시
kubectl label namespace my-namespace env=production

# 특정 namespace의 레이블 보는 방법
kubectl describe namespace my-namespace

네트워크 정책 개요


매니페스트 파일에 대한 자세한 설명은 다음과 같습니다.


암호

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  policyTypes:
    - Ingress
    - Egress
  podSelector:
    matchLabels:
      role: db
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 6379
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5978

To 및 From 선택자의 동작

~에서(또는 ~까지) 하위 항목 “더 추가하시겠습니까? 아니면 하나?”조건에 따라 또는 및 및이 다릅니다.

그리고

~에서(또는 ~까지) 하위 항목 -를 추가하면 and가 됩니다.

다음은 및의 예입니다.

다음 조건을 모두 충족하는 포드는 통신이 허용됩니다.

  • project=dev 레이블이 있는 네임스페이스의 팟(Pod)
  • 기본 네임스페이스에서 user=alice 레이블이 지정된 포드
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: and
  namespace: default
spec:
  policyTypes:
    - Ingress
  podSelector:
    matchLabels:
      role: frontend
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: dev
          podSelector:
            matchLabels:
              user: alice
      ports:
        - protocol: TCP
          port: 6379

조건을 그래픽으로 표현하면 다음과 같다.


또는

~에서(또는 ~까지) 하위 항목 -s가 여러 개 추가되면 또는입니다.

다음은 또는의 예입니다.

다음 두 조건 중 하나를 충족하는 포드는 통신이 허용됩니다.

  • project=dev 레이블이 있는 네임스페이스의 팟(Pod)
  • 기본 네임스페이스에서 user=alice 레이블이 지정된 포드
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: or
  namespace: default
spec:
  policyTypes:
    - Ingress
  podSelector:
    matchLabels:
      role: frontend
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: dev
        - podSelector:
            matchLabels:
              user: alice
      ports:
        - protocol: TCP
          port: 6379

OR 조건을 그래픽으로 표현하면 다음과 같다.


포트 범위 지정

특정 포트 번호가 아닌 네트워크 정책의 전제 조건으로 포트 범위를 지정할 수 있습니다.

다음 “대상 포트가 32000에서 32768 사이인 경우 기본 네임스페이스의 role=db라는 모든 포드가 TCP를 통해 10.0.0.0/24 범위의 모든 IP와 통신하도록 허용”은 네트워크 정책의 예입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: multi-port-egress
  namespace: dev
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      role: db
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 32000
      endPort: 32768

이것을 그림으로 나타내면 다음과 같다.

(초록색을 보세요!
)


네트워크 정책 기본 정책

(기본값) 모든 인바운드 및 모든 아웃바운드 트래픽 허용

“podSelector: {}”는 모든 포드에 적용됨을 의미합니다.

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

모든 인바운드 및 모든 아웃바운드 트래픽 거부

policyType은 Ingress 및 Egress입니다.

허용된 조건을 나타내는 인그레스 및 이그레스 항목이 없기 때문에 인바운드 트래픽과 아웃바운드 트래픽 모두 허용되지 않습니다.

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

모든 인그레스 트래픽 거부

policyTypes는 인그레스입니다.

허용 조건을 지정하는 인바운드 항목이 없으므로 인바운드 트래픽이 허용되지 않음을 알 수 있습니다.

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

모든 아웃바운드 트래픽 거부

policyTypes는 이그레스입니다.

허용 조건을 지정하는 egress 항목이 없으므로 아웃바운드 트래픽이 허용되지 않음을 알 수 있습니다.

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

모든 인그레스 트래픽 허용

policyTypes는 인그레스입니다.

허용되는 조건을 지정하는 Ingress 요소가 {}이므로 특정 조건이 없음을 의미합니다.

(= 모든 조건 OK)

모든 Ingress 트래픽이 허용된 것을 볼 수 있습니다.

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

모든 아웃바운드 트래픽 허용

policyTypes는 이그레스입니다.

허용되는 조건을 지정하는 초기 항목 {}는 특정 조건이 없음을 나타내므로(= 모든 조건 OK)

모든 Ingress 트래픽이 허용된 것을 볼 수 있습니다.

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

참조 링크

공식 문서

https://kubernetes.io/en/docs/concepts/services-networking/network-policies/

공식 문서

https://kubernetes.io/en/docs/tasks/administer-cluster/declare-network-policy/

GitHub

https://github.com/ahmetb/kubernetes-network-policy-recipes

Kubernetes>

https://www.yes24.com/Product/Goods/92426926

GitHub Kubernetes>

https://github.com/bjpublic/core_kubernetes/tree/master/chapters/13

연설

https://www.inflearn.com/course/lecture?courseSlug=%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC% 9A%B0%EB%8A%94-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4&unitId=85699

GitHub

https://github.com/sysnet4admin/_Lecture_k8s_learning.kit/tree/main/ch8/8.6