쿠버네티스 네트워크 정책은 클러스터 내 포드 간 트래픽을 세밀하게 제어할 수 있게 해줍니다. 이번 글에서는 네트워크 정책을 사용하여 데이터베이스 포드를 보호하는 방법을 단계별로 살펴보겠습니다. 우리의 목표는 API 파드를 제외한 모든 파드가 데이터베이스 파드에 접근하지 못하도록 하고, 오직 3306 포트에서만 접근을 허용하는 것입니다.
기본적으로, 쿠버네티스는 모든 파드에서 모든 목적지로의 트래픽을 허용합니다. 먼저, 데이터베이스 파드로의 모든 트래픽을 차단해보겠습니다.
먼저, 네트워크 정책을 생성하고 이를 데이터베이스 포드와 연관시켜야 합니다. 이를 위해 라벨과 선택자를 사용합니다. 아래는 DB 정책 네트워크 정책을 데이터베이스 포드에 연관시키는 예제입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: your-namespace
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress: []
egress: []
이 정책은 현재 데이터베이스 포드에 대해 모든 인그레스와 이그레스 트래픽을 차단합니다.
이제 API 포드가 데이터베이스 포드에 접근할 수 있도록 인그레스 규칙을 추가합니다. 다음은 API 포드에서 오는 트래픽을 허용하는 인그레스 규칙 예제입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: your-namespace
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 3306
egress: []
이 규칙은 role: api
라벨이 있는 포드가 데이터베이스 포드의 3306 포트에 접근할 수 있도록 허용합니다.
클러스터 내에 동일한 라벨을 가진 여러 API 포드가 있지만, 다른 네임스페이스에 있는 경우도 고려해봅시다. 예를 들어, 개발, 스테이징 및 프로덕션 환경에 각각 동일한 라벨을 가진 API 포드가 있을 수 있습니다.
네임스페이스 선택자를 사용하여 특정 네임스페이스에서만 트래픽을 허용할 수 있습니다. 아래는 프로덕션 네임스페이스의 API 포드만 트래픽을 허용하는 예제입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: prod
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: api
namespaceSelector:
matchLabels:
environment: prod
ports:
- protocol: TCP
port: 3306
egress: []
이 정책은 environment: prod
라벨이 있는 네임스페이스 내의 role: api
라벨이 있는 포드만 트래픽을 허용합니다.
쿠버네티스 클러스터 외부의 백업 서버가 데이터베이스 포드에 접근할 수 있도록 설정하려면 IP 블록 선택자를 사용합니다. 아래는 특정 IP 주소에서 오는 트래픽을 허용하는 예제입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: your-namespace
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 192.168.5.10/32
ports:
- protocol: TCP
port: 3306
egress: []
이 정책은 IP 주소 192.168.5.10
에서 오는 트래픽을 허용합니다.
마지막으로, 데이터베이스 포드에서 외부 백업 서버로의 트래픽을 허용하는 이그레스 규칙을 추가해봅시다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: your-namespace
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 3306
egress:
- to:
- ipBlock:
cidr: 192.168.5.10/32
ports:
- protocol: TCP
port: 80
이 규칙은 데이터베이스 포드에서 외부 백업 서버의 80 포트로의 트래픽을 허용합니다.
이번 글에서는 쿠버네티스 네트워크 정책을 사용하여 데이터베이스 포드를 보호하는 방법을 살펴보았습니다.