외부 애플리케이션 부하 분산기용 인그레스


이 페이지에서는 Google Kubernetes Engine(GKE)에서 외부 애플리케이션 부하 분산기에 대한 인그레스가 작동하는 방식을 설명합니다. 외부 부하 분산용 인그레스 설정 및 사용 방법도 설명합니다.

GKE에서 부하 분산 사용에 대한 일반적인 내용은 외부 애플리케이션 부하 분산기용 인그레스를 참조하세요.

Google Kubernetes Engine(GKE) 네트워킹은 Cloud Load Balancing을 기반으로 합니다. Cloud Load Balancing을 통해 단일 애니캐스트 IP 주소로 라우팅을 통해 가장 가까운 Google Cloud 부하 분산기까지의 최저 비용 경로를 결정할 수 있습니다.

Google Cloud 기능 지원

BackendConfig를 사용하여 다음과 같은 기능을 사용하도록 외부 애플리케이션 부하 분산기를 구성할 수 있습니다.

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

WebSocket 지원

외부 애플리케이션 부하 분산기를 사용하면 WebSocket 프로토콜이 구성 없이 작동합니다.

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

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

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

HTTPS 부하 분산기용 고정 IP 주소

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

인그레스를 삭제하고 새 인그레스를 만들어도 동일하게 유지되는 영구 IP 주소를 원하면 전역 고정 외부 IP 주소를 예약해야 합니다. 그런 다음 인그레스 매니페스트에 예약된 고정 IP 주소의 이름을 제공하는 주석을 포함합니다. 기존 인그레스에서 임시 IP 주소 대신 고정 IP 주소를 사용하도록 수정하면 GKE가 부하 분산기의 전달 규칙을 다시 만들 때 부하 분산기의 IP 주소를 변경할 수 있습니다.

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

apiVersion: networking.k8s.io/v1
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/v1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: SECRET_NAME
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: SERVICE_NAME
            port:
              number: 60000

이 매니페스트에는 다음 값이 포함됩니다.

  • SECRET_NAME: 자신이 만든 보안 비밀의 이름입니다.
  • SERVICE_NAME: 백엔드 서비스 이름입니다.

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

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

GKE 클러스터의 HTTPS 암호화된 인그레스를 보호하려면 보안 인그레스 예시를 참조하세요.

HTTP 중지

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

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

이 매니페스트에는 자신이 만든 보안 비밀의 이름인 SECRET_NAME이 포함됩니다.

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

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

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

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

부하 분산기와 애플리케이션 사이에서 사용되는 프로토콜을 구성하려면 서비스 매니페스트에서 cloud.google.com/app-protocols 주석을 사용합니다. 컨테이너 기반 부하 분산을 사용하지 않는 한 이 서비스 매니페스트에는 type: NodePort가 포함되어야 합니다. 컨테이너 기반 부하 분산을 사용하는 경우 type: ClusterIP를 사용합니다.

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

서비스 매니페스트는 포트 주석에 name 값을 포함해야 합니다. targetPort 값이 아닌 할당된 name을 참조하여 서비스 포트를 수정할 수만 있습니다.

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

다음 단계