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

개요

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

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

시작하기 전에

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

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

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

환경 설정하기

사용하려는 클러스터에 액세스할 수 있는 워크스테이션에서 다음 명령어를 실행합니다. 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}
    
  2. 네임스페이스의 삽입을 사용 설정합니다. 이 단계는 Cloud Service Mesh 유형(관리형 또는 클러스터 내)에 따라 다릅니다.

    관리형

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

      kubectl -n istio-system get controlplanerevision
      

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

      NAME                AGE
      asm-managed         6d7h
      asm-managed-rapid   6d7h
      

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

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

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

    클러스터 내

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

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

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

    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
    
  4. 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)"
    
  5. [선택사항] 인그레스 게이트웨이 노드 라벨 어피니티에 대한 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입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 클러스터의 모든 노드에서 동일합니다.

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

다음 단계