외부 부하 분산기를 사용하여 인그레스 게이트웨이 노출

개요

Cloud Service Mesh를 사용하면 서비스 메시의 일부로 인그레스 게이트웨이를 배포하고 관리할 수 있습니다. 외부 부하 분산기(클러스터 외부에 있는 물리적 또는 소프트웨어 부하 분산기)를 사용하여 트래픽을 인그레스 게이트웨이로 전송해 Cloud Service Mesh로 클러스터 부하 분산을 추가로 구성할 수 있습니다.

이 페이지에서는 Cloud Service Mesh를 사용하여 외부 부하 분산기를 구성하는 방법을 보여줍니다. 또는 여러 백엔드 구성으로 인그레스를 설정할 수 있습니다.

시작하기 전에

이 문서의 단계를 완료하려면 다음 리소스가 필요합니다.

  • Cloud Service Mesh가 설치된 Kubernetes 클러스터

  • 클러스터가 실행 중인 노드에 액세스할 수 있는 외부 부하 분산기. 이 외부 부하 분산기가 부하 분산기의 외부 IP 주소를 사용하여 클러스터의 인그레스 게이트웨이를 시작하도록 구성합니다.

환경 설정하기

사용하려는 클러스터에 액세스할 수 있는 워크스테이션에서 다음 명령어를 실행합니다. kubectl 도구가 클러스터에 대한 클러스터 컨텍스트를 사용하도록 구성되었는지 확인합니다.

  1. 환경 변수를 설정하고,

    export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway
    export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
    
  2. 외부 부하 분산기의 IP address를 설정합니다.

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [\선택사항/] 인그레스 게이트웨이 노드에 라벨을 지정합니다. 그러면 게이트웨이가 클러스터의 특정 노드에 배포됩니다.

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터의 노드입니다. kubectl 명령어를 보유한 인그레스 노드 수만큼 실행합니다.

인그레스 게이트웨이 만들기

이 섹션의 안내를 완료하기 전에 컨트롤 플레인 구현을 확인해야 합니다. 이렇게 하려면 컨트롤 플레인 구현 식별의 안내를 수행합니다.

  1. 네임스페이스를 만듭니다. 이 네임스페이스는 인그레스 게이트웨이를 배포하는 데 사용됩니다.

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. 네임스페이스의 삽입을 사용 설정합니다. 이 단계는 컨트롤 플레인 구현에 따라 다릅니다.

    관리형(TD)

    1. 기본 삽입 라벨을 네임스페이스에 적용합니다.
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    관리형(Istiod)

    권장: 다음 명령어를 실행하여 네임스페이스에 기본 삽입 라벨을 적용합니다.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    관리형 Istiod 컨트롤 플레인이 있는 기존 사용자: 기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입은 지원됩니다. 다음 안내를 따르세요.

    1. 다음 명령어를 실행하여 사용 가능한 출시 채널을 찾습니다.

      kubectl -n istio-system get controlplanerevision
      

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

      NAME                AGE
      asm-managed-rapid   6d7h
      

      참고: 위 목록에 두 개의 컨트롤 플레인 버전이 표시되면 하나를 삭제합니다. 클러스터에 여러 컨트롤 플레인 채널을 두는 방식은 지원되지 않습니다.

      출력에서 NAME 열 아래의 값은 Cloud Service Mesh 버전에 사용 가능한 출시 채널에 해당하는 버전 라벨입니다.

    2. 네임스페이스에 버전 라벨을 적용합니다.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    클러스터 내

    권장: 다음 명령어를 실행하여 네임스페이스에 기본 삽입 라벨을 적용합니다.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입이 지원됩니다. 다음 안내를 따르세요.

    1. 다음 명령어를 사용하여 istiod에서 버전 라벨을 찾습니다.

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 네임스페이스에 버전 라벨을 적용합니다. 다음 명령어에서 REVISION_LABEL은 이전 단계에서 확인한 istiod 버전 라벨의 값입니다.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. 인그레스 게이트웨이 매니페스트 파일을 적용합니다.

    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
    

    예상 출력:

    serviceaccount/asm-ingressgateway created
    role.rbac.authorization.k8s.io/asm-ingressgateway created
    rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    service/asm-ingressgateway created
    poddisruptionbudget.policy/asm-ingressgateway created
    horizontalpodautoscaler.autoscaling/asm-ingressgateway created
    
  3. ingressgateway 서비스를 외부 부하 분산기 IP 주소로 패치합니다.

    cat <<EOF > asm-external-ip-patch.yaml
    spec:
      externalIPs:
        - ${EXTERNAL_LB_IP_ADDRESS}
      loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS}
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
    
  4. [선택사항] 인그레스 게이트웨이 노드 라벨 어피니티에 대한 ingressgateway 배포를 패치합니다.

    cat <<EOF > asm-ingress-node-label-patch.yaml
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ${ASM_INGRESSGATEWAY_NODE_LABEL}
                    operator: Exists
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
    

외부 부하 분산기 설정

이 섹션에서는 외부 부하 분산기가 클러스터에서 인그레스 게이트웨이와 연결되도록 구성합니다.

인그레스 게이트웨이 Service 포트 정보 가져오기

  1. NodePorts를 가져옵니다.

    export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
    
  2. NodePorts를 표시합니다.

    echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT}
    echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT}
    echo STATUS_PORT=${STATUS_PORT}
    

외부 부하 분산기 구성

이전 단계에 표시된 NodePorts를 사용하여 외부 부하 분산기와 인그레스 게이트웨이 간의 연결을 구성합니다.

  1. 부하 분산기 구성에서 상태 점검을 구성합니다.

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터에 있는 노드의 IP 주소입니다. 이 IP 주소는 외부 부하 분산기에서 연결할 수 있어야 합니다. 이 구성은 클러스터 노드당 한 번씩 여러 번 설정해야 할 수 있습니다.

    • STATUS_PORT: 인그레스 게이트웨이의 상태 API가 노출되는 NodePort입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.

  2. HTTPHTTPS 트래픽을 라우팅하도록 부하 분산기에서 노드 풀을 구성합니다. 포트 80(HTTP) 및 포트 443(HTTPS)에서 트래픽에 다음 IP:PORT 구성을 사용합니다.

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터에 있는 노드의 IP 주소입니다. 이 IP 주소는 외부 부하 분산기에서 연결할 수 있어야 합니다. 이 구성은 클러스터 노드당 한 번씩 여러 번 설정해야 할 수 있습니다.

    • HTTP_INGRESS_PORT: 인그레스 게이트웨이의 HTTP 트래픽이 노출되는 NodePort입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.

    • HTTPS_INGRESS_PORT: 인그레스 게이트웨이의 HTTPS 트래픽이 노출되는 NodePort입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.

설정을 확인하려면 부하 분산기의 상태 점검을 통과했는지 확인합니다.

다음 단계