0. Network Policy
네트워크 정책(network policy)는 쿠버 네티스클러스터 내부에서 파드 간에 통신할 경우 트래픽 룰을 규정하는 것이다. 네트워크 정책을 사용하지 않을 경우 클러스터 내부의 모든 파드는 서로 통신이 가능하다.
그러나 네트워크 정책을 사용할 수 있다면, 네임스페이스별로 트래픽을 전송하지 못하게 하거나 모든 파드간의 통신을 차단하고 특정 파드 간 통신만 허용하는 화이트리스트 방식을 사용할 수 있다.
모든 쿠버네티스 환경에서 네트워크 정책을 사용할 수 있는 것은 아니다!
온프레미스 환경 : Calico 등의 네트워크 정책 지원하는 네트워크 플러그인(CNI플러그인) 사용
GKE : 생성 시 명시적으로 활성화하려면 캘리코가 배포되어 네트워크 정책 사용
네트워크 정책을 지원하지 않는 경우: 리소스 자체를 등록하는 것은 가능(동작은 안함)
1) network security in Kubernetes
- 인그레스(ingress, 수신) : 인그레스는 인바운드 방향의 트래픽 룰을 설정
- 이그레스(egress, 송신) : 이그레스는 아웃 바운드 방향의 트래픽 룰을 설정
-> 설정 범위는 podSelector로 지정, 네트워크 정책은 네임스페이스별로 생성
-> 클러스터 내부 네트워크 제어는 podSelector, namespaceSelector 사용 추천
-> 클러스터 외부 네트워크 제어는 ipBlock 사용 추천
정책 종류 | 정책 설명 | 인그레스 룰의 경우 | 이그레스 룰의 경우 |
podSelector | 특정 파드 통신 제어하는 정책 | 특정 파드에서 들어오는 통신 허가 | 특정 파드로 나가는 통신 허가 |
namespaceSelector | 특정 네임 스페이스 상에 있는 파드에서의 통신 제어 정책 | 특정 네임스페이스상에 있는 파드에서 들어오는 통신 허가 | 특정 네임스페이스상에 있는 파드로 나가는 통신 허가 |
ipBlock | CIDR(classlessinter-domain routing) 에서 통신 제한 정책 | 특정 CIDR(IP주소)에서 들어오는 통신 허용 | 특정 CIDR(IP주소)로 나가는 통신 허용 |
piVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: sample-networkpolicy
namespace: default #네트워크 정책을 생성할 네임스페이스 지정
spec:
podSelector:
#설정할 대상 파드를 여기에 기입
#레이블 셀럭터이므로 여러 파드를 대상으로 할 수 있다.
matchLabels:
role: db
policyTypes:
- Ingress #인그레스 룰 생성할 경우 명시
- Egress #이그레스 룰 생성할 경우 명시
ingress:
- from:
# 인그레스 룰을 여기에 기입(이그레스 룰과 형식 동일)
- namespaceSelector:
matchLabels:
name: dev
ports:
# 이 인그레스 룰로 허가할 수신 포트 번호와 프로토콜 기입
- protocol: TCP
port: 3306
egress:
- to:
# 이그레스 룰 기입
ports:
# 이 이그레스 룰로 허가할 목적지 포트 번호화 프로토콜 기입
2) 화이트리스트 방식과 블랙리스트 방식
네트워크 정책 뿐만 아니라 다양한 접근 제어 할 때 화이트리스트/블랙리스트 방식을 사용한다.
이번 정책과 연관지어 설명하면,
- 화이트 리스트 방식: 미리 모든 트래픽 차단 후 특정 트래픽만 허가 (견고한 시스템에서 추천)
- 블랙 리스트 방식 : 미리 모든 트래픽을 허가 해놓고 특정 트래픽만 차단
#모든 트래픽을 차단하는 네트워크 정책
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
#모든 트래픽을 허가하는 네트워크 정책
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
spec:
podSelector: {}
egress:
- {}
클라우드에서는 기본적으로 인바운드는 전체를 차단하고 아웃바운드는 전체를 허용하는 것이 일반적이다.
아웃바운드까지 모두 차단하는 경우 목적지마다 이를 설정해야된다.
# 클라우드에 적합한 네트워크 정책 예제
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: cloud-networkpolicy
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Ingress
- Egress
3) Network Policy - 사례
사례별 테스트를 위해 준비
4가지 파드 생성 후 기본 네임스페이스에 2개의 파드를 nptest네임스페이스에 2개의 파드를 기동함.
각각의 파드에는 app: np1, app: np2, app: np3, app: np4 지정한다. (쿠버네티스 완벽 가이드 예제 소스)
---
apiVersion: v1
kind: Pod
metadata:
name: sample-pod-np1
namespace: default
labels:
app: np1
spec:
containers:
- name: nginx-container
image: amsy810/echo-nginx:v2.0
---
apiVersion: v1
kind: Pod
metadata:
name: sample-pod-np2
namespace: default
labels:
app: np2
spec:
containers:
- name: nginx-container
image: amsy810/echo-nginx:v2.0
---
apiVersion: v1
kind: Namespace
metadata:
name: nptest
---
apiVersion: v1
kind: Pod
metadata:
name: sample-pod-np3
namespace: nptest
labels:
app: np3
spec:
containers:
- name: nginx-container
image: amsy810/echo-nginx:v2.0
---
apiVersion: v1
kind: Pod
metadata:
name: sample-pod-np4
namespace: nptest
labels:
app: np4
spec:
containers:
- name: nginx-container
image: amsy810/echo-nginx:v2.0
1. 생성한 파드의 ip주소 확인
# 네트워크 정책 검증을 위해 생성한 파드 IP주소 확인
$ kubectl -n default get pods -o wide
$ kubectl -n nptest get pods -o wide
2. 나중에 사용할 기본 네임스페이스에 레이블 지정
# 기본 네임스페이스에 ns=default 레이블 지정
$ kubectl label namespace default ns=default
3. cloud-networkpolicy.ymal 적용한 초기 상태 확인해보면 인바운드는 완전히 차단되고 아웃바운드는 개방된 상태가 된다.
이때 각 파드에 타임아웃을 3초로 설정한 wget 명령어를 실행하면 통신이 되지 않음을 확인할 수 있다.
#모든 네임스페이스에 인바운드 통신을 거부하는 네트워크 정책 생성
$ kubectl apply -f cloud-networkpolicy.yaml
$ kubectl apply -n -f cloud-networkpolicy.yaml
#네임스페이스 내부의 통신 차단
$ kubectl exec -it sample-pod-np1 -- curl --connect-timeout 3 http://10.0.3.64
#네임스페이스 외부로의 통신 차단
$ kubectl exec -it sample-pod-np1 -- curl --connect-timeout 3 http://10.0.4.57
$ kubectl exec -it sample-pod-np1 -- curl --connect-timeout 3 http://10.0.3.65
특정 파드에서만 접근 허가
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: api-pod
ports:
- protocol: TCP
port: 3306
특정 네임스페이스의 특정 파드만 접근 허가
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: api-pod
namespaceSelector:
matchLabels:
name: dev
ports:
- protocol: TCP
port: 3306
특정 네임스페이스의 모든 파드 접근 허가
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: dev
ports:
- protocol: TCP
port: 3306
클러스터 외부의 특정 서버로부터 접근 허가
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 192.168.1.100/32
ports:
- protocol: TCP
port: 3306
DB에서 특정 파드로 접근 허가
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
role: etc-pod
ports:
- protocol: TCP
port: 8080
DB에서 클러스터 외부의 특정 서버로부터 접근 허가
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 192.168.1.100/32
ports:
- protocol: TCP
port: 8080
'STUDY > Data Engineering' 카테고리의 다른 글
[kodekloud] 01 Core Concepts : Service 풀이 (0) | 2023.01.21 |
---|---|
[kodekloud] 01 Core Concepts : Namespaces 풀이 (0) | 2023.01.21 |
13. CKA udemy 강의 정리 - Section 7 [Security] (0) | 2023.01.18 |
12. CKA udemy 강의 정리 - Section 6 [Cluster Maintenance] (0) | 2023.01.14 |
11. CKA udemy 강의 정리 - Section 5 [Application Lifecycle Management] (0) | 2023.01.12 |