네트워크 정책 요약
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
책
https://www.yes24.com/Product/Goods/92426926
GitHub
https://github.com/bjpublic/core_kubernetes/tree/master/chapters/13
연설
GitHub
https://github.com/sysnet4admin/_Lecture_k8s_learning.kit/tree/main/ch8/8.6