외부 부하 분산기를 사용하여 인그레스 게이트웨이 노출
개요
Cloud Service Mesh를 사용하면 서비스 메시의 일부로 인그레스 게이트웨이를 배포하고 관리할 수 있습니다. 외부 부하 분산기(클러스터 외부의 물리적 또는 소프트웨어 부하 분산기)를 사용하여 인그레스 게이트웨이로 트래픽을 전송하여 Cloud Service Mesh로 클러스터의 부하 분산을 추가로 구성할 수 있습니다.
이 페이지에서는 Cloud Service Mesh를 사용하여 외부 부하 분산기를 구성하는 방법을 보여줍니다. 또는 여러 백엔드 구성으로 인그레스를 설정할 수 있습니다.
시작하기 전에
이 문서의 단계를 완료하려면 다음 리소스가 필요합니다.
Cloud Service Mesh가 설치된 Kubernetes 클러스터
클러스터가 실행 중인 노드에 액세스할 수 있는 외부 부하 분산기. 이 외부 부하 분산기가 부하 분산기의 외부 IP 주소를 사용하여 클러스터의 인그레스 게이트웨이를 시작하도록 구성합니다.
환경 설정하기
사용하려는 클러스터에 액세스할 수 있는 워크스테이션에서 다음 명령어를 실행합니다. kubectl
도구가 클러스터에 대한 클러스터 컨텍스트를 사용하도록 구성되었는지 확인합니다.
환경 변수를 설정하고,
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
외부 부하 분산기의
IP address
를 설정합니다.export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
[\선택사항/] 인그레스 게이트웨이 노드에 라벨을 지정합니다. 그러면 게이트웨이가 클러스터의 특정 노드에 배포됩니다.
kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
- INGRESSGATEWAY_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터의 노드입니다.
kubectl
명령어를 보유한 인그레스 노드 수만큼 실행합니다.
- INGRESSGATEWAY_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터의 노드입니다.
인그레스 게이트웨이 만들기
이 섹션의 안내를 따르기 전에 컨트롤 플레인 구현을 확인해야 합니다. 이렇게 하려면 컨트롤 플레인 구현 식별의 안내를 따르세요.
네임스페이스를 만듭니다. 이 네임스페이스는 인그레스 게이트웨이를 배포하는 데 사용됩니다.
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
네임스페이스의 삽입을 사용 설정합니다. 이 단계는 컨트롤 플레인 구현에 따라 다릅니다.
관리형(TD)
- 기본 삽입 라벨을 네임스페이스에 적용합니다.
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 컨트롤 플레인이 있는 기존 사용자: 기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입은 지원됩니다. 다음 안내를 따르세요.
다음 명령어를 실행하여 사용 가능한 출시 채널을 찾습니다.
kubectl -n istio-system get controlplanerevision
출력은 다음과 비슷합니다.
NAME AGE asm-managed-rapid 6d7h
참고: 위 목록에 두 개의 컨트롤 플레인 버전이 표시되면 하나를 삭제합니다. 클러스터에 여러 컨트롤 플레인 채널을 두는 방식은 지원되지 않습니다.
출력에서
NAME
열 아래의 값은 Cloud Service Mesh 버전에 사용 가능한 출시 채널에 해당하는 버전 라벨입니다.네임스페이스에 버전 라벨을 적용합니다.
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
기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입이 지원됩니다. 다음 안내를 따르세요.
다음 명령어를 사용하여
istiod
에서 버전 라벨을 찾습니다.kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
네임스페이스에 버전 라벨을 적용합니다. 다음 명령어에서
REVISION_LABEL
은 이전 단계에서 확인한istiod
버전 라벨의 값입니다.kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
인그레스 게이트웨이 매니페스트 파일을 적용합니다.
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
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)"
[선택사항] 인그레스 게이트웨이 노드 라벨 어피니티에 대한
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
포트 정보 가져오기
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}')
NodePorts
를 표시합니다.echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT} echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT} echo STATUS_PORT=${STATUS_PORT}
외부 부하 분산기 구성
이전 단계에 표시된 NodePorts
를 사용하여 외부 부하 분산기와 인그레스 게이트웨이 간의 연결을 구성합니다.
부하 분산기 구성에서 상태 점검을 구성합니다.
hosts: CLUSTER_NODE_IP Protocol: HTTP Port: STATUS_PORT Path: /healthz/ready
CLUSTER_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터에 있는 노드의 IP 주소입니다. 이 IP 주소는 외부 부하 분산기에서 연결할 수 있어야 합니다. 이 구성은 클러스터 노드당 한 번씩 여러 번 설정해야 할 수 있습니다.
STATUS_PORT: 인그레스 게이트웨이의 상태 API가 노출되는
NodePort
입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.
HTTP
및HTTPS
트래픽을 라우팅하도록 부하 분산기에서 노드 풀을 구성합니다. 포트 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
입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.
설정을 확인하려면 부하 분산기의 상태 점검을 통과했는지 확인합니다.
다음 단계
- 게이트웨이 설치 및 업그레이드에 대해 자세히 알아보기