이 튜토리얼은 Istio 서비스 메시를 사용하여 Kubernetes 서비스를 안전하게 배포하고 상호 TLS(mTLS) 통신을 사용 설정하려는 Kubernetes 사용자 및 관리자를 대상으로 작성되었습니다.
Istio 및 Cloud Service Mesh
Istio는 지원되는 Google 제품이 아닙니다. 대신 관리형 Cloud Service Mesh를 실행하는 것이 좋습니다. 자세한 내용은 GKE Autopilot 클러스터에서 Cloud Service Mesh 프로비저닝을 참조하세요.
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 클러스터 만들기
istioctl
명령줄 도구를 사용하여 Istio를 설치하기- 상호 TLS(mTLS) 인증을 테스트하기 위해 샘플 애플리케이션 배포하기
PeerAuthentication
커스텀 리소스를 사용하여 서비스 간 통신에 mTLS 인증을 사용하도록 Istio를 구성하기- Kiali 대시보드를 사용하여 mTLS 인증 확인하기
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
Cloud Shell에는 kubectl
, gcloud CLI, 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.
-
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- 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.
-
-
Enable the GKE API:
gcloud services enable container.googleapis.com
-
Google 계정에 역할을 부여합니다. 다음 각 IAM 역할에 대해 다음 명령어를 한 번씩 실행합니다.
roles/container.clusterAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
PROJECT_ID
를 프로젝트 ID로 바꿉니다.EMAIL_ADDRESS
를 이메일 주소로 바꿉니다.ROLE
을 각 개별 역할로 바꿉니다.
환경 준비
환경을 설정하려면 다음 단계를 수행합니다.
환경 변수를 설정합니다.
export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID gcloud config set compute/region us-central1
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.GitHub 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
작업 디렉터리로 변경합니다.
cd kubernetes-engine-samples/service-mesh/istio-tutorial
GKE 클러스터 만들기
Istio에 필요한 Linux 기능(NET_RAW
및 NET_ADMIN
)을 사용 설정하세요.
GKE Autopilot은 기본적으로 NET_ADMIN
을 허용하지 않지만 GKE 버전 1.27 이상에서는 --workload-policies=allow-net-admin
명령어를 사용하여 NET_ADMIN
을 사용 설정할 수 있습니다.
gcloud container clusters create-auto istio-cluster \
--location="us-central1" \
--workload-policies="allow-net-admin"
GKE Autopilot 보안에 대한 자세한 내용은 기본 제공 보안 기능 구성을 참조하세요.
Istio 설치
Istioctl을 사용하여 GKE 클러스터에 Istio를 설치할 수 있습니다.
이 튜토리얼에서는 프로덕션 배포에 권장되는 기본 구성 프로필로 Istio를 설치합니다.
Istio를 설치합니다.
export ISTIO_VERSION=1.20.2 curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
istioctl
명령줄 도구를 PATH에 추가합니다.cd istio-${ISTIO_VERSION} export PATH=$PWD/bin:$PATH
클러스터에 Istio를 설치합니다.
istioctl install --set profile="default" -y
이 단계는 몇 분이 걸릴 수 있습니다.
Istio 포드가 준비될 때까지 기다립니다.
watch kubectl get pods -n istio-system
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE istio-ingressgateway-5c47bff876-wjm96 1/1 Running 0 2m54s istiod-5fc7cb65cd-k8cp4 1/1 Running 0 2m57s
Istio 포드가
Running
이면Ctrl+C
를 눌러 명령줄로 돌아갑니다.
샘플 애플리케이션 배포
이 섹션에서는 Bank of Anthos 샘플 애플리케이션을 사용하여 mTLS 인증으로 서비스 메시를 만듭니다.
Istio에서 Envoy 사이드카 프록시의 자동 삽입을 사용 설정하도록 지시하는 네임스페이스 라벨을 추가합니다.
kubectl label namespace default istio-injection=enabled
샘플 애플리케이션 배포:
cd .. git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -f bank-of-anthos/kubernetes-manifests/
다음과 같이 애플리케이션이 준비될 때까지 기다립니다.
watch kubectl 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
포드가
Running
이면Ctrl+C
를 눌러 명령줄로 돌아갑니다.다음 매니페스트를 검토합니다.
이 매니페스트에서는 애플리케이션을 노출하고 Istio를 인그레스 컨트롤러로 사용하는 Istio 게이트웨이 및 VirtualService 리소스를 설명합니다.
매니페스트를 클러스터에 적용합니다.
kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
mTLS 구성
상호 TLS(mTLS) 인증은 Istio에서 기본적으로 사용 설정됩니다. 즉, Istio는 Istio 프록시로 마이그레이션된 서버 워크로드를 모니터링하고 자동으로 클라이언트 프록시를 구성하여 이러한 워크로드와 mTLS 연결을 설정합니다. 또한 Istio는 사이드카 프록시가 없는 워크로드에 연결할 때 mTLS를 사용하지 않도록 클라이언트 프록시를 구성합니다.
Istio는 세 가지 모드에서 작동하도록 mTLS를 구성할 수 있습니다.
PERMISSIVE
: 워크로드가 mTLS와 일반 텍스트 트래픽을 모두 허용합니다.STRICT
: 워크로드가 mTLS 트래픽만 허용합니다.DISABLE
: mTLS가 사용 중지됩니다. 자체 보안 솔루션을 사용하려면 이 모드를 사용하세요.
전역적으로, 네임스페이스별로 또는 워크로드별로 mTLS 구성을 적용할 수 있습니다. 이 튜토리얼에서는 STRICT
mTLS 모드를 사용하여 네임스페이스별로 구성을 적용합니다.
다음 매니페스트를 검토합니다.
이 매니페스트에서는 피어 인증 Istio 커스텀 리소스를 설명합니다.
매니페스트를 클러스터에 적용합니다.
kubectl apply -f peer-authentication.yaml
Istio의 mTLS에 대한 자세한 내용은 상호 TLS 인증을 참조하세요.
mTLS가 사용 설정되어 있는지 확인
Kiali는 마이크로서비스 환경에 대한 그래픽 뷰를 제공하는 Istio 서비스 메시용 웹 기반 관측 가능성 대시보드로, 이를 통해 애플리케이션을 모니터링하고 문제를 해결할 수 있습니다. Kiali를 사용하여 Istio 서비스 메시에서 mTLS 인증이 사용 설정되어 올바르게 작동하는지 확인할 수 있습니다. Kiali에는 원격 분석 데이터 소스로 Prometheus가 필요합니다. 이 튜토리얼에서는 Google Cloud Managed Service for Prometheus가 사용됩니다.
쿼리 인터페이스 설치
roles/monitoring.viewer
로 IAM 서비스 계정을 만들어 쿼리 인터페이스에서 측정항목에 액세스할 수 있도록 허용합니다.gcloud iam service-accounts create monitoring \ --display-name="Service account for query interface" gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding \ monitoring@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"
Kubernetes 네임스페이스를 만듭니다.
kubectl create namespace monitoring
네임스페이스의 기본 Kubernetes 서비스 계정에 주석을 달아 GKE용 워크로드 아이덴티티 제휴를 구성합니다.
kubectl annotate serviceaccount -n monitoring default \ iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwrite
쿼리 인터페이스 워크로드를 배포합니다.
kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
다음 매니페스트를 검토합니다.
이 매니페스트에서는 Istio 및 Envoy 프록시 측정항목을 수집하는
PodMonitoring
리소스를 설명합니다.매니페스트를 클러스터에 적용합니다.
kubectl apply -f pod-monitorings.yaml
샘플 애플리케이션의 링크를 가져옵니다.
INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"
링크를 열어 샘플 애플리케이션을 확인합니다. 기본 사용자 이름과 비밀번호로 로그인하여 마이크로서비스 간 트래픽을 생성합니다.
Kiali 설치
Kiali Operator를 사용하여 Kiali를 설치하는 것이 좋습니다.
Kiali Operator 설치:
helm repo add kiali https://kiali.org/helm-charts helm repo update helm install \ --namespace kiali-operator \ --create-namespace \ kiali-operator \ kiali/kiali-operator
다음 매니페스트를 검토합니다.
이 매니페스트에서는 Kiiali 서버를 정의하는 Operator 커스텀 리소스를 설명합니다.
매니페스트를 클러스터에 적용합니다.
kubectl apply -f kiali.yaml
Kiali 서버가 준비될 때까지 기다립니다.
watch kubectl get pods -n istio-system
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE istio-ingressgateway-6845466857-92zp8 1/1 Running 0 9m11s istiod-6b47d84cf-4cqlt 1/1 Running 0 12m
포드가
Running
이면Ctrl+C
를 눌러 명령줄로 돌아갑니다.대시보드에 액세스하도록 Kiali 서버 서비스에서 포트 전달을 설정합니다.
kubectl -n istio-system port-forward svc/kiali 8080:20001
웹 미리보기를 엽니다. Kiali에서 그래프 섹션으로 이동하고 디스플레이 드롭다운에서 보안 옵션을 선택합니다. 이 뷰에는 그래프에 있는 각 노드의 보안 상태가 표시됩니다. mTLS가 사용 설정됨 배지가 있는 노드는 해당 서비스에 mTLS가 사용 설정되었음을 나타내고 해당 배지가 없는 노드는 mTLS가 사용 설정되지 않았음을 나타냅니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
개별 리소스 삭제
기존 프로젝트를 사용한 경우 삭제하지 않으려면 개별 리소스를 삭제합니다.
Kiali를 삭제합니다.
kubectl -n istio-system delete kiali kiali helm uninstall --namespace kiali-operator kiali-operator
모니터링 리소스를 삭제합니다.
kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
샘플 애플리케이션을 삭제합니다.
kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml kubectl delete -f bank-of-anthos/kubernetes-manifests
Istio를 제거합니다.
istioctl uninstall --purge -y
GKE 클러스터를 삭제합니다.
gcloud container clusters delete --region us-central1 istio-cluster --quiet
다음 단계
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터를 살펴보세요.