외부 LoadBalancer Service 사용

LoadBalancer Service의 실제 공개 범위를 확인하고 내부용 서비스의 불필요한 외부 경로를 제한하세요.

설명

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를 요청합니다. 다른 공개 경로와 접근 제어도 확인하세요.

참조