정책에서 서비스 규칙 사용하기
Calico 네트워크 정책 규칙에서 특정 pod 셀렉터 대신 Kubernetes 서비스 이름을 매칭할 수 있다는 사실, 알고 계셨나요? 서비스 이름을 정책에 사용하면 애플리케이션이 이미 선언한 포트 정보와 접근 대상을 그대로 재사용할 수 있어서 정책 관리가 훨씬 쉬워져요. 이 문서는 Kubernetes API, kube-dns, 그리고 특정 서비스에 대한 접근을 허용하는 예제를 다뤄요.
출처: 문서
본문
큰 그림
Calico 네트워크 정책으로 Kubernetes 서비스에 대한 트래픽을 허용하거나 거부할 수 있어요.
가치
Calico 네트워크 정책을 사용하면 Kubernetes 서비스 이름을 활용해 Kubernetes 서비스 접근을 손쉽게 정의할 수 있어요. 정책에서 서비스 이름을 사용하면 다음이 가능해요:
- Kubernetes API 서비스에 대한 접근을 허용하거나 거부하기
- 애플리케이션이 이미 선언한 포트 정보를 참조하기 — 애플리케이션 요구 사항이 바뀌어도 정책을 최신 상태로 유지하기 쉬워져요
방법
특정 네임스페이스에 대해 Kubernetes API 접근 허용하기
다음 예제에서는 네임스페이스 my-app의 모든 pod에 대해, default 네임스페이스의 kubernetes 서비스로 나가는 egress 트래픽을 허용해요. 이 서비스는 Kubernetes API 서버의 일반적인 접근 지점이에요.
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-api-access
namespace: my-app
spec:
selector: all()
egress:
- action: Allow
destination:
services:
name: kubernetes
namespace: default
허용할 엔드포인트 주소와 포트는 서비스로부터 자동으로 감지돼요.
클러스터 전체에 Kubernetes DNS 접근 허용하기
다음 예제에서는 GlobalNetworkPolicy를 사용해 클러스터의 모든 pod를 선택하고, 모든 pod가 Kubernetes DNS 서비스에 접근할 수 있도록 보장하는 규칙을 적용해요.
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: allow-kube-dns
spec:
selector: all()
egress:
- action: Allow
destination:
services:
name: kube-dns
namespace: kube-system
참고: 이 정책은 모든 pod에 대해 default-deny 동작도 함께 만들어요. 따라서 그 외 필요한 애플리케이션 트래픽은 별도 정책으로 허용했는지 꼭 확인하세요.
지정된 서비스로부터의 접근 허용하기
다음 예제에서는 네임스페이스 backend의 모든 pod에 대해, frontend 네임스페이스의 frontend-service 서비스에서 오는 ingress 트래픽을 허용해요. 이렇게 하면 frontend-service 서비스를 백킹하는 모든 pod가 backend 네임스페이스의 모든 pod로 트래픽을 보낼 수 있어요.
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-frontend-service-access
namespace: backend
spec:
selector: all()
ingress:
- action: Allow
source:
services:
name: frontend-service
namespace: frontend
frontend-service 서비스가 접근할 수 있는 포트를 더 좁혀 지정할 수도 있어요. 다음 예제는 frontend-service 서비스로부터의 접근을 80번 포트로 제한해요.
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-frontend-service-access
namespace: backend
spec:
selector: all()
ingress:
- action: Allow
protocol: TCP
source:
services:
name: frontend-service
namespace: frontend
destination:
ports: [80]
추가 리소스
더 알아보기 (Learn more)
서비스 이름 기반 규칙을 쓰면 애플리케이션 구성과 정책 사이의 간격이 줄어들어요. 서비스가 재배치되거나 스케일해도 엔드포인트 주소를 자동으로 감지한다는 점이 가장 큰 장점이에요.