클러스터 내의 파드 간 통신을 제어하는 기능을 제공합니다.
이를 통해 파드 간의 트래픽 흐름을 세밀하게 관리하여 보안과 네트워크 정책을 적용할 수 있습니다.
어떤 파드가 다른 파드로 어떤 트래픽을 보낼 수 있는지를 정의할 수 있습니다. 기본적으로 Kubernetes 클러스터 내의 모든 파드는 서로 통신할 수 있지만, NetworkPolicy를 적용하면 이를 필터링할 수 있습니다.
또한 들어오는 트래픽을 통제하는것과 마찬가지로 나가는 트래픽도 제한할 수 있습니다.
-(Ingress)->(Pod)-(Egress)->
기존에 minikube start
명령어로 실행했었다면 NetworkPolicy
가 적용되지 않습니다.
기본적인 minikube는 네트워크 플러그인이 NetworkPolicy
를 지원하지 않아 Calico와 같은 네트워크 플러그인을 설치하여 적용해야 됩니다.
$ minikube delete
명령어로 기존의 사용중이던 minikube를 삭제해줍니다.$ minikube start --cni calico
calico 네트워크 플러그인을 활성화 해주면서 minikube를 실행해줍니다.삭제하지 않고 2를 실행했을때 정상동작 하지 않았고 삭제 후 다시 실행하니 정상작동 했습니다.
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입니다.
해당 Sign-in API에는 API서버로 통신하는 로직이 있고 정상적으로 통신한 뒤 로그인이 성공하였습니다.
해당 Purchase API에는 API서버로 통신하는 로직이 있고 정상적으로 NetworkPolicy
가 적용되어 app=Payment
Label을 가졌기 때문에 Time-out이 발생한걸 확인할 수 있습니다.
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:
좋은 정보 얻어갑니다, 감사합니다.