이번 글에서는 네트워크 정책에 대해 다루겠습니다. 네트워킹과 보안의 기본 개념부터 시작해 Kubernetes에서 네트워크 정책을 설정하고 사용하는 방법까지 차근차근 설명드리겠습니다.
먼저, 웹 애플리케이션과 데이터베이스 서버를 통한 트래픽 흐름에 대한 간단한 예시로 시작해보겠습니다.
사용자가 포트 80에서 웹 서버로 요청을 보내면, 웹 서버는 백엔드의 API 서버로 포트 5000에서 요청을 보냅니다. API 서버는 데이터베이스 서버에서 포트 3306으로 데이터를 가져오고, 그 데이터를 사용자에게 다시 보냅니다.
이 간단한 예시에서 두 가지 유형의 트래픽을 확인할 수 있습니다: 인그레스(ingress)와 이그레스(egress).
예를 들어, 웹 서버의 경우 사용자의 인바운드 트래픽은 인그레스 트래픽이고, 앱 서버로의 아웃바운드 요청은 이그레스 트래픽입니다.
이제 Kubernetes의 네트워크 보안에 대해 살펴보겠습니다. Kubernetes 클러스터에는 여러 노드가 있고, 각 노드는 여러 포드(pods)와 서비스를 호스팅합니다. 각 노드, 포드, 서비스는 고유한 IP 주소를 가지고 있습니다.
Kubernetes 네트워킹의 전제 조건 중 하나는, 어떤 네트워크 솔루션이든 포드들이 추가 설정 없이 서로 통신할 수 있어야 한다는 것입니다. 기본적으로 Kubernetes는 모든 포드나 서비스 간의 트래픽을 허용하는 "All Allow" 규칙으로 설정되어 있습니다.
네트워크 정책은 Kubernetes 네임스페이스의 또 다른 객체로, 포드 간의 트래픽을 제어할 수 있습니다. 이를 통해 보안 팀과 감사 요구 사항을 충족할 수 있습니다.
예를 들어, 프론트엔드 웹 서버가 데이터베이스 서버와 직접 통신하지 못하게 하려면 어떻게 해야 할까요? 이럴 때 네트워크 정책을 사용하여 API 서버로부터의 트래픽만 데이터베이스 서버로 허용하도록 설정할 수 있습니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api
ports:
- protocol: TCP
port: 3306
위의 예시에서는 db-policy
라는 이름의 네트워크 정책을 정의합니다. 이 정책은 app: database
라벨이 붙은 포드에 적용되며, app: api
라벨이 붙은 포드로부터 포트 3306의 인그레스 트래픽만 허용합니다.
정책을 정의한 후, kubectl create -f <파일명>
명령어를 사용하여 정책을 클러스터에 적용할 수 있습니다. 네트워크 정책은 Kubernetes 클러스터에 구현된 네트워크 솔루션에 의해 적용됩니다. 모든 네트워크 솔루션이 네트워크 정책을 지원하는 것은 아니므로, 사용 중인 네트워크 솔루션의 문서를 참조하여 네트워크 정책 지원 여부를 확인해야 합니다.
주의: Flannel을 네트워크 솔루션으로 사용한 경우, 네트워크 정책을 지원하지 않습니다.
네트워크 정책은 Kubernetes 환경에서 포드 간의 통신을 제어하고 보안을 강화하는 강력한 도구입니다. 이번 글에서는 네트워크 정책의 기본 개념과 Kubernetes에서의 적용 방법에 대해 살펴보았습니다.