본문 바로가기
서버인프라/kubernetes

쿠버네티스 networkpolicy

by techwold ted 2024. 1. 30.

쿠버네티스의 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

댓글