외부 HTTP(S) 부하 분산용 인그레스

이 페이지에서는 Google Kubernetes Engine(GKE)에서 외부 HTTP(S) 부하 분산용 인그레스가 작동하는 방식을 설명합니다. 외부 부하 분산용 인그레스 설정 및 사용 방법도 설명합니다.

GKE에서 부하 분산 사용에 대한 일반적인 내용은 HTTP(S) 부하 분산용 인그레스를 참조하세요.

개요

Google Cloud의 외부 HTTP(S) 부하 분산기는 인터넷에서 애플리케이션을 공개하는 데 사용되는 전역 분산 부하 분산기입니다. 이 부하 분산기는 Google 접속 지점(PoP)에 배포되어 전역에서 사용자에게 지연 시간이 짧은 HTTP(S) 연결을 제공합니다. Anycast 라우팅은 부하 분산기 IP에 사용되므로 인터넷 라우팅에서 가장 가까운 Google 부하 분산기까지의 최저 비용 경로를 결정할 수 있습니다.

GKE 인그레스는 외부 HTTP(S) 부하 분산기를 배포하여 Pod 전역 부하 분산을 백엔드로 기본 제공합니다.

Google Cloud 기능 지원

BackendConfig를 사용하여 다음과 같은 기능을 사용하도록 외부 HTTP(S) 부하 분산기를 구성할 수 있습니다.

BackendConfig는 Google Cloud 기능의 구성 정보를 보존하는 커스텀 리소스입니다. 지원되는 기능에 대한 자세한 내용은 인그레스 기능을 참조하세요.

WebSocket 지원

외부 HTTP(S) 부하 분산을 사용하면 WebSocket 프로토콜이 구성 없이 작동합니다.

WebSocket 프로토콜을 사용하려는 경우 기본값인 30초보다 큰 제한 시간 값을 사용하려 할 수 있습니다. Google Cloud 외부 HTTP(S) 부하 분산기를 통해 전송된 WebSocket 트래픽의 경우 백엔드 서비스 제한 시간은 유휴 상태 여부에 관계없이 WebSocket 연결이 열린 상태로 유지될 수 있는 최대 시간으로 해석됩니다.

인그레스를 통해 구성된 백엔드 서비스의 제한 시간 값을 설정하려면 BackendConfig 객체를 만들고 서비스 매니페스트에서 beta.cloud.google.com/backend-config 주석을 사용합니다.

구성 정보는 백엔드 응답 제한 시간을 참조하세요.

HTTP(S) 부하 분산기용 고정 IP 주소

Ingress 객체를 만들면 클라이언트가 서비스 및 실행 중인 컨테이너에 액세스하는 데 사용할 수 있는 안정적인 외부 IP 주소를 얻게 됩니다. 이 IP 주소는 Ingress 객체의 수명 동안 지속된다는 점에서 안정적입니다. 인그레스를 삭제하고 동일한 매니페스트 파일에서 새 인그레스를 만드는 경우, 동일한 외부 IP 주소를 얻게 된다고 보장할 수 없습니다.

인그레스를 삭제하고 새 인그레스를 만들어도 동일하게 유지되는 영구 IP 주소를 원하면 전역 고정 외부 IP 주소를 예약해야 합니다. 그런 다음 인그레스 매니페스트에 예약된 고정 IP 주소의 이름을 제공하는 주석을 포함합니다.

예를 들어 이름이 my-static-address인 전역 고정 외부 IP 주소를 예약했다고 가정해 보세요. 다음과 같이 인그레스 매니페스트에 kubernetes.io/ingress.global-static-ip-name 주석을 포함합니다.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

클라이언트와 부하 분산기 간 HTTPS(TLS) 설정

HTTP(S) 부하 분산기는 클라이언트와 애플리케이션 사이의 프록시 역할을 합니다. 클라이언트의 HTTPS 요청을 수락하려는 경우, 부하 분산기에 인증서가 있어야 부하 분산기가 클라이언트에게 ID를 증명할 수 있습니다. HTTPS 핸드셰이크를 완료하려면 부하 분산기에 비공개 키도 있어야 합니다.

부하 분산기가 클라이언트의 HTTPS 요청을 수락하면 클라이언트와 부하 분산기 간 트래픽은 TLS를 사용하여 암호화됩니다. 하지만 부하 분산기는 TLS 암호화를 종료하고 암호화 없이 요청을 애플리케이션에 전달합니다. 부하 분산기와 애플리케이션 간의 트래픽을 암호화하는 방법은 부하 분산기와 애플리케이션 간 HTTPS를 참조하세요.

Google 관리 SSL 인증서(베타)를 사용하거나 직접 관리하는 인증서를 사용할 수 있습니다. Google 관리 인증서를 사용하는 인그레스를 만드는 방법에 대한 자세한 내용은 Google 관리 SSL 인증서(베타) 사용을 참조하세요.

HTTP(S) 부하 분산기에 직접 만든 인증서와 키를 제공하려면 Kubernetes 보안 비밀 객체를 만듭니다. 보안 비밀에는 인증서와 키가 포함되어 있습니다. 다음 예시와 같이 Ingress 매니페스트의 tls 필드에 보안 비밀을 추가합니다.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: secret-name
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: service-name
          servicePort: 60000

보안 비밀 변경사항은 정기적으로 수집됩니다. 따라서 보안 비밀에 있는 데이터를 수정할 경우 변경사항이 부하 분산기에 적용되는 데 최대 10분이 소요됩니다.

자세한 내용은 인그레스를 사용하는 HTTP(S) 부하 분산에서 여러 SSL 인증서 사용을 참조하세요.

HTTP 중지

클라이언트와 HTTP(S) 부하 분산기 사이의 모든 트래픽이 HTTPS를 사용하도록 하려면 인그레스 매니페스트에 kubernetes.io/ingress.allow-http 주석을 포함시켜 HTTP를 사용 중지하면 됩니다. 주석 값을 "false"로 설정합니다.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: secret-name
  ...

부하 분산기용 사전 공유 인증서

Kubernetes 보안 비밀을 사용하여 HTTP(S) 종료할 수 있도록 부하 분산기에 인증서를 제공하는 대신 이전에 Google Cloud 프로젝트에 업로드한 인증서를 사용할 수 있습니다. 자세한 내용은 사전 공유된 인증서 사용인그레스를 사용하는 HTTPS 부하 분산에서 여러 SSL 인증서 사용을 참조하세요.

부하 분산기와 애플리케이션 간 HTTPS(TLS)

HTTP(S) 부하 분산기는 클라이언트와 애플리케이션 사이의 프록시 역할을 합니다. 클라이언트는 HTTP 또는 HTTPS를 사용하여 부하 분산기 프록시와 통신할 수 있습니다. 부하 분산기 프록시와 애플리케이션 간의 연결에는 기본적으로 HTTP가 사용됩니다. 하지만 GKE Pod에서 실행되는 애플리케이션이 HTTPS 요청을 수신할 수 있으면 요청을 애플리케이션으로 전달할 때 부하 분산기가 HTTPS를 사용하도록 구성할 수 있습니다.

부하 분산기와 애플리케이션 사이에서 사용되는 프로토콜을 구성하려면 서비스 매니페스트에서 cloud.google.com/app-protocols 주석을 사용합니다.

다음 서비스 매니페스트는 두 포트를 지정합니다. 주석은 HTTP(S) 부하 분산기가 서비스의 포트 80을 대상으로 지정하는 경우, HTTP를 사용해야 한다는 것을 의미합니다. 또한 부하 분산기가 서비스의 포트 443을 대상으로 지정하는 경우에는 HTTPS를 사용해야 합니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

다음 단계