설명
type: LoadBalancer인 Service는 클러스터 외부에서 접근 가능한 엔드포인트를 만들 수 있습니다. 인터넷 공개 여부는 클라우드와 컨트롤러 설정에 따라 달라집니다. 내부용 서비스까지 공개되면 원래 의도하지 않은 공개 경로가 생길 수 있습니다.
서비스가 외부 공개가 필요한지 먼저 판단해야 합니다. 내부 통신용이면 ClusterIP 또는 내부 전용 LoadBalancer 구성을 우선 검토하는 편이 안전합니다.
잠재적 영향
- 내부용 서비스가 인터넷이나 외부 네트워크에 직접 노출될 수 있습니다.
- 인증이나 접근 제어가 약한 서비스가 외부 스캔 대상이 될 수 있습니다.
- 운영자가 모르는 공개 경로가 생겨 보안 통제가 어려워질 수 있습니다.
해결 방법
- 외부 공개가 필요하지 않은 서비스는 내부 전용 Service 또는 내부 LoadBalancer를 사용하세요.
- 설치된 컨트롤러가 지원하는 내부 전용 설정을 적용하고 실제 로드 밸런서와 접근 규칙을 확인하세요.
- 실제로 외부 공개가 필요한 서비스만 별도로 승인해 운영하세요.
예시
뒤의 annotation은 이를 지원하는 AWS 컨트롤러용입니다. AWS Load Balancer Controller는 이 기존 설정을 지원하지만 aws-load-balancer-scheme을 우선하므로, 설치 버전의 권장 설정과 실제 구성을 확인하세요.
변경 전
yaml
apiVersion: v1
kind: Service
metadata:
name: sample-service-public
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app: nginx
변경 후
yaml
apiVersion: v1
kind: Service
metadata:
name: sample-service-internal
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app: nginx
설명:
- 변경 전: LoadBalancer를 요청하며 공개 여부는 컨트롤러의 기본값과 설정에 달려 있습니다.
- 변경 후: 지원되는 AWS 컨트롤러에서 내부 전용 LoadBalancer를 요청합니다. 다른 공개 경로와 접근 제어도 확인하세요.