-
[GCP] GKE에서 인바운드를 허용하도록 구성하기AWS & GCP 2025. 3. 30. 19:42
개요
일반적으로 클러스터를 private으로 구성한 다음, 외부에서 트래픽을 허용하도록 서비스를 구성합니다. 이 때, 외부에서 어떻게 내부로 트래픽을 허용할 수 있는지를 설명합니다.
NodePort는 주로 클러스터 내부적인 테스트나 디버깅 목적으로 사용되며 Private 클러스터에서 직접적인 외부 접근을 허용하는 데는 적합하지 않습니다. 여기선 service 타입을 ClusterIP + ingress 와 service 타입을 loadbalancer로 설정하는 두 가지에 대해 설명합니다.
service 타입 ClusterIP + ingress 로 구성
GKE에서 외부 클라이언트에게 대시보드를 제공하는 서비스를 구성하기 위해서는 Service, Ingress, 그리고 GCP의 부하분산 서비스를 설정해야 합니다. 이때 GKE에서
Ingress
를 사용하여 외부 클라이언트가 대시보드 서비스에 접근할 수 있도록 하는 방식이 일반적입니다. 아래 예시를 통해 단계별로 설명드리겠습니다.1. Service.yaml — 대시보드 서비스 정의
대시보드 서비스를 클러스터 내부에서 정의하고, 이를 외부에서 접근할 수 있도록
Ingress
와 연결할 수 있습니다.yaml 복사 apiVersion: v1 kind: Service metadata: name: dashboard-service spec: selector: app: dashboard ports: - protocol: TCP port: 80 # 외부에서 접근할 포트 targetPort: 8080 # 대시보드 서비스가 노출하는 포트 (대시보드 컨테이너의 포트) type: ClusterIP # Ingress를 통해 접근하도록 설정
targetPort
: 대시보드 애플리케이션이 사용하는 포트 (컨테이너 내에서 실제로 애플리케이션이 리스닝하는 포트).ClusterIP
: 외부 클라이언트는 직접 이 서비스를 접근할 수 없고,Ingress
를 통해 연결됩니다.
2. Ingress.yaml — Ingress 리소스 설정
Ingress
는 클러스터 내 여러 서비스를 단일 외부 IP로 라우팅할 수 있는 기능을 제공합니다. GKE는Ingress
를 설정하면 Google Cloud HTTP(S) Load Balancer를 자동으로 생성하여 외부에서 접근할 수 있도록 해줍니다.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress annotations: kubernetes.io/ingress.class: "gce" # GKE Ingress Controller 사용 spec: rules: - host: dashboard.example.com # 외부에서 접근할 도메인 이름 (DNS 설정 필요) http: paths: - path: / pathType: Prefix backend: service: name: dashboard-service # 앞서 정의한 서비스 이름 port: number: 80 # 대시보드 서비스의 외부 포트
host
: 외부 클라이언트가 대시보드에 접근할 때 사용할 도메인 이름입니다. (예:dashboard.example.com
)- DNS 설정: GKE가 생성한 외부 IP로 DNS 레코드를 설정해야 합니다.
service.name
: 앞서 정의한dashboard-service
의 이름입니다.path
: 특정 경로를 지정해 외부 클라이언트가 접속할 수 있는 URL 경로를 설정합니다.
3. GCP 부하분산 서비스
Ingress
리소스를 설정하면 GCP에서 자동으로 HTTP(S) Load Balancer가 생성됩니다. 이 Load Balancer는Ingress
규칙에 따라 트래픽을 처리하고 외부에서 GKE 서비스로 라우팅합니다.- 자동 DNS 설정: GKE에서
Ingress
를 설정하면 자동으로 Google Cloud HTTP(S) Load Balancer가 설정되며, 해당 로드밸런서의 외부 IP가 할당됩니다. - 해당 로드밸런서에 DNS 레코드를 연결해야
dashboard.example.com
과 같은 도메인으로 접근할 수 있습니다.
4. DNS 설정
- GKE에서 외부 IP 확인:
먼저, GKE에서Ingress
를 통해 생성된 외부 IP를 확인해야 합니다.결과 예시:여기서ADDRESS
에 할당된 IP (34.123.45.67
)를 확인할 수 있습니다. NAME HOSTS ADDRESS PORTS AGE dashboard-ingress dashboard.example.com 34.123.45.67 80 10m
kubectl get ingress dashboard-ingress
- DNS 레코드 설정:
GCP의 Google Cloud DNS 또는 사용하는 DNS 제공업체에서 A 레코드를 설정하여,dashboard.example.com
을 GKE에서 할당된 IP로 포워딩합니다. dashboard.example.com. IN A 34.123.45.67 # GKE 외부 IP
5. 부하분산 서비스의 구성 요소
GKE의
Ingress
리소스를 사용하여 Google Cloud HTTP(S) Load Balancer가 자동으로 설정되며, 이는 다음과 같은 요소들로 구성됩니다:- Backend Service: GKE의 서비스(
dashboard-service
)와 연결된 백엔드 서비스. - URL Map:
Ingress
에서 정의한 규칙을 바탕으로 트래픽을 라우팅하는 매핑. - Frontend Configuration: 클라이언트의 요청을 수신하는 외부 IP와 포트 80에 대한 설정.
- SSL 설정: SSL 종료 설정이 필요한 경우,
Ingress
에서 SSL 인증서를 지정할 수 있습니다.
정리
GKE에서 외부 클라이언트에게 대시보드를 제공하는 서비스 구성의 흐름은 다음과 같습니다:
- Service.yaml에서
ClusterIP
서비스로 대시보드를 정의합니다. - Ingress.yaml에서
Ingress
리소스를 설정하여 Google Cloud HTTP(S) Load Balancer를 자동으로 생성하고, 외부 도메인(dashboard.example.com
)을 설정합니다. - GCP 부하분산 서비스는 GKE
Ingress
리소스를 기반으로 Google Cloud HTTP(S) Load Balancer를 자동으로 구성하며, 외부에서 접근할 수 있도록 합니다. - DNS 설정을 통해 외부 도메인 이름을 GKE에 할당된 IP로 연결합니다.
이렇게 설정하면, 클러스터 내의 대시보드 서비스가 외부 클라이언트에서
dashboard.example.com
주소를 통해 접근 가능해집니다.서비스 타입 LoadBalancer 로 구성
GKE에서
LoadBalancer
타입의 서비스는 자동으로 GCP에서 Google Cloud Load Balancer를 생성하고 외부에서 해당 서비스에 접근할 수 있는 외부 IP를 제공합니다. 이렇게 하면Ingress
를 설정할 필요 없이 외부에서 직접 서비스에 접근할 수 있습니다.1. Service.yaml (Service 타입을
LoadBalancer
로 설정)apiVersion: v1 kind: Service metadata: name: dashboard-service spec: selector: app: dashboard ports: - protocol: TCP port: 80 # 외부에서 접근할 포트 targetPort: 8080 # 대시보드 서비스가 노출하는 포트 (컨테이너 내에서 애플리케이션이 리스닝하는 포트) type: LoadBalancer # 외부에서 접근할 수 있도록 로드밸런서 타입으로 설정
type: LoadBalancer
: 이 설정으로 GKE가 Google Cloud Load Balancer를 자동으로 생성하여 외부 IP를 할당합니다. 외부에서 이 IP를 통해 서비스를 접근할 수 있습니다.port
: 외부에서 접근할 포트입니다. 일반적으로 HTTP 서비스의 경우 80번 포트를 사용합니다.targetPort
: 대시보드 서비스가 실제로 리스닝하는 포트입니다. 예를 들어, 대시보드 애플리케이션이 8080 포트를 사용한다면targetPort: 8080
으로 설정합니다.
2. 외부 IP 확인하기
kubectl get svc
명령어를 통해 서비스의 외부 IP를 확인할 수 있습니다.kubectl get svc dashboard-service
결과 예시:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-service LoadBalancer 10.100.200.10 34.123.45.67 80:31234/TCP 10m
여기서
EXTERNAL-IP
가 외부에서 접근할 수 있는 IP입니다. 이 IP로 외부 클라이언트가 대시보드 서비스에 접근할 수 있습니다.3.
Ingress
설정이 필요 없는 이유Ingress
는 여러 서비스가 단일 외부 IP를 공유하고, 다양한 URL 경로에 따라 트래픽을 분배하는 역할을 합니다. 주로 복잡한 라우팅이나 여러 도메인/경로를 관리할 때 사용됩니다.Service
타입이LoadBalancer
인 경우, 외부 IP가 이미 할당되므로 단일 서비스에 대해서는Ingress
가 필요 없습니다.LoadBalancer
는 이미 외부에서 직접 접근할 수 있는 IP를 제공합니다.
따라서 단일 서비스만 외부에 노출하려면
LoadBalancer
를 사용하면 충분하며,Ingress
는 필요 없습니다.4. GKE Load Balancer 동작
- GKE에서
LoadBalancer
서비스는 Google Cloud Load Balancer를 사용하여 외부 IP를 할당합니다. - 이 외부 IP는 클러스터 외부에서 서비스에 직접 접근할 수 있도록 해줍니다. GKE는 이 IP에 대한 트래픽을 해당 서비스의 파드로 전달합니다.
5. 외부 DNS 설정 (선택 사항)
- 외부 IP가 할당되면, 해당 IP에 대한 DNS 레코드를 설정할 수 있습니다. 예를 들어,
dashboard.example.com
이라는 도메인으로 서비스를 제공하고 싶다면, DNS 제공업체에서A
레코드를 추가하여 외부 IP로 도메인을 연결합니다.
정리
Service
타입을LoadBalancer
로 설정하면 GKE는 자동으로 Google Cloud Load Balancer를 생성하고, 외부에서 접근할 수 있는 IP를 할당합니다.- 이 경우
Ingress
설정이 필요하지 않습니다, 왜냐하면LoadBalancer
타입 서비스는 외부 IP를 제공하고, 외부에서 이 IP를 통해 직접 서비스에 접근할 수 있기 때문입니다.
이 방식은 단일 서비스를 외부에 노출하는 간단하고 직관적인 방법입니다. 여러 서비스에 대한 복잡한 라우팅이 필요하지 않다면
Ingress
대신LoadBalancer
타입 서비스를 사용하는 것이 적합합니다.서비스 타입 loadbalancer + ingress로 구성한다면
외부에서 loadbalancer와 ingress 두 가지 방식 모두 접근할 수 있습니다. 두 로드밸런서가 각각 다른 방식으로 트래픽을 처리하지만 둘 다 외부에서 접근할 수 있도록 설정됩니다.
LoadBalancer
서비스가 할당한 외부 IP로도 접근할 수 있습니다.Ingress
에 의해 생성된 Google Cloud Load Balancer로도 접근할 수 있습니다.
정리
AWS에서 구성하는 것처럼 GKE를 구성하면 외부 포인트가 2개가 열리게 되는 상황이 발생합니다. AWS의 구성이 조금 특이한 경우이므로 GKE에서는 서비스 타입을 loadbalancer 로만 할지, 서비스 타입 ClusterIP + ingress로 할지 1개만 선택해야 합니다.