쿠버네티스의 NetworkPolicy에 대해 알아 보려 합니다.
저 역시도 쿠버네티스는 공부중 입니다. 현재 진행형이고 해야 할것이 너무 많습니다. 그중 설계를 하려 하면 보안에 관한 사항들이 많은 생각을 하게 만듭니다. 아무리 생각해도 오히려 쿠버네티스로 하면서 보안적 관점에서는 더 어려운거 같습니다.
아래와 같이 구성 되어 있다고 해봅시다.
각 노드와 파드를 생각해 보겠습니다. 각 노드는 물리적으로 서로 다른 서버일 것입니다. 물리적 보안을 생각 한다면 Node_1번은 Web서버의 영역 Node_2번은 WAS서버의 영역으로 나눠질 수 있습니다. 그리고 Node_3번의 경우 MGMT영역 이라 할 수 있겠네요
어찌 생각해 보면 Cloud Server로 운영할때 보다 더 신경이 쓰이는 건 사실입니다.
pod간에 통신 제어가 필요합니다. 접근을 막아야 할 영역이 분명하니까요.. 거기에 구성을 어떻게 할 것인가에 대한 방법을 정의해보려 합니다. 기존에는 IP로 출발지와 목적지를 구분하여 제어 했습니다. 쿠버네티스로 오면서 라벨을 통해 접근을 통제해 볼 것입니다.
AND와 OR조건을 구성 할 수 있습니다.
아래와 같이 nginx를 구성 한 후 nginx의 네임스페이스로 다음과 같이 구성합니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-traffic-from-ubuntu-custom
namespace: nginx
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default
podSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
위와 같이 networkpolicy를 생성합니다. namespace label 에서 name=default 로 설정하고, pod는 app=nginx를 가진 pod만 가능 한 것입니다. 이런식으로 pod와 pod간 통신을 제어 할 수 있습니다. 다른 네임스페이스를 가지고 있거나, pod있다면 접속이 불가합니다.
위와 같이 default namespace는 name=default라는 label를 달고 있어야 합니다. 그리고, 해당 네임스페이스에 있는 pod는 app=nginx라는 라벨이 있어야 통신이 가능합니다. 하지만, 몇가지 경우의 수가 있습니다.
이런 상황을 피해야합니다. 저 policy에서 차단 되는 것이죠, 그럼 하나 더 추가 해야 합니다. 여기서 pod label의 조건은 OR여야 합니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-traffic-from-ubuntu-custom
namespace: nginx
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default
podSelector:
matchLabels:
app: nginx
- namespaceSelector:
matchLabels:
name: default
podSelector:
matchLabels:
app: ubuntu
이렇게 하면. app=ubuntu 라벨을 가진 pod와 app=nginx를 가진 파드 모두 통신 가능합니다.
헌데 여기서 조금 바꾸겠습니다. AND조건으로..
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-traffic-from-ubuntu-custom
namespace: nginx
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default
podSelector:
matchExpressions:
- key: app
operator: In
values:
- ubuntu
- key: app
operator: In
values:
- nginx
이러게 하면, 접근하려는 pod는 label을 app=nginx, app=ubuntu를 가지고 있어야 합니다.
조금 복잡합니다. 항상 경우의 수가 있는 것들은 복잡하지만 활용도가 높습니다. 잘 확인하고 여러번 테스트해서 익숙해 지시면 분명 쉬어 질것 입니다. 결국은 암기는 필요합니다.
'서버인프라 > kubernetes' 카테고리의 다른 글
[Private Container Registry] Harbor (50) | 2024.04.15 |
---|---|
K8S 기본 볼륨을 nfs로 사용해볼까 (57) | 2024.02.01 |
service와 endpoint (65) | 2024.01.25 |
K8S 리셋 (30) | 2023.12.24 |
[제 10강] Labels 사용 (0) | 2023.01.12 |
댓글