NetworkPolicy 기본 설정

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 80

정책의 주요 내용

  • podSelector: 이 네트워크 정책이 적용될 파드를 지정합니다. 이 설정에서는 role: db라는 라벨이 붙은 모든 파드에 정책을 적용합니다. 즉, 이 정책은 데이터베이스 역할을 하는 파드를 보호하는 역할을 합니다.
  • policyTypes: 정책이 적용될 트래픽의 방향을 지정합니다.
    • Ingress: 외부에서 파드로 들어오는 트래픽에 대한 규칙을 정의합니다.
    • Egress: 파드에서 외부로 나가는 트래픽에 대한 규칙을 정의합니다. 이 설정에서는 인그레스(Ingress)와 이그레스(Egress) 규칙을 모두 정의하고 있습니다. 하지만 YAML 파일에 이그레스(Egress) 규칙이 명시되어 있지 않으므로, 이 정책이 적용되는 파드에서는 외부로의 모든 트래픽이 차단됩니다.
  • ingress: role: db 파드로 들어오는 트래픽에 대한 허용 규칙을 정의합니다.
    • from: 어떤 소스로부터의 트래픽을 허용할지 지정합니다. 여기서는 두 가지 소스를 허용하고 있습니다.
      • namespaceSelector: project: myproject 라벨이 붙은 모든 네임스페이스의 파드로부터의 접근을 허용합니다.
      • podSelector: 현재 네임스페이스(default) 내에서 role: frontend 라벨이 붙은 모든 파드로부터의 접근을 허용합니다. 즉, 이 데이터베이스 파드에는 myproject라는 프로젝트 라벨이 붙은 네임스페이스의 파드와, default 네임스페이스에 있는 frontend 파드만 접근할 수 있습니다.
    • ports: 허용되는 포트와 프로토콜을 지정합니다. 여기서는 TCP 프로토콜을 사용하는 80번 포트로 들어오는 트래픽만 허용하고 있습니다.
      • 참고: 보통 데이터베이스는 3306(MySQL), 5432(PostgreSQL) 등 다른 포트를 사용

 

 

[샘플1] 모든 인그레스 트래픽 차단 정책

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

정책의 주요 내용

    • podSelector: {}: 이 부분이 가장 중요합니다. 비어 있는 {}는 '모든 파드'를 의미합니다. 즉, 이 정책이 적용되는 네임스페이스의 모든 파드에 대해 규칙을 적용하겠다는 뜻입니다. 만약 네임스페이스가 명시되지 않았다면, 이 정책을 배포하는 네임스페이스의 모든 파드에 적용됩니다.
    • policyTypes: 정책이 적용될 트래픽의 방향을 지정합니다.
      • Ingress: 외부에서 파드로 들어오는 트래픽에 대한 규칙을 정의합니다.
      • 이 설정은 Ingress만 명시하고 있으며, 인그레스 규칙을 구체적으로 정의하는 ingress: 섹션이 없습니다.

요약

 

  • 들어오는 트래픽(Ingress):
    • ingress 규칙이 명시되어 있지 않습니다.
    • policyTypes에 Ingress가 포함되어 있고 ingress 규칙이 없으면, 이는 **'모든 인그레스 트래픽을 거부한다'**는 의미로 해석됩니다.
    • 따라서 이 정책이 적용되는 네임스페이스의 모든 파드는 외부로부터의 모든 네트워크 접근이 차단됩니다.
  • 나가는 트래픽(Egress):
    • Egress 정책 타입이 명시되지 않았으므로, 나가는 트래픽에는 아무런 제약이 없습니다. 모든 파드는 외부로 자유롭게 통신할 수 있습니다.

 

 

[샘플2] 모든 인그레스 트래픽 허용 정책

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

정책의 주요 내용

  • podSelector: {}: 이 정책이 적용될 파드를 지정합니다. 비어 있는 {}는 '모든 파드'를 의미합니다. 이 정책이 배포되는 네임스페이스에 있는 모든 파드에 규칙이 적용됩니다.
  • ingress: - {}: 이 부분이 핵심입니다. 비어 있는 ingress 규칙은 **모든 소스(from)**와 **모든 포트(ports)**에 대해 인그레스 트래픽을 허용하겠다는 의미입니다.
  • policyTypes: - Ingress: 이 정책이 **들어오는 트래픽(Ingress)**에 대한 규칙만 정의하고 있음을 나타냅니다.

 

요약

  1. 들어오는 트래픽(Ingress):
    • ingress: - {}는 모든 외부 소스로부터 모든 포트로 들어오는 트래픽을 허용합니다.
    • 이 정책은 마치 방화벽의 모든 문을 활짝 열어주는 것과 같습니다.
  2. 나가는 트래픽(Egress):
    • Egress 정책 타입이 명시되지 않았습니다.
    • 따라서 파드에서 외부로 나가는 트래픽에는 아무런 제약이 없습니다. 모든 파드는 외부로 자유롭게 통신할 수 있습니다.

 

 

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

 

Network Policies

If you want to control traffic flow at the IP address or port level (OSI layer 3 or 4), NetworkPolicies allow you to specify rules for traffic flow within your cluster, and also between Pods and the outside world. Your cluster must use a network plugin tha

kubernetes.io

 

+ Recent posts