외부 부하 분산기를 사용하여 인그레스 게이트웨이 노출
개요
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 createdingressgateway서비스를 외부 부하 분산기 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/readyCLUSTER_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_PORTCLUSTER_NODE_IP: 인그레스 게이트웨이를 호스팅하는 Kubernetes 클러스터에 있는 노드의 IP 주소입니다. 이 IP 주소는 외부 부하 분산기에서 연결할 수 있어야 합니다. 이 구성은 클러스터 노드당 한 번씩 여러 번 설정해야 할 수 있습니다.
HTTP_INGRESS_PORT: 인그레스 게이트웨이의 HTTP 트래픽이 노출되는
NodePort입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.HTTPS_INGRESS_PORT: 인그레스 게이트웨이의 HTTPS 트래픽이 노출되는
NodePort입니다. 이전 단계에서 이 정보를 복사할 수 있습니다. 값은 클러스터의 모든 노드에서 동일합니다.
설정을 확인하려면 부하 분산기의 상태 점검을 통과했는지 확인합니다.
다음 단계
- 게이트웨이 설치 및 업그레이드에 대해 자세히 알아보기