https://kubernetes.io/docs/concepts/services-networking/network-policies/
NetworkPolicy 란?
NetworkPolicy는 Kubernetes에서 네트워크 트래픽을 제어하기 위한 리소스입니다. 네트워크 정책(NetworkPolicy)은 클러스터 내에서 포드 간의 통신과 외부로부터의 트래픽 흐름을 제어할 수 있도록 정의한 규칙을 말합니다. 이를 통해 보안 및 네트워크 트래픽 제어를 세밀하게 설정할 수 있습니다.
주요 개념
1. 목적:
• 기본적으로 Kubernetes 클러스터 내의 모든 포드 간 통신은 허용됩니다. NetworkPolicy를 사용하면 특정 포드 간 통신을 허용하거나 차단하는 규칙을 만들 수 있습니다.
• Ingress(들어오는 트래픽)와 Egress(나가는 트래픽)를 각각 제어할 수 있습니다.
2. 작동 방식:
• NetworkPolicy는 레이블을 기반으로 어떤 포드들이 네트워크 정책의 대상이 될지를 결정합니다.
• 정책을 정의할 때, 어떤 포드가 외부 트래픽을 허용할지, 어떤 포드 간의 통신을 허용할지 등 세부적인 규칙을 지정할 수 있습니다.
3. 기본 네트워크 정책:
• NetworkPolicy가 설정되지 않으면 Kubernetes는 포드 간의 모든 트래픽(Ingress와 Egress)을 기본적으로 허용합니다.
• 하지만 NetworkPolicy가 적용되면, 그 정책에 명시된 트래픽만 허용되고 나머지 트래픽은 차단됩니다.
NetworkPolicy의 주요 필드
1. podSelector:
• 정책이 적용될 포드를 선택합니다. 이 필드는 해당 포드를 식별하기 위해 레이블을 사용하며, matchLabels 또는 matchExpressions를 사용하여 레이블을 기반으로 포드를 선택할 수 있습니다.
2. policyTypes:
• Ingress (들어오는 트래픽)와 Egress (나가는 트래픽)를 지정합니다.
• Ingress: 포드로 들어오는 트래픽을 제어합니다.
• Egress: 포드에서 나가는 트래픽을 제어합니다.
3. ingress와 egress 규칙:
• 각각 포드로 들어오거나 나가는 트래픽에 대해 구체적인 규칙을 설정합니다. 예를 들어, 특정 IP 범위, 네임스페이스, 포트 등을 지정할 수 있습니다.
예시: NetworkPolicy 설정
1. Ingress 규칙:
특정 포드에 대해 들어오는 트래픽만 허용하는 정책입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-http
namespace: prod
spec:
podSelector:
matchLabels:
role: web
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 80
위의 예시는 prod 네임스페이스에 있는 role=web 레이블을 가진 포드에 대해, 10.0.0.0/24 네트워크에서 오는 TCP 80번 포트의 트래픽을 허용합니다.
2. Egress 규칙:
특정 포드에서 나가는 트래픽만 허용하는 정책입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-connection
namespace: prod
spec:
podSelector:
matchLabels:
role: backend
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- protocol: TCP
port: 3306
이 정책은 prod 네임스페이스에 있는 role=backend 레이블을 가진 포드가 10.0.0.0/24 네트워크로 나가는 TCP 3306번 포트 연결을 허용합니다.
egress 는 ingress 와 달리 ipBlock 조건만 사용할 수 있습니다.
NetworkPolicy의 장점
1. 보안 강화:
• 클러스터 내의 포드 간 통신을 제한하여 보안을 강화할 수 있습니다. 기본적으로 모든 포드가 서로 통신할 수 있지만, NetworkPolicy를 적용함으로써 의도하지 않은 통신을 막고 필요한 경우에만 통신을 허용할 수 있습니다.
2. 트래픽 제어:
• 특정 포드가 어떤 IP 대역이나 네임스페이스와 통신할 수 있는지를 세밀하게 제어할 수 있어, 네트워크 트래픽을 효과적으로 관리할 수 있습니다.
3. 세분화된 규칙:
• 여러 규칙을 정의하여 다양한 네트워크 상황에 맞춰 네트워크 정책을 유연하게 구성할 수 있습니다.
결론
NetworkPolicy는 Kubernetes 클러스터 내에서 포드 간 및 외부로부터의 트래픽을 제어하고, 이를 통해 보안을 강화하는 중요한 리소스입니다. 레이블 기반으로 포드를 선택하고, Ingress와 Egress 트래픽을 각각 정의함으로써 원하는 네트워크 규칙을 설정할 수 있습니다.
추가
만약 NetworkPolicy 를 네임스페이스 단위로 지정하려면 어떻게 해야 할까?
특정 네임스페이스의 모든 포드에 대해 정책을 적용하고 싶다면, podSelector를 빈 값으로 설정할 수 있습니다. 이 방법은 해당 네임스페이스 내의 모든 포드에 대해 적용되는 정책을 정의하는 방식입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
namespace: prod
spec:
podSelector: {} # 모든 포드를 선택
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 10.0.0.0/8
위의 예시는 prod 네임스페이스에 있는 모든 포드에 대해 10.0.0.0/8 범위의 IP에서 오는 트래픽을 허용하는 정책입니다.
또한 기본적인 트래픽을 차단하고 싶다면?
네임스페이스에 대해 기본적으로 모든 트래픽을 차단하는 정책을 설정하고, 필요한 경우 특정 트래픽만 허용하는 방식으로 설정할 수 있습니다.
1. 모든 네임스페이스의 모든 트래픽을 기본적으로 차단하는 default-deny NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: prod
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
2. 그런 다음 필요한 트래픽을 허용하는 예외 규칙을 추가할 수 있습니다. 예를 들어, 특정 IP나 포트를 기준으로 트래픽을 허용할 수 있습니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-some
namespace: prod
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 10.0.0.0/8
'IT 기술 > k8s' 카테고리의 다른 글
[cka] CKA 취득 후기 - 늦은 정리... (0) | 2024.10.08 |
---|---|
[cka] killer.sh 문제풀이 - (6-14) (1) | 2024.09.15 |
[cka] killer.sh 문제풀이 - (1-5) (2) | 2024.09.14 |
[cka] TroubleShooting - Worker Node Failure (0) | 2024.08.25 |
[cka] TroubleShooting - Control Plane Failure (0) | 2024.08.25 |
댓글