Kubernetes 쿠버네티스 - Minikube 환경에서 NetworkPolicy 적용하기

salgu·2023년 7월 23일
1

kubernetes

목록 보기
13/16
post-thumbnail

NetworkPolicy란

클러스터 내의 파드 간 통신을 제어하는 기능을 제공합니다.
이를 통해 파드 간의 트래픽 흐름을 세밀하게 관리하여 보안과 네트워크 정책을 적용할 수 있습니다.

어떤 파드가 다른 파드로 어떤 트래픽을 보낼 수 있는지를 정의할 수 있습니다. 기본적으로 Kubernetes 클러스터 내의 모든 파드는 서로 통신할 수 있지만, NetworkPolicy를 적용하면 이를 필터링할 수 있습니다.

또한 들어오는 트래픽을 통제하는것과 마찬가지로 나가는 트래픽도 제한할 수 있습니다.
-(Ingress)->(Pod)-(Egress)->

제한할 수 있는 규칙

Ingress

  • Pod Selector
    • 특정 레이블 셀렉터를 사용하여 트래픽의 송신자 또는 수신자 파드를 선택합니다.
  • Namespace Selector
    • 특정 네임스페이스에서 트래픽을 허용 또는 거부할 수 있습니다.
  • IP Block
    • CIDR IP 대역으로, 특정 IP 대역에서만 트래픽이 들어오도록 지정할 수 있습니다.
  • Port
    • 포트 기반으로 트래픽을 제어합니다.
  • Protocol
    • TCP, UDP 등의 트래픽 프로토콜을 지정합니다.

Egress

  • IP Block
    • CIDR IP 대역으로, 특정 IP 대역에서만 트래픽이 나가도록 지정할 수 있습니다.
  • Port
    • 포트 기반으로 트래픽을 제어합니다.
  • Protocol
    • TCP, UDP 등의 트래픽 프로토콜을 지정합니다.

적용해보기

환경

  1. auth Pod(Label: app=auth) -> (port: 18080)api service
    • 성공
  2. payment Pod(Label: app=payment) -> (port: 18080)api service
    • 실패

사전 준비

기존에 minikube start 명령어로 실행했었다면 NetworkPolicy가 적용되지 않습니다.

기본적인 minikube는 네트워크 플러그인이 NetworkPolicy를 지원하지 않아 Calico와 같은 네트워크 플러그인을 설치하여 적용해야 됩니다.

  1. $ minikube delete명령어로 기존의 사용중이던 minikube를 삭제해줍니다.
  2. $ minikube start --cni calico calico 네트워크 플러그인을 활성화 해주면서 minikube를 실행해줍니다.

삭제하지 않고 2를 실행했을때 정상동작 하지 않았고 삭제 후 다시 실행하니 정상작동 했습니다.

NetworkPolicy Manifest

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: api-allow-auth
  namespace: core
  labels:
    app: api
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - ports:
    - port: 18080
    from:
    - podSelector:
        matchLabels:
          app: auth

적용할 api Pod와 같은 namespace에서 동작해야 정상적으로 작동합니다.
api Pod의 18080 포트만 허용할 것이고 app=auth label을 가지고 있는 Pod만 통신을 허용하는 Manifest입니다.

결과

auth Pod -> api Pod 통신

해당 Sign-in API에는 API서버로 통신하는 로직이 있고 정상적으로 통신한 뒤 로그인이 성공하였습니다.

payment Pod -> api Pod 통신

해당 Purchase API에는 API서버로 통신하는 로직이 있고 정상적으로 NetworkPolicy가 적용되어 app=Payment Label을 가졌기 때문에 Time-out이 발생한걸 확인할 수 있습니다.

payment Pod 허용

Manifest

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: api-allow-auth
  namespace: core
  labels:
    app: api
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - ports:
    - port: 18080
    from:
    - podSelector:
        matchLabels:
          app: auth
    - podSelector:
        matchLabels:
          app: payment

spec.ingress.from.podSelector[1]부분에 app=payment를 추가 해주면 해당 Label을 가진 Pod의 통신을 허용하게 됩니다.

결과

해당 Purchase API가 정상적으로 api Pod와 통신을 하고 결제가 완료된것을 확인할 수 있습니다.

종종 NetworkPolicy를 적용하고 바로 적용이 안되는 경우가 있으니 1~2분 기다렸다가 시도하면 원하는 결과를 얻을 수 있습니다.





reference:

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기