인그레스를 사용한 부하 분산용 HTTP/2 사용


이 페이지에서는 Kubernetes 인그레스서비스 객체를 사용하여 백엔드 서비스와의 통신에 HTTP/2를 사용하도록 외부 애플리케이션 부하 분산기를 구성하는 방법을 보여줍니다.

개요

애플리케이션 부하 분산기는 클라이언트와 애플리케이션 사이의 프록시 역할을 합니다. 클라이언트는 HTTP/1.1 또는 HTTP/2를 사용하여 부하 분산기 프록시와 통신할 수 있습니다. 하지만 부하 분산기 프록시에서 애플리케이션까지의 연결은 기본적으로 HTTP/1.1을 사용합니다. Google Kubernetes Engine(GKE) 포드에서 실행되는 애플리케이션이 HTTP/2 요청을 수신할 수 있는 경우, 요청을 애플리케이션으로 전달할 때 HTTP/2를 사용하도록 외부 부하 분산기를 구성합니다.

이 연습에서는 배포, 서비스, 인그레스를 만듭니다. 부하 분산기가 HTTP/2를 사용하여 애플리케이션과 통신하도록 지정하기 위해 서비스 매니페스트에 cloud.google.com/app-protocols 주석을 추가합니다. 그런 다음 서비스를 호출하고 애플리케이션이 HTTP/2 요청을 수신했는지 확인합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

배포 만들기

  1. 다음 매니페스트를 my-deployment.yaml이라는 파일에 복사합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echoheaders
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: echoheaders
      template:
        metadata:
          labels:
            app: echoheaders
        spec:
          containers:
          - name: echoheaders
            image: registry.k8s.io/echoserver:1.10
            ports:
            - containerPort: 8443
    

    이 매니페스트는 echoheaders 웹 애플리케이션의 두 복제본이 있는 배포를 설명합니다.

  2. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f my-deployment.yaml
    

서비스 만들기

  1. 다음 매니페스트를 my-service.yaml이라는 파일에 복사합니다.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
      name: echoheaders
      labels:
        app: echoheaders
    spec:
      type: NodePort
      ports:
      - port: 443
        targetPort: 8443
        protocol: TCP
        name: my-port
      selector:
        app: echoheaders
    

    이 매니페스트는 다음 속성을 사용해서 서비스를 기술합니다.

    • type: NodePort: NodePort 유형의 서비스임을 지정합니다.
    • app: echoheaders: 이 라벨이 있는 포드가 서비스의 구성원임을 지정합니다.
    • cloud.google.com/app-protocols: my-port가 HTTP/2 프로토콜을 사용하도록 지정합니다.
    • port: 443, protocol: TCP, targetPort: 8433: TCP 포트 443의 서비스로 전달되는 트래픽이 구성원 포드 중 하나의 TCP 포트 8422로 라우팅되어야 한다고 지정합니다.
  2. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f my-service.yaml
    
  3. 서비스를 확인합니다.

    kubectl get service echoheaders --output yaml
    

    출력은 다음과 비슷합니다.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
        ...
      labels:
        app: echoheaders
      name: echoheaders
      ...
    spec:
      clusterIP: 10.39.251.148
      ...
      ports:
      - name: my-port
        nodePort: 30647
        port: 443
        protocol: TCP
        targetPort: 8443
      selector:
        app: echoheaders
      ...
      type: NodePort
    ...
    

인그레스 만들기

  1. 다음 매니페스트를 my-ingress.yaml이라는 파일에 복사합니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echomap
    spec:
      defaultBackend:
        service:
          name: echoheaders
          port:
            number: 443
    

    이 매니페스트는 들어오는 요청이 echoheaders 서비스의 구성원인 포드로 전송되도록 지정하는 인그레스를 설명합니다. 요청은 echoheaders 서비스 매니페스트에서 지정된 targetPort의 포드로 라우팅됩니다. 이 연습에서 포드 targetPort8443입니다.

  2. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f my-ingress.yaml
    

    Kubernetes 인그레스 컨트롤러가 애플리케이션 부하 분산기를 구성하는 동안 이 명령어를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

  3. 인그레스를 확인합니다.

    kubectl get ingress echomap --output yaml
    

    출력은 다음과 비슷합니다.

    kind: Ingress
    metadata:
      ...
      name: echomap
      ...
    spec:
      backend:
        serviceName: echoheaders
        servicePort: 443
    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.2
    

    이 출력에서 인그레스의 IP 주소는 203.0.113.2입니다.

부하 분산기 테스트

gcloud

  1. 백엔드 서비스를 나열합니다.

    gcloud compute backend-services list
    
  2. 백엔드 서비스를 설명합니다.

    gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
    

    BACKEND_SERVICE_NAME을 백엔드 서비스의 이름으로 바꿉니다.

    출력에 따르면 protocolHTTP2입니다.

    backends:
    ...
    description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}'
    ...
    kind: compute#backendService
    loadBalancingScheme: EXTERNAL
    protocol: HTTP2
    ...
    

콘솔

  1. Google Cloud 콘솔의 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. 이름 아래에서 부하 분산기를 찾습니다.

  3. 부하 분산기의 이름을 클릭하여 백엔드 서비스를 확인합니다.

  4. 백엔드 서비스의 엔드포인트 프로토콜HTTP/2인지 확인합니다.

서비스 호출하기

GKE가 부하 분산기와 백엔드 서비스를 구성할 때까지 몇 분 정도 기다린 후 브라우저의 주소 표시줄에 부하 분산기의 외부 IP 주소를 입력합니다.

출력은 다음과 비슷합니다.

Hostname: echoheaders-7886d5bc68-xnrwj
...
Request Information:
  ...
  method=GET
  real path=/
  query=
  request_version=2
  request_scheme=https
  ...

Request Headers:
  ...
  x-forwarded-for=[YOUR_IP_ADDRESS], 203.0.113.2
  x-forwarded-proto=http
...

다음은 부하 분산기에서 포드로 전송되는 요청에 대한 출력 정보입니다.

  • request_version=2: 부하 분산기와 포드 사이의 요청이 HTTP/2를 사용했음을 나타냅니다.
  • x-forwarded-proto=http: 브라우저와 부하 분산기 간의 요청이 HTTP/2가 아닌 HTTP 1.1을 사용했음을 나타냅니다.

다음 단계