ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 설정

    1. GKE에서 외부 IP 확인:
      먼저, GKE에서 Ingress를 통해 생성된 외부 IP를 확인해야 합니다.결과 예시:여기서 ADDRESS에 할당된 IP (34.123.45.67)를 확인할 수 있습니다.
    2. NAME HOSTS ADDRESS PORTS AGE dashboard-ingress dashboard.example.com 34.123.45.67 80 10m
    3. kubectl get ingress dashboard-ingress
    4. DNS 레코드 설정:
      GCP의 Google Cloud DNS 또는 사용하는 DNS 제공업체에서 A 레코드를 설정하여, dashboard.example.com을 GKE에서 할당된 IP로 포워딩합니다.
    5. 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에서 외부 클라이언트에게 대시보드를 제공하는 서비스 구성의 흐름은 다음과 같습니다:

    1. Service.yaml에서 ClusterIP 서비스로 대시보드를 정의합니다.
    2. Ingress.yaml에서 Ingress 리소스를 설정하여 Google Cloud HTTP(S) Load Balancer를 자동으로 생성하고, 외부 도메인(dashboard.example.com)을 설정합니다.
    3. GCP 부하분산 서비스는 GKE Ingress 리소스를 기반으로 Google Cloud HTTP(S) Load Balancer를 자동으로 구성하며, 외부에서 접근할 수 있도록 합니다.
    4. 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개만 선택해야 합니다.

    댓글