기본적으로 클러스터 내의 모든 파드 간에는 서로 통신이 가능하다.
(만약 network policy가 없다면 web → db 통신도 가능)
그러나 보안을 위해 특정 파드 간에만 통신을 허용하고 싶을 경우, network policy를 추가하여 적용한다.
예) web → was → db 방향으로만 통신할 수 있도록 설정하는 것
Ingress : (내 입장에서) 들어오는 트래픽
Egress : (내 입장에서) 나가는 트래픽
다른 k8s 객체처럼 NetworkPolicy manifest file 생성한 후 create
namespace, label + selector 그리고 ip를 사용하여 네트워크 정책np과 파드를 연결시킨다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
spec:
podSelector: # 이 정책을 적용시킬 파드를 선택
matchLabels:
role: db
policyTypes: # 정책 적용되는 파드의 입장에서 in/out
- Ingress
ingress: # 들어오는 정책
- from:
- podSelector: # 들어오려는? 파드를 선택
matchLabels:
name: api-pod
namespaceSelector: # 네임스페이스 선택
matchLabels:
name: prod
- ipBlock: # 특정 아이피에 대해 접근 허용
cidr: 192.168.5.10/32
ports: # 열어놓는 포트
- protocol: TCP
port: 3306
위의 예시는 ingress 만 설정된 것임 그래서 egress 즉 나가는 트래픽은 어디로든 나갈 수 있음.
만약 DB파드가 백업 서버의 80포트로 백업 서비스를 호출하는 경우
DB파드 입장에서 나가는 정책을 만들어줘야 한다(목적지가 클러스터 외부에 존재하기 때문에)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
spec:
podSelector: # 이 정책을 적용시킬 파드를 선택
matchLabels:
role: db
policyTypes: # 정책 적용되는 파드의 입장에서 in/out
- Ingress
- Egress
ingress: # 들어오는 정책
- from:
- podSelector: # 들어오려는? 파드를 선택
matchLabels:
name: api-pod
ports: # 열어놓는 포트
- protocol: TCP
port: 3306
egress: # 나가는 정책
- to:
- ipBlock:
cidr: 192.168.5.10/32 # 나가는 목적지
ports: # 목적지 포트
- protocol: TCP
port: 80
selector list를 자세히 살펴봐야 한다.
1번의 설정은 2가지 조건이 모두 부합하는 and 조건으로 작동
2번 설정은 2가지 조건 중 하나만 일치해도 작동
1
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
2
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
...
특정 파드가 web, mysql 이라는 파드의 각각 다른 포트로 요청보낼 경우
...
egress:
- to: # 1번 web
- podSelector:
matchLabels: web
ports:
- protocol: TCP
port: 8080
- to: # 2번 mysql
- podSelector:
matchLabels: mysql
ports:
- protocol: TCP
port: 3306
네트워크 정책network policy을 지원하지 않는 네트워크 솔루션도 존재함
대표적으로 flannel
그 외 kube-router, calico, romana, weave-net 은 지원함