이 가이드에서는 Google Kubernetes Engine(GKE) Autopilot 클러스터에서 관리형 Cloud Service Mesh를 설정하는 방법을 설명합니다. Cloud Service Mesh는 Istio 기반 완전 관리형 서비스 메시입니다.
이 튜토리얼에서는 기본 설정을 사용하여 단일 GKE Autopilot 클러스터에서 실행되는 프로덕션에 즉시 사용 가능한 서비스 메시를 구성하는 방법을 보여줍니다. 환경을 설계할 때 전체 Cloud Service Mesh 프로비저닝 가이드도 참조하는 것이 좋습니다.
GKE Autopilot에서 관리형 Cloud Service Mesh를 실행할 때의 이점
Autopilot 모드에서 GKE를 사용하면 Google이 클러스터 설정 및 관리를 자동으로 처리합니다. Autopilot 모드를 사용하면 클러스터 운영 환경이 간소화되고 애플리케이션에 집중할 수 있습니다. 관리형 Cloud Service Mesh도 같은 방식으로 몇 가지 단계에 따라 프로비저닝할 수 있는 완전 관리형 서비스 메시입니다.
istioctl
같은 클라이언트 측 도구 없이 Fleet API를 사용하여 관리형 Cloud Service Mesh를 프로비저닝합니다.- Cloud Service Mesh는 컨테이너에 승격된 권한을 부여할 필요 없이 워크로드에 사이드카 프록시를 자동으로 삽입합니다.
- 추가 구성 없이 메시 및 서비스에 대한 풍부한 대시보드를 보고 이러한 측정항목을 사용하여 서비스 수준 목표(SLO) 및 알림을 구성해 애플리케이션 상태를 모니터링할 수 있습니다.
- 관리형 Cloud Service Mesh 컨트롤 플레인은 최신 보안 패치와 기능을 사용 설정할 수 있도록 자동으로 업그레이드됩니다.
- Cloud Service Mesh 관리형 데이터 영역은 프록시 업그레이드 및 보안 패치가 사용 가능할 때 직접 서비스를 재시작할 필요가 없도록 워크로드의 사이드카 프록시를 자동으로 업그레이드합니다
- Cloud Service Mesh는 지원되는 제품으로 표준 오픈소스 Istio API를 사용하여 구성될 수 있습니다. 지원되는 기능을 참조하세요.
목표
- GKE Autopilot 클러스터 만들기
- Fleet API를 사용하여 관리형 Cloud Service Mesh 프로비저닝
- 전용 네임스페이스에 메시 인그레스 게이트웨이 배포
- 샘플 애플리케이션 배포
- 서비스 간 통신에 엄격한 상호 TLS(mTLS) 인증을 적용하도록 Cloud Service Mesh 구성
- Cloud Service Mesh 대시보드를 보고 서비스가 mTLS와 연결되어 있는지 확인
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
Cloud Shell에는 kubectl
, gcloud CLI, Helm, Terraform 등 이 튜토리얼에 필요한 소프트웨어가 사전 설치되어 있습니다. Cloud Shell을 사용하지 않는 경우에는 gcloud CLI를 설치해야 합니다.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Google 계정에 역할을 부여합니다. 다음 각 IAM 역할에 대해 다음 명령어를 한 번씩 실행합니다.
roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
PROJECT_ID
를 프로젝트 ID로 바꿉니다.EMAIL_ADDRESS
를 이메일 주소로 바꿉니다.ROLE
을 각 개별 역할로 바꿉니다.
환경 설정하기
gcloud CLI 또는 Terraform을 사용하여 환경을 설정할 수 있습니다.
gcloud
환경 변수를 설정합니다.
PROJECT_ID=PROJECT_ID gcloud config set project ${PROJECT_ID}
Mesh API를 사용 설정합니다.
gcloud services enable mesh.googleapis.com
mesh.googleapis.com을 사용 설정하면 다음 API가 사용 설정됩니다.
일부 필수 API는 다른 API에 임시 종속 항목을 갖습니다.API 목적 사용 중지할 수 있는가? meshconfig.googleapis.com
Cloud Service Mesh는 Mesh 구성 API를 사용하여 메시의 구성 데이터를 Google Cloud로 릴레이합니다. 또한 Mesh Configuration API를 사용 설정하면 Google Cloud 콘솔에서 Cloud Service Mesh 페이지에 액세스하고 Cloud Service Mesh 인증 기관을 사용할 수 있습니다. 아니요 meshca.googleapis.com
관리형 Cloud Service Mesh에서 사용하는 Cloud Service Mesh 인증 기관과 관련이 있습니다. 아니요 container.googleapis.com
Google Kubernetes Engine(GKE) 클러스터를 만드는 데 필요합니다. 아니요 gkehub.googleapis.com
메시를 Fleet으로 관리하는 데 필요합니다. 아니요 monitoring.googleapis.com
메시 워크로드에 대한 원격 분석을 캡처하는 데 필요합니다. 아니요 stackdriver.googleapis.com
서비스 UI를 사용하는 데 필요합니다. 아니요 opsconfigmonitoring.googleapis.com
Google Cloud 외부 클러스터에 서비스 UI를 사용하는 데 필요합니다. 아니요 connectgateway.googleapis.com
관리형 Cloud Service Mesh 컨트롤 플레인에서 메시 워크로드에 액세스할 수 있도록 하는 데 필요합니다. 예* trafficdirector.googleapis.com
가용성이 높고 확장 가능한 관리형 제어 영역을 사용 설정합니다. 예* networkservices.googleapis.com
가용성이 높고 확장 가능한 관리형 제어 영역을 사용 설정합니다. 예* networksecurity.googleapis.com
가용성이 높고 확장 가능한 관리형 제어 영역을 사용 설정합니다. 예*
Terraform
gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT
GKE 클러스터 만들기
Autopilot 모드로 GKE 클러스터를 만듭니다.
gcloud
Fleet의 구성원으로 등록된 클러스터를 만듭니다.
gcloud container clusters create-auto asm-cluster \ --location="us-central1" \ --enable-fleet
클러스터가 Fleet에 등록되어 있는지 확인합니다.
gcloud container fleet memberships list
출력은 다음과 비슷합니다.
NAME: asm-cluster EXTERNAL_ID: LOCATION: us-central1
Cloud Service Mesh를 구성하는 데 필요하므로 멤버십 이름을 기록해 둡니다.
Terraform
GKE 클러스터를 만들려면 google_container_cluster
리소스를 사용하면 됩니다. 클러스터가 생성될 때 Fleet에 추가되도록 fleet
블록을 설정합니다.
Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.
관리형 Cloud Service Mesh 프로비저닝
클러스터에 대한 Fleet 멤버십의 servicemesh
기능을 사용하여 관리형 Cloud Service Mesh를 프로비저닝합니다.
gcloud
프로젝트에서 Cloud Service Mesh Fleet 기능을 사용 설정합니다.
gcloud container fleet mesh enable
메시 자동 관리를 사용 설정합니다.
gcloud container fleet mesh update \ --management=automatic \ --memberships=MEMBERSHIP_NAME \ --location=us-central1
클러스터가 Fleet에 등록되었는지 확인한 후에는
MEMBERSHIP_NAME
을 나열된 멤버십 이름으로 바꿉니다.
Terraform
Mesh API를 사용 설정하려면 google_project_service
리소스를 사용하면 됩니다.
google_gke_hub_feature
및 google_gke_hub_feature_membership
리소스를 사용하여 클러스터에 관리형 Cloud Service Mesh를 구성합니다.
Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.
컨트롤 플레인이 활성 상태인지 확인
controlPlaneManagement.state
가 ACTIVE
가 될 때까지 기다립니다. 최대 15분이 걸릴 수 있습니다.
watch -n 30 gcloud container fleet mesh describe
출력은 다음과 비슷합니다.
membershipSpecs:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
mesh:
management: MANAGEMENT_AUTOMATIC
membershipStates:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
servicemesh:
controlPlaneManagement:
details:
- code: REVISION_READY
details: 'Ready: asm-managed'
state: ACTIVE
dataPlaneManagement:
details:
- code: PROVISIONING
details: Service is provisioning.
state: PROVISIONING
state:
code: OK
description: 'Revision(s) ready for use: asm-managed.'
Autopilot 클러스터는 워크로드를 배포할 때까지 노드를 프로비저닝하지 않으므로 dataPlaneManagement
섹션은 인그레스 게이트웨이를 배포할 때까지 PROVISIONING
상태로 유지됩니다.
메시 인그레스 게이트웨이 배포
이 섹션에서는 샘플 애플리케이션의 수신 트래픽을 처리할 메시 인그레스 게이트웨이를 배포합니다. 인그레스 게이트웨이는 메시의 에지에서 작동하는 부하 분산기로, 수신 또는 발신되는 HTTP/TCP 연결을 수신합니다.
게이트웨이를 전용 네임스페이스로 배포하고 배포 라벨을 지정하여 게이트웨이가 안전하게 관리되고 Cloud Service Mesh 컨트롤 플레인에 의해 자동으로 업그레이드될 수 있게 합니다.
클러스터에 액세스할 수 있도록 사용자 인증 정보를 다운로드합니다.
gcloud container clusters get-credentials asm-cluster --location=us-central1
게이트웨이 배포를 위한 네임스페이스를 만듭니다.
kubectl create namespace bank-gateways
Cloud Service Mesh 컨트롤 플레인이 배포에 게이트웨이 구성을 자동으로 삽입하도록 네임스페이스에 라벨을 추가합니다.
kubectl label namespace bank-gateways istio-injection=enabled
네임스페이스에 인그레스 게이트웨이를 배포합니다.
Helm
helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update helm install --wait --namespace bank-gateways \ --set resources.requests.cpu=250m \ --set resources.requests.memory=512Mi \ --set resources.requests.ephemeral-storage=1Gi \ --set resources.limits.cpu=250m \ --set resources.limits.memory=512Mi \ --set resources.limits.ephemeral-storage=1Gi \ istio-ingressgateway istio/gateway
kubectl
kubectl apply -n bank-gateways \ -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway kubectl -n bank-gateway wait "deployment/istio-ingressgateway" \ --for=condition=available --timeout=240s
프로덕션 환경에 배포할 때는 적절한 리소스 요청을 설정했는지 확인하세요. GKE Autopilot은
limits
가 아닌requests
에 설정된 리소스 값만 고려합니다. Istio 프로젝트는 성능 및 확장성에 대한 정보를 게시합니다.
샘플 애플리케이션 배포
배포의 Kubernetes 네임스페이스를 만듭니다.
kubectl create namespace bank-sample
Cloud Service Mesh에서 사이드카 프록시를 샘플 포드에 자동으로 삽입하도록 네임스페이스에 라벨을 추가합니다.
kubectl label namespace bank-sample istio-injection=enabled
샘플 애플리케이션 배포:
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
애플리케이션이 준비될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
watch kubectl -n bank-sample get pods
애플리케이션이 준비되었으면 출력이 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE accounts-db-0 2/2 Running 0 2m16s balancereader-5c695f78f5-x4wlz 2/2 Running 0 3m8s contacts-557fc79c5-5d7fg 2/2 Running 0 3m7s frontend-7dd589c5d7-b4cgq 2/2 Running 0 3m7s ledger-db-0 2/2 Running 0 3m6s ledgerwriter-6497f5cf9b-25c6x 2/2 Running 0 3m5s loadgenerator-57f6896fd6-lx5df 2/2 Running 0 3m5s transactionhistory-6c498965f-tl2sk 2/2 Running 0 3m4s userservice-95f44b65b-mlk2p 2/2 Running 0 3m4s
Istio
Gateway
및VirtualService
리소스를 만들어 인그레스 게이트웨이 뒤에 있는 애플리케이션을 노출합니다.kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
샘플 애플리케이션의 링크를 가져옵니다.
INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"
브라우저에서 링크를 따라 샘플 애플리케이션을 엽니다. 애플리케이션을 보려면 기본 사용자 이름과 비밀번호로 로그인합니다.
상호 TLS 적용
STRICT 상호 TLS(mTLS) 모드가 사용 설정되어 있는지 확인합니다. istio-system 네임스페이스에 메시의 기본 PeerAuthentication
정책을 적용합니다.
다음 매니페스트를
mesh-peer-authn.yaml
로 저장합니다.apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: STRICT
클러스터에 매니페스트를 적용합니다.
kubectl apply -f mesh-peer-authn.yaml
특정 네임스페이스에서 PeerAuthentication
리소스를 만들어 이 구성을 재정의할 수 있습니다.
Cloud Service Mesh 대시보드 살펴보기
Google Cloud 콘솔에서 Cloud Service Mesh로 이동하여 메시의 대시보드를 봅니다.
메뉴 바의 드롭다운 목록에서 프로젝트를 선택합니다.
메시의 모든 마이크로서비스가 포함된 개요 테이블과 마이크로서비스 간의 연결을 그래픽으로 시각화한 표가 나타납니다. 이 테이블에서는 각 마이크로서비스에 대해 다음 3개의 SRE '골든 신호'를 보여줍니다.
- 트래픽 - 초당 요청
- 오류율 - 백분율
- 지연 시간 - 밀리초
이러한 측정항목은 마이크로서비스에서 처리하는 실제 트래픽을 기반으로 합니다. 지속적인 테스트 트래픽은 샘플 애플리케이션의 일부로 배포된
loadgenerator
클라이언트에서frontend
서비스로 자동 전송됩니다. Cloud Service Mesh는 Google Cloud Observability에 측정항목, 로그, trace(선택사항)를 자동으로 전송합니다.테이블에서
frontend
서비스를 클릭하여 서비스의 개요 대시보드를 확인합니다. 서비스에 대한 추가 측정항목과 인바운드 및 아웃바운드 연결 시각화를 확인할 수 있습니다. 또한 서비스에 대한 모니터링 및 알림을 위한 서비스 수준 객체(SLO)를 만들 수 있습니다.
mTLS가 사용 설정되어 있는지 확인
패널에서 보안 링크를 클릭하여 frontend
서비스의 보안 개요를 확인합니다.
테이블과 시각화에는 마이크로서비스 간의 인바운드 및 아웃바운드 연결 각각에 대해 녹색 자물쇠 아이콘이 표시됩니다. 이 아이콘은 연결이 인증 및 암호화에 mTLS를 사용하고 있음을 나타냅니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
이 가이드에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.
프로젝트 삭제
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
개별 리소스 삭제
기존 프로젝트를 사용한 경우 삭제하지 않으려면 개별 리소스를 삭제합니다.
gcloud
샘플 애플리케이션과 게이트웨이를 삭제합니다.
kubectl delete namespace bank-sample kubectl delete namespace bank-gateways
안내에 따라 Cloud Service Mesh를 제거합니다.
GKE 클러스터를 삭제합니다.
gcloud container clusters delete --region us-central1 asm-cluster --quiet
Terraform
Terraform으로 만든 리소스를 삭제합니다.
terraform destroy