Kubernetes의 네트워크 정책(NetworkPolicy)은 클러스터 내 파드와 파드
또는 파드와 외부 리소스
간의 네트워크 트래픽을 허용 또는 제한하는 정책이다.
이러한 정책은 크게 인그레스와 이그레스로 나뉘게 되는데, 쉽게 말해서 들어오는 트래픽은 🔜인그레스
로 검증하고, 나가는 트래픽은 🔙이그레스
로 검증한다.
ME 파드의 입장에서 다른 파드로 요청을 보낼 때(나갈 때) "대상 파드가 이그레스 규칙에 허용되는가" 를 확인한다.
ME 파드로 요청이 들어올 때 "요청을 보낸 파드가 인그레스 규칙에 허용 되는가"를 확인한다.
레이블 선택자를 사용하여 대상 파드를 지정하고 레이블
, 파드 IP
, 네임스페이스
를 통해서 규칙을 정의할 수 있다.
그럼 3가지를 모두 살펴보도록 하자.✨
role: sensitive
레이블을 가진 파드에 대해서 모든 네트워크 트래픽을 차단해 보자.
위 코드와 같이 인그레스와 이그레스를 선언만 해놓고, 아무런 규칙을 정의하지 않게되면 기본적으로 모든 행위가 차단된다. (최소 권한 원칙)
role: internal
레이블 가진 파드에 대해서 app: chk-info
를 가진 파드들 만이 통신이 가능하도록 한다.
role: internal
을 가지고 네트워크 정책이 적용된 파드apiVersion: apps/v1
kind: Deployment
metadata:
labels:
role: internal
name: deploy-podselector-int-vinca
spec:
replicas: 1
selector:
matchLabels:
role: internal
template:
metadata:
labels:
role: internal
spec:
containers:
- image: sysnet4admin/chk-info
name: chk-info
app: chk-info
를 가진 파드apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: chk-info
name: deploy-podselector-int-only
spec:
replicas: 3
selector:
matchLabels:
app: chk-info
template:
metadata:
labels:
app: chk-info
spec:
containers:
- image: sysnet4admin/chk-info
name: chk-info
PodSelector: {}
를 통해서 전체 파드에 대해서 인그레스와 이그레스를 적용한다.
이 때 ipBlock
을 통해서 허용되는 범위를 cidr
를 통해서 지정하면, 해당 ip 범위 내에 들어가는 파드만을 인그레스와 이그레스를 허용해 준다.
⚠ 이번에는 네트워크 정책을 dev2
네임스페이스에 지정하였다.
PodSelector: {}
를 통해서 dev2
네임스페이스의 전체 파드에 대해서 인그레스와 이그레스를 적용한다.
이를 통해 dev2
네임스페이스를 가진 파드만이 dev2
네임스페이스의 다른 파드로 접근할 수 있다.
이그레스(자신이 다른 파드로 나가는 것)은 모두 허용되어 있다.
dev2 네임스페이스에 다음과 같이 파드를 배포해주자.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: chk-info
name: deploy-namespaceselector-dev2
namespace: dev2
spec:
replicas: 3
selector:
matchLabels:
app: chk-info
template:
metadata:
labels:
app: chk-info
spec:
containers:
- image: sysnet4admin/chk-info
name: chk-info
dev2
네임스페이스에 속한 파드만이 dev2
네임스페이스의 다른 파드에 접근할 수 있다.
네트워크 정책 내 dev2 네임스페이스의 이그레스에 대한 권한은 전부 열려있으므로 다른 네임스페이스에 접근할 수 있다.