GKE Autopilot 클러스터에서 Cloud Service Mesh 프로비저닝


이 가이드에서는 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 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

Cloud Shell에는 kubectl, gcloud CLI, Helm, Terraform 등 이 튜토리얼에 필요한 소프트웨어가 사전 설치되어 있습니다. Cloud Shell을 사용하지 않는 경우에는 gcloud CLI를 설치해야 합니다.

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. 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.

  4. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  5. 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

  1. 환경 변수를 설정합니다.

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    
  2. 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

  1. Fleet의 구성원으로 등록된 클러스터를 만듭니다.

    gcloud container clusters create-auto asm-cluster \
        --location="us-central1" \
        --enable-fleet
    
  2. 클러스터가 Fleet에 등록되어 있는지 확인합니다.

    gcloud container fleet memberships list
    

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

    NAME: asm-cluster
    EXTERNAL_ID: 
    LOCATION: us-central1
    

    Cloud Service Mesh를 구성하는 데 필요하므로 멤버십 이름을 기록해 둡니다.

Terraform

GKE 클러스터를 만들려면 google_container_cluster 리소스를 사용하면 됩니다. 클러스터가 생성될 때 Fleet에 추가되도록 fleet 블록을 설정합니다.

resource "google_container_cluster" "cluster" {
  name                = "asm-cluster"
  location            = var.region
  deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters

  enable_autopilot = true
  fleet {
    project = data.google_project.project.name
  }
}

data "google_project" "project" {}

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

관리형 Cloud Service Mesh 프로비저닝

클러스터에 대한 Fleet 멤버십의 servicemesh 기능을 사용하여 관리형 Cloud Service Mesh를 프로비저닝합니다.

gcloud

  1. 프로젝트에서 Cloud Service Mesh Fleet 기능을 사용 설정합니다.

    gcloud container fleet mesh enable
    
  2. 메시 자동 관리를 사용 설정합니다.

    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_featuregoogle_gke_hub_feature_membership 리소스를 사용하여 클러스터에 관리형 Cloud Service Mesh를 구성합니다.

resource "google_project_service" "mesh_api" {
  service = "mesh.googleapis.com"

  disable_dependent_services = true
}

resource "google_gke_hub_feature" "feature" {
  name     = "servicemesh"
  location = "global"

  depends_on = [
    google_project_service.mesh_api
  ]
}

resource "google_gke_hub_feature_membership" "feature_member" {
  location   = "global"
  feature    = google_gke_hub_feature.feature.name
  membership = google_container_cluster.cluster.fleet.0.membership
  membership_location = google_container_cluster.cluster.location
  mesh {
    management = "MANAGEMENT_AUTOMATIC"
  }
}

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

컨트롤 플레인이 활성 상태인지 확인

controlPlaneManagement.stateACTIVE가 될 때까지 기다립니다. 최대 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 컨트롤 플레인에 의해 자동으로 업그레이드될 수 있게 합니다.

  1. 클러스터에 액세스할 수 있도록 사용자 인증 정보를 다운로드합니다.

    gcloud container clusters get-credentials asm-cluster --location=us-central1
    
  2. 게이트웨이 배포를 위한 네임스페이스를 만듭니다.

    kubectl create namespace bank-gateways
    
  3. Cloud Service Mesh 컨트롤 플레인이 배포에 게이트웨이 구성을 자동으로 삽입하도록 네임스페이스에 라벨을 추가합니다.

    kubectl label namespace bank-gateways istio-injection=enabled
    
  4. 네임스페이스에 인그레스 게이트웨이를 배포합니다.

    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 프로젝트는 성능 및 확장성에 대한 정보를 게시합니다.

샘플 애플리케이션 배포

  1. 배포의 Kubernetes 네임스페이스를 만듭니다.

    kubectl create namespace bank-sample
    
  2. Cloud Service Mesh에서 사이드카 프록시를 샘플 포드에 자동으로 삽입하도록 네임스페이스에 라벨을 추가합니다.

    kubectl label namespace bank-sample istio-injection=enabled
    
  3. 샘플 애플리케이션 배포:

    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/
    
  4. 애플리케이션이 준비될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.

    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
    
  5. Istio GatewayVirtualService 리소스를 만들어 인그레스 게이트웨이 뒤에 있는 애플리케이션을 노출합니다.

    kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    
  6. 샘플 애플리케이션의 링크를 가져옵니다.

    INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  7. 브라우저에서 링크를 따라 샘플 애플리케이션을 엽니다. 애플리케이션을 보려면 기본 사용자 이름과 비밀번호로 로그인합니다.

상호 TLS 적용

STRICT 상호 TLS(mTLS) 모드가 사용 설정되어 있는지 확인합니다. istio-system 네임스페이스에 메시의 기본 PeerAuthentication 정책을 적용합니다.

  1. 다음 매니페스트를 mesh-peer-authn.yaml로 저장합니다.

    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
      namespace: "istio-system"
    spec:
      mtls:
        mode: STRICT
    
  2. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f mesh-peer-authn.yaml
    

특정 네임스페이스에서 PeerAuthentication 리소스를 만들어 이 구성을 재정의할 수 있습니다.

Cloud Service Mesh 대시보드 살펴보기

  1. Google Cloud 콘솔에서 Cloud Service Mesh로 이동하여 메시의 대시보드를 봅니다.

    Cloud Service Mesh로 이동

  2. 메뉴 바의 드롭다운 목록에서 프로젝트를 선택합니다.

    메시의 모든 마이크로서비스가 포함된 개요 테이블과 마이크로서비스 간의 연결을 그래픽으로 시각화한 표가 나타납니다. 이 테이블에서는 각 마이크로서비스에 대해 다음 3개의 SRE '골든 신호'를 보여줍니다.

    • 트래픽 - 초당 요청
    • 오류율 - 백분율
    • 지연 시간 - 밀리초

    이러한 측정항목은 마이크로서비스에서 처리하는 실제 트래픽을 기반으로 합니다. 지속적인 테스트 트래픽은 샘플 애플리케이션의 일부로 배포된 loadgenerator 클라이언트에서 frontend 서비스로 자동 전송됩니다. Cloud Service Mesh는 Google Cloud Observability에 측정항목, 로그, trace(선택사항)를 자동으로 전송합니다.

  3. 테이블에서 frontend 서비스를 클릭하여 서비스의 개요 대시보드를 확인합니다. 서비스에 대한 추가 측정항목과 인바운드 및 아웃바운드 연결 시각화를 확인할 수 있습니다. 또한 서비스에 대한 모니터링 및 알림을 위한 서비스 수준 객체(SLO)를 만들 수 있습니다.

mTLS가 사용 설정되어 있는지 확인

패널에서 보안 링크를 클릭하여 frontend 서비스의 보안 개요를 확인합니다. 테이블과 시각화에는 마이크로서비스 간의 인바운드 및 아웃바운드 연결 각각에 대해 녹색 자물쇠 아이콘이 표시됩니다. 이 아이콘은 연결이 인증 및 암호화에 mTLS를 사용하고 있음을 나타냅니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

이 가이드에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.

프로젝트 삭제

    Google Cloud 프로젝트를 삭제합니다.

    gcloud projects delete PROJECT_ID

개별 리소스 삭제

기존 프로젝트를 사용한 경우 삭제하지 않으려면 개별 리소스를 삭제합니다.

gcloud

  1. 샘플 애플리케이션과 게이트웨이를 삭제합니다.

    kubectl delete namespace bank-sample
    kubectl delete namespace bank-gateways
    
  2. 안내에 따라 Cloud Service Mesh를 제거합니다.

  3. GKE 클러스터를 삭제합니다.

    gcloud container clusters delete --region us-central1 asm-cluster --quiet
    

Terraform

Terraform으로 만든 리소스를 삭제합니다.

  terraform destroy

다음 단계