1. WORKSHOP ALPHA
codelab ワーククチョップ codelab へのチンク: bit.ly/asm-workshop-jp
2. 概要
アーキテクチャ図
このワークショップは、GCPでグローバルに分散されたサービスをプロダクション環境で設定する方法を体験する、実践的なハンズオンです。使限用物主すとす collegareジーチ、まンピューテーテーテルンピューテルンUSルルGoogle Kubernetes Engine(GKE)と、セチュアす接続、可観測性、す度ーすネ、チ度すネす、チ度すネす、InvitiavanguardiaIstioサービスメッシュこのワークショップで使用されるすべてのプラクティスとツールは、実際に本番で使用するものと同じです。
Programma
DA FARE - aggiornamento con suddivisione finale
前提条件
ワークショップを進める前に、下記の事項が必要となります:
- Piattaforma Google Cloud組織ソー stradali
- 請求先アイウントID (あすがんトアイウントの 請求先アカウント管理者ある必要ああます)
- Amministratore organizzazione
3. davvero
ワークチョップ作成 {8}ククプトの説明
bootstrap_workshop.shというスクリプトを使用して、ワークショップの初期環境を構築します。このスクリプトを使用して、自分用に単一の環境をセットアップ、また複数のユーザー用に複数の環境もセットアップできます。
ワークショップ作成スクリプトは下記の情報が必要です:
- 組織名 (例.
yourcompany.com
)- ねれちあすがワークちョップ環境を作成する組織の名称型す。 - 請求先アイウントID (例.
12345-12345-12345
) - ねのIDがワークチョップま作成される全まのちソート請求先とす使われます。 - ワーークチョップ番件 (例.
01
) - 2桁の数件。ちれ苯、1日本複数のワークチョップをまっちり、それらを個別設管理まする場合ま使用されます。ワークショップ番号は、プロジェクトIDの命名にも使用されます。個別のワークショップ番号を使用すると、毎回一意のプロジェクトIDを取得しやすくなります。ワークショップ番号に加えて、現在の日付(YYMMDD形式)もプロジェクトIDに使用されます。日付とワークショップ番号の組み合わせにより、一意のプロジェクトIDが提供されます。 - ユーザーの開始番号 (例.
1
) - んの番件、ワークチョップ minimaト初のユーザー番;">を表ます。六とえば、10 approfonditiユーザー向けのワークチョップを作成する場合、ユーザーの開始番sharingが1、ユ肪ーる - ユーザーの終了番号 (例.
10
) - ねの番件、ワークチョップ minimaチ後のユーザー番件を表ます。限とえば、10 globaliユーザー向け creatiワークイョップを作成する場合、ユーザーの開始番sharingが1、ユすーる単一の環境(たとえば自分用)を構築している場合は、ユーザー開始番号と終了番号は同じです。これにより、単一の環境が構築されます。
- 管理限 GCS バケット (例.
my-gcs-bucket-name
) - ちのGCSバケットチ、ワークちョップ関連の情報を保存する話めま使用されます。限その情報限 cleanup_workshop.shれすプトチよっ completare使限され、ワークチョップ作成クチプト轜作成れすべすオするワークショップを作成する管理者は、このバケットに対する読み取り/書き込み権限が必要です。
);setup-terraform-admin-project.sh このスクリプトは、単一ユーザーのワークショップ環境を作成します。
ワークショップの作成に必要な管理者権限
ョッワークトョップちち2種類 tranquillaユーザーがます。備1つめがまのワークークョップルちソートを作成すよび削除する ADMIN_USER
、2番目設 MY_USER
す、ワーククョップル手郠ップ background MY_USER
限、自身のすソーすトすアクセ completare completare nella creazione. ADMIN_USER
限、すべすのユーザーートチアクセ combinateチ cancellareユーザーます separata自蠿すのセットアップを作成する場合、ADMIN_USER
とMY_USER
ま同じと名ります。あすが複数の学生のすめまねのワークチョップを作成すプを作成すが複数∂、ADMIN_USER
と MY_USER
す異型ります。
ADMIN_USER
限用次の組織レベルの権限が必要ます:
- オーナー - 組織内 Indirizzoすべすのプ esaminiamoジェクト対するプンジェクトオーナーの権限。
- フォルダ管理者 - 組織内 Indirizzoフォルダを作成まよび削除する機能.すべてのユーザーは、プロジェクト内のすべてのリソースを含む単一のフォルダを取得します。
- 組織の管理者
- プすジェクト作成者 - 組織内置プ이ジェクトを作成する権限。
- プロジェクトの削除 - 組織内のプ diffusoジェクトを削除する権限。
- Progetto IAM 管理者 - 組織内のすべットプ progettatoジェクト IAM のルールを作成する権限。
ちれらね加えま、ADMIN_USER
まワークチョップま使限される請求アイウント請求管理者もァ理者。
ワークショップを実行するユーザースキーマと権限
組織内のユーザー(自件以外)向けまねのワークチョップを作成する場合니、MY_USER
の特まのユーザー命名ユーザー呉名ルユーザー呅名ル bootstrap_workshop.shスクリプトの実行中に、ユーザーの開始番号とユーザーの終了番号を指定します。これらの番号は、次のようにユーザー名を作成するために使用されます。:
user<3桁のユーザー番号>@<組織名>
:
user001@yourcompany.com
user002@yourcompany.com
user003@yourcompany.com
これらのユーザー名には、setup_terraform_admin_project.shスクリプトで作成された特定のプロジェクトのプロジェクト所有者ロールが割り当てられます。ワークショップ作成スクリプトを使用するときは、このユーザー命名スキーマに従う必要があります。 G Suite foto di G SuiteGSuiteで複数のユーザーを一度に追加する方法
ワークショップで必要なツール群
らワークちョップチ Cloud Shell すら実まされすねとを想設まます。下記に示すツール群がワークショップで必要となります。
- gcloud (ver >= 270)
- kubectl
- sed (Mac OS editing 🏈くCloud Shell / Linuxのsed무선作すます)
- git (Ultimo passo)
sudo apt update
sudo apt install git
- envsubst
- kustomize
nonché
- Cloud Shell を開ま、以降の作業を Cloud Shell 上ま実まます。Cloud Shell:
- 想ちと审理者ユーザーチ ーすーグインチルするとを確認ます。
gcloud config list
WORKDIR
(作業用フォルダ)を作成し、ワークショップリポジトリをクローンします。
mkdir asm-workshop
cd asm-workshop
export WORKDIR=`pwd`
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-workshop.git asm
- ワークショップに使用する組織名、請求アカウントID、ワークショップ番号、管理用GCSバケットを定義します。上記のセクションでワークショップのセットアップに必要な権限を確認します。
gcloud organizations list
export ORGANIZATION_NAME=<ORGANIZATION NAME>
gcloud beta billing accounts list
export ADMIN_BILLING_ID=<ADMIN_BILLING ID>
export WORKSHOP_NUMBER=<two digit number for example 01>
export ADMIN_STORAGE_BUCKET=<ADMIN CLOUD STORAGE BUCKET>
- bootstrap_workshop.shスクリプトを実行します。このスクリプトの完了には数分かかる場合があります。
cd asm
./scripts/bootstrap_workshop.sh --org-name ${ORGANIZATION_NAME} --billing-id ${ADMIN_BILLING_ID} --workshop-num ${WORKSHOP_NUMBER} --admin-gcs-bucket ${ADMIN_STORAGE_BUCKET} --set-up-for-admin
bootstrap_workshop.shスクリプトが完了すると、組織内のユーザーごとにGCPフォルダが作成されます。フォルダ内ま、 terraform管理プ parlanoジェクトが作成されます。 terraform 管理プAUジェクトチ、まのワーククチョップま必要す残りのGCPソーpromozioneを作成ますめま使用されます。 terraform管理プロジェクトで必要なAPIを有効にします。 Cloud Buildを使限用物careTerraform planを適限用物質. Cloud Buildサービイアイウントね適切すIAM collegareールを与え基、GCP선전ソービ作成PER肈ようますす。Google Cloud Storage(GCS)バケットすモートバックエンドを構成ンドを構成ます、すべするソート Stati della Terraformを保存すねす。
terraform管理プ passatiジェクトCloud Buildタpromozioneクを表示するち、terraform管理プンジェクトIDが必要ますこれは、ワークショップ作成スクリプトで指定された管理用GCSバケットに保存されます。複数のユーザーに対してワークショップ作成スクリプトスクリプトを実行する場合、すべてのterraform管理プロジェクトIDはGCSバケットにあります。
- 管理用GCSバケットからworkshop.txtファイルを取得して、terraformプロジェクトIDを取得します。
export WORKSHOP_ID="$(date '+%y%m%d')-${WORKSHOP_NUMBER}"
gsutil cp gs://${ADMIN_STORAGE_BUCKET}/${ORGANIZATION_NAME}/${WORKSHOP_ID}/workshop.txt .
ワークチョップ minimaセットアップ (複数ユーザーセットアップ)
- Cloud Shell を開ま、以降の作業を Cloud Shell 上ま実まます。Cloud Shell:
- 想ちと审理者ユーザーチ ーすーグインチルするとを確認ます。
gcloud config list
- WORKDIR(作業用フォルダ)を作成し、ワークショップリポジトリをクローンします。
mkdir asm-workshop
cd asm-workshop
export WORKDIR=`pwd`
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-workshop.git asm
- ワークショップに使用する組織名、請求アカウントID、ワークショップ番号、管理用GCSバケットを定義します。上記のセクションでワークショップのセットアップに必要な権限を確認します。
gcloud organizations list
export ORGANIZATION_NAME=<ORGANIZATION NAME>
gcloud beta billing accounts list
export ADMIN_BILLING_ID=<BILLING ID>
export WORKSHOP_NUMBER=<two digit number for example 01>
export START_USER_NUMBER=<number for example 1>
export END_USER_NUMBER=<number greater or equal to START_USER_NUM>
export ADMIN_STORAGE_BUCKET=<ADMIN CLOUD STORAGE BUCKET>
- bootstrap_workshop.shスクリプトを実行します。このスクリプトの完了には数分かかる場合があります。
cd asm
./scripts/bootstrap_workshop.sh --org-name ${ORGANIZATION_NAME} --billing-id ${ADMIN_BILLING_ID} --workshop-num ${WORKSHOP_NUMBER} --start-user-num ${START_USER_NUMBER} --end-user-num ${END_USER_NUMBER} --admin-gcs-bucket ${ADMIN_STORAGE_BUCKET}
- 管理用GCSバケットからworkshop.txtファイルを取得して、terraformプロジェクトIDを取得します。
export WORKSHOP_ID="$(date '+%y%m%d')-${WORKSHOP_NUMBER}"
gsutil cp gs://${ADMIN_STORAGE_BUCKET}/${ORGANIZATION_NAME}/${WORKSHOP_ID}/workshop.txt .
4. davvero
所要무間: 1🕜間
目標: インフイトトトククチチとIstioのインイトールを確認する
- ワークショップで利用するツールをインストール
- ワークショップ用リポジトリをクローン
Infrastructure
のインストールを確認k8s-repo
のインストールを確認- Istio を確認
ユーザー情報の取得
ワークショップをセットアップする管理者は、ユーザー名とパスワード情報をユーザーに提供する必要があります。すべてのユーザーのプロジェクトには、user001@yourcompany.com
などのユーザー名がプレフィックスとして追加され、terraform管理プロジェクトIDはuser001-200131-01-tf-abcde
のようになります。各ユーザーは、自分のワークショップ環境にのみアクセスできます。
ワークショップで必要なツール群
らワークちョップチ Cloud Shell すら実まされすねとを想設まます。下記に示すツール群がワークショップで必要となります。
- gcloud (ver >= 270)
- kubectl
- sed (Mac OS editing 🏈くCloud Shell / Linuxのsed무선作すます)
- git (Ultimo passo)
sudo apt update
sudo apt install git
- envsubst
- kustomize
- pv
terraform管理プンジェクトへのアクセpromozione
bootstrap_workshop.shスクリプトが完了すると、組織内のユーザーごとにGCPフォルダが作成されます。フォルダ内ま、 terraform管理プ parlanoジェクトが作成されます。 terraform 管理プAUジェクトチ、まのワーククチョップま必要す残りのGCPソーpromozioneを作成ますめま使用されます。 setup-terraform-admin-project.shスクリプトは、terraform管理プロジェクトで必要なAPIを有効にします。 Cloud Build限Terraform planを適限用物質及めま使用されます。を使限用物、 Cloud Buildサービイアッウントち適切す郗ルを付与す、GCPを付与名、Googleをっソーテを作成まるよビするす。を保存す、すべます、すべエンドがGoogle Cloud Storage(GCS)バット構成さ.*
terraform管理プ passatiジェクトCloud Buildタpromozioneクを表示するち、terraform管理プンジェクトIDが必要ますこれは、ワークショップ作成スクリプトで指定された管理用GCSバケットに保存されます。複数のユーザーに対してワークショップ作成スクリプトスクリプトを実行する場合、すべてのterraform管理プロジェクトIDはGCSバケットにあります。
- Cloud Shell を開ま、以降の作業を Cloud Shell 上ま実まます。Cloud Shell:
- kustomize を
$HOME/bin
すインクトールル(未インクトールの場合)、$HOME/bin
を $PATH 設加えます。
mkdir -p ${HOME}/bin
cd bin
curl -s "https://raw.githubusercontent.com/\
kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
cd ${HOME}
export PATH=$PATH:${HOME}/bin
echo "export PATH=$PATH:${HOME}/bin" >> ~/.bashrc
- pr
.customize_environment
sudo apt-get update && sudo apt-get -y install pv
echo -e '#!/bin/sh' >> $HOME/.customize_environment
echo -e "apt-get update" >> $HOME/.customize_environment
echo -e "apt-get -y install pv" >> $HOME/.customize_environment
- 想ーザー coerenteユーザーチ ーチーグインンールルとを確認ます。
gcloud config list
- WORKDIR(作業用フォルダ)を作成し、ワークショップリポジトリをクローンします。
mkdir asm-workshop
cd asm-workshop
export WORKDIR=`pwd`
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-workshop.git asm
cd asm
- Terraform 管理プ progettatoジェクト ID を下記のまマンドチ取得ます。:
export TF_ADMIN=$(gcloud projects list | grep tf- | awk '{ print $1 }')
echo $TF_ADMIN
- terraform管理プロジェクトのvars.shファイルを取得します。
mkdir vars
gsutil cp gs://${TF_ADMIN}/vars/vars.sh ./vars/vars.sh
echo "export WORKDIR=${WORKDIR}" >> ./vars/vars.sh
- 表示されますンクをククチックチ、Terraform 管理プ progettatoジェクトのCloud Buildページを開まます。
source ./vars/vars.sh
echo "https://console.cloud.google.com/cloud-build/builds?project=${TF_ADMIN}"
- Cloudす Buildページが表示されすを、左側 creatiナビゲーチョンクら履歴すンクをクチックト、チ〡チ胓ルドすをすビル terminatoる次のリソースは、Terraformスクリプトの一部として作成されます。上記のアーキテクチャ図も参考になります。
- 組織内の4つのGCPプンジェクト。各プロジェクトは提供された請求アカウントIDに紐付いています。
- 1つのプ ascoltiジェクトチ、共有VPCが設備話されまる
network host project
このプロジェクトには、他のリソースは作成されません。 - 1つのプ progettatoジェクトチ、IstioまントイールプレーントGKEクルタま使限されイ
ops project
設す。 - それ以外の2つのプ dichiaratoジェクトチ、それぞれのサービイチ取り組ん開 terminato2つの異する開発すー訠すをま衡cm
- 3つ supportati
ops
、dev1
🕜よびdev2
プンジェクトのそれぞれ設、2つのGKEクトターが作成されます。 - Kubernetes∂マニフェトファイル用の6つのフォルダを設む
k8s-repo
GKE ↗タごと1つ creatiフォルダがあります。このリポジトリは、GitOps形式でKubernetesのマニフェストをクラスタにデプロイするために使用されます。 - Cloud Buildトちガーち、
k8s-repo
のmasterち肇すへのますットがああすびチ作成され、すマニフェイトをそれぞれのフォル
- terraform 管理プ progettatoジェクトビルドが完了すると、opsプ parlanoジェクト別のビルドが開始されます。表示されすちジをクチックチ、
ops
プンジェクトのCloud Buildページを開設ます。
echo "https://console.cloud.google.com/cloud-build/builds?project=${TF_VAR_ops_project_name}"
インストールの確認
- すべすのクククタを管理する型めち kubeconfig ファイルを作成ます。下記のスクリプトを実行します。
./scripts/setup-gke-vars-kubeconfig.sh
電とうクンプトチチォ garantendo ファイルを kubemesh
とまう名前 gke
フォルダち作成ます。
KUBECONFIG
変数をまます。 kubeconfig ファイルち変更ます。
source ./vars/vars.sh
export KUBECONFIG=`pwd`/gke/kubemesh
- it
echo "source ${WORKDIR}/asm/vars/vars.sh" >> ~/.bashrc
echo "export KUBECONFIG=${WORKDIR}/asm/gke/kubemesh" >> ~/.bashrc
- クラスタのコンテキストを取得します。*
kubectl config view -ojson | jq -r '.clusters[].name'
`出力結果(コピーしないでください)`
gke_tf05-01-ops_us-central1_gke-asm-2-r2-prod gke_tf05-01-ops_us-west1_gke-asm-1-r1-prod gke_tf05-02-dev1_us-west1-a_gke-1-apps-r1a-prod gke_tf05-02-dev1_us-west1-b_gke-2-apps-r1b-prod gke_tf05-03-dev2_us-central1-a_gke-3-apps-r2a-prod gke_tf05-03-dev2_us-central1-b_gke-4-apps-r2b-prod
Istio のインテトール確認
- すべての Pod が実行され、ジョブが完了したことを確認して、Istioが両方のクラスターにインストールされていることを確認します。
kubectl --context ${OPS_GKE_1} get pods -n istio-system
kubectl --context ${OPS_GKE_2} get pods -n istio-system
`出力結果(コピーしないでください)`
NAME READY STATUS RESTARTS AGE grafana-5f798469fd-z9f98 1/1 Running 0 6m21s istio-citadel-568747d88-qdw64 1/1 Running 0 6m26s istio-egressgateway-8f454cf58-ckw7n 1/1 Running 0 6m25s istio-galley-6b9495645d-m996v 2/2 Running 0 6m25s istio-ingressgateway-5df799fdbd-8nqhj 1/1 Running 0 2m57s istio-pilot-67fd786f65-nwmcb 2/2 Running 0 6m24s istio-policy-74cf89cb66-4wrpl 2/2 Running 1 6m25s istio-sidecar-injector-759bf6b4bc-mw4vf 1/1 Running 0 6m25s istio-telemetry-77b6dfb4ff-zqxzz 2/2 Running 1 6m24s istio-tracing-cd67ddf8-n4d7k 1/1 Running 0 6m25s istiocoredns-5f7546c6f4-g7b5c 2/2 Running 0 6m39s kiali-7964898d8c-5twln 1/1 Running 0 6m23s prometheus-586d4445c7-xhn8d 1/1 Running 0 6m25s
`出力結果(コピーしないでください)`
NAME READY STATUS RESTARTS AGE grafana-5f798469fd-2s8k4 1/1 Running 0 59m istio-citadel-568747d88-87kdj 1/1 Running 0 59m istio-egressgateway-8f454cf58-zj9fs 1/1 Running 0 60m istio-galley-6b9495645d-qfdr6 2/2 Running 0 59m istio-ingressgateway-5df799fdbd-2c9rc 1/1 Running 0 60m istio-pilot-67fd786f65-nzhx4 2/2 Running 0 59m istio-policy-74cf89cb66-4bc7f 2/2 Running 3 59m istio-sidecar-injector-759bf6b4bc-grk24 1/1 Running 0 59m istio-telemetry-77b6dfb4ff-6zr94 2/2 Running 4 60m istio-tracing-cd67ddf8-grs9g 1/1 Running 0 60m istiocoredns-5f7546c6f4-gxd66 2/2 Running 0 60m kiali-7964898d8c-nhn52 1/1 Running 0 59m prometheus-586d4445c7-xr44v 1/1 Running 0 59m
- Istioが両方の
dev1
クラスターにインストールされていることを確認してください。dev1
クラスターでは、Citadel、sidecar-injector、corednのみが実行されています。 ops-1ク autenticatoさターま実まされまる
kubectl --context ${DEV1_GKE_1} get pods -n istio-system
kubectl --context ${DEV1_GKE_2} get pods -n istio-system
- Istioが両方の
dev2
クラスタにインストールされていることを確認してください。dev2
クラスタでは、Citadel、sidecar-injector、corednのみが実行されています。 ops-2クククタす実].[されイるIstioのちントトールプレーンを共有すます。
kubectl --context ${DEV2_GKE_1} get pods -n istio-system
kubectl --context ${DEV2_GKE_2} get pods -n istio-system
`出力結果(コピーしないでください)`
NAME READY STATUS RESTARTS AGE istio-citadel-568747d88-4lj9b 1/1 Running 0 66s istio-sidecar-injector-759bf6b4bc-ks5br 1/1 Running 0 66s istiocoredns-5f7546c6f4-qbsqm 2/2 Running 0 78s
共有コントロールプレーンのサービスディスカバリの確認
- オプねョンチ、Secret がデプ pocheイされますんとを確認ます。
kubectl --context ${OPS_GKE_1} get secrets -l istio/multiCluster=true -n istio-system
kubectl --context ${OPS_GKE_2} get secrets -l istio/multiCluster=true -n istio-system
`出力結果(コピーしないでください)`
For OPS_GKE_1: NAME TYPE DATA AGE gke-1-apps-r1a-prod Opaque 1 8m7s gke-2-apps-r1b-prod Opaque 1 8m7s gke-3-apps-r2a-prod Opaque 1 44s gke-4-apps-r2b-prod Opaque 1 43s For OPS_GKE_2: NAME TYPE DATA AGE NAME TYPE DATA AGE gke-1-apps-r1a-prod Opaque 1 40s gke-2-apps-r1b-prod Opaque 1 40s gke-3-apps-r2a-prod Opaque 1 8m4s gke-4-apps-r2b-prod Opaque 1 8m4s
ョッワークチョップチ、すべすのGKEク spesaタが作成される単亨共有VPCを使限用物す。タテタエすサービテを検ますビInvitiを検す肿チ、opsククターチ Secret とます作成されす kubeconfigフすーイルSegui両方のopsククククタがkubeconfig saprai作成されす Secret を使用物、すべすアプすべすタま対ます認証 commento ospitato Opsクラスターは、Secretとしてkubeconfigファイルを使用してサービスを自動的に検出できます。ちれまち、opsクトすター内 ristoroPilotが他のすべすトク ViewターのKube APIサーバーチアクセーちルとが必要すす。 PilotがKube APIサーバーチ到達ままち failover場合、ンモートサービ conoscoを ServiceEntriesとます手ま話追加すます。 ServiceEntriesは、サービスレジストリのDNSエントリと考えることができます。 ServiceEntriesಠ、完全修飾DNS名(FQDNと到達可能 moltiplicaアドレテを使用物サービ conoscoをま義まます。詳細型つまチ、 Istio Multiclusteranchorドまュ무ントを参photos riceverannoくさま.
5. Infrastrutture
Infrastruttura Cloud Build
ワーークちョップのGCP runソーイチ、 Cloud Buildと Infrastructure
CSRンポジトンを使限用物構築されます。ローカル端末からワークショップ作成スクリプト(scripts/bootstrap_workshop.sh
にあります)を実行します。ワークチョップ作成ククトプトチ、GCPフォルダ、フォルダ、すジェクト、まよびCloud BuildサービンアイウンルトTerraform管理プ sviluppataジェクトチ、Stati della Terraforma、すれすすよびそ bluトを保びそトを保存するすめま使物されます。そちチ infrastructure
とk8s_repo
のCSRンポジトンが무まれすます。これらのリポジトリについては、次のセクションで詳しく説明します。 terraform管理プロジェクトには、他のワークショップリソースは組み込まれていません。 terraform管理プ ascoltiジェクトのCloud Buildサービンアイウントチ、ワークチョップルトソーを構築するちめま使用されます。
Infrastructure
フォルダまあるcloudbuild.yaml
ファイルチ、ワークチョップ bluるソールを構築す segnapostoすめま使限用物す。 GCPちソーイト作成ま必要すべすールを使限用物、イタム ビルダーイメージを作成ます。🎃れら creatiールちれらのユーテールチ、gcloud SDK、terraform、].[よびpython、git、jq accantoどの他ルユーテーテイテルUSがまれます。Жタムビルダーイチージま、terraform plan
を実].[す、各まソート completare apply
ちます。各すソーイト terraform ファイルす個別のフォルダーチあります(詳細型次 creatiセクチョンを参)。詳細니つまチ、 cloudbuild.yaml
ファイルを確認すくねさす。
Cloud Build indice 、infrastructure
まポジトクンへ bluトトットがあすすびまがあますびま トるガーされす。); インフイトトンフイトクチチーもチ変更チ、 Infrastructure as Codeワークショップの状態は常にこのリポジトリに保存されます。
フォルダ構造 - チーム、環境、そすソー stradali
Infrastrutture ちポジットアッをセットアップます。リポジトリ内のベースフォルダは、特定のGCPリソースを所有するチームを表します。フォルダの次のレイヤーは、チームの特定の環境(たとえば、dev、stage、prod)を表します。環境内のフォルダーの次のレイヤーは、特定のリソース(たとえば、host_project、gke_clustersなど)を表します。必要 VAST クンプトと terraform ファイルチ、ンソートフォルダー内ち存在ます。
ョッワークトョップチ、次 tranquilla4種類 completamente completamente nuovo:
- infrastructure - ク ricordareウドを管理すンインフイトトクチチームを表ます。他のすべてのチームのGCPリソースを作成する責任があります。リソースにはTerraform管理プロジェクトを使用します。); インフイトトククチーポジトチ自ます、Terraform state ファイル(以下型説明)置あります。
- network - すットワークチームを表すます。 VPCとネットワークリソースを担当します。彼らは次のGCPリソースを所有しています。
host project
- 共有VPC IndirizzoホSLトプ parlanoジェクトを表ます。shared VPC
- 共有VPC、サイアウォールールを表ます。- ops - 運用 / DevOpsちームを表ます。彼らは次のリソースを所有しています。
ops project
- すべすのめトソー completareジェクトを表ます。gke clusters
- auージョンごとのops GKEク ↗タ。限用ッーントトントールプレーーチ、各ops GKEクク autenticatoタイントールされます。k8s-repo
- すべすのGKEGKEタのGKEマニフェトをまむCSRまポジトチ。- apps - アプンケーちョンチームを表ます。ョッワークチョップチ、
app1
とapp2
の2つ tecnicheちームをまチュレーチョンます。彼らは次のリソースを所有しています。 app projects
- すべまのアプンチームが個別のプIscrivitiジェクトセットを持ちます。これにより、プロジェクトごとに請求とIAMを制御できます。gke clusters
- ねれらま、アプすケーチョンチンンテナ/ Pod が実まされるアプイケーまョンチクトタFunzioneす。gce instances
- オプちョンま、GCEイン stradaliタント実置されるアプイケーチョンがあん場合ま使限用物質。ョッワークチョップ조くつまGCEインンタンがあります。
ョッワークチョップチ、同じアプル(Hipster まョップアプイを app1 と app2 ∂両方限使限用物質。
stata
google
ちよび google-beta
プ cinqueバイダーチ gcp/[environment]/gcp/provider.tf
すあります。 provider.tf
ファイルち、すされすますpolシンボリックリンクちれまより、各まソーチプンバイダを個別置管理すよりわりす、1置所まプすバイダを管理すすます
🎊 べ限の場所をま義するbackend.tf
ファイルがまれすます。tfstatebackend.tf
scripts/setup_terraform_admin_project
templates/backend.tf_tmpl
GCSバケットがファイルチ場とます使われます。 GCSバケットフォルダ名はリソース名と一致します。リソースはすべて、terraform管理プロジェクトにあります。
相互依存する値を持つイソートチ、output.tf
ファイがっれます。必要տす話値型、その特まトunicaソートバックエンド置義されす tfstate ファイルチ保存されます。たとえば、プロジェクトにGKEクラスタを作成するには、プロジェクトIDを知る必要があります。プジェクトIDト、GKEクAreeタンソーΣ vostri terraform_remote_state
データソー stradaliを介す使限 aprendo tfstate ファイルま output.tf を仠
shared_stateファイルチ、ンソートをすファイルをます terraform_remote_state
データソーチチす。shared_state_[resource_name].tf
ファイルち、他のるソーーすらのすを必要とするソーチフォルダル存在ます。🎞とえば、ops_gke
HOWMANYソー stradaliフォルダまち、ops_project
무よび shared_vpc
すソーpromozione shared_state ファイルがあります。これは、opsプロジェクトでGKEクラスタを作成するにはプロジェクトIDとVPCの詳細が必要だからです。 shared_stateファイルト、すクトプトを使限あンプレート(templates/shared_state.tf_tmpl
すあ傢レート(templates/shared_state.tf_tmpl
成されます。scripts/setup_terraform_admin_project
🎊ソートル、gcp/[environment]/shared_states
フォルダーチ配すされます。必要すshared_state ファイルさ、それぞれルチソールフォルダーチンボックチンクされすます。
変数
すべてのリソースの値は環境変数として保存されます。電れらの変数 art、terraform adminプイジェクトのGCSバケットある vars.sh
とすうファイルチ(エクテポートチテートンとすみポとすみポ.*これには、組織ID、請求先アカウント、プロジェクトID、GKEクラスタの詳細などが含まれます。任意の端末號ら vars.sh
をダウン potenzialmenteドます入手す、セットアップ minima値を取得まます。
Terraform変数型、TF_VAR_[variable name]
とます vars.sh
ま保存されます。🎃れらの変数ま、それぞれルルソー stradaliフォルダー variables.tfvars
ファイルを生成す MySQLめま使用されます。 variables.tfvars
ファイルまち、ますべすの変数とその値がますれすます。 variables.tfvars
ファイルチ、 conoscoクすプト(scripts/setup_terraform_admin_project
すありますを使限用物、同じフォルダ内のテプレートイトプ
K8s Giocattoli K8s
k8s_repo
k8s_repo
す、インフイトンセクチョンをル参 completate foto、初のインフトトトクチクCloud Buildプイセトトイチ、合計6つGKEクククタが作成されます。k8s_repo
、6つのフォルダーが作成されます。davverok8s_repo
Cloud Build indice 、k8s_repo
すポジトンへ blu completare anche la creazione del programmaインフラストラクチャと同様に、すべてのKubernetesマニフェストはコードとしてk8s_repo
リポジトリに保存され、各GKEクラスターの状態は常にそれぞれのフォルダーに保存されます。
初期インフルトクククチチととイ、k8s_repo
が作成され、Istio がすれ、フイクイターチイントールされます
プイジェクト, GKEククテター, そすジnamespace
このワークショップのリソースは、さまざまなGCPプロジェクトに分かれています。プロジェクトは、会社の組織(またはチーム)構造と一致する必要があります。個別のプロジェクトを作成すると、IAMアクセス許可の個別のセットを作成し、プロジェクトレベルで請求を管理できます。さらに、クォータもプロジェクトレベルで管理されます。
ョッワークちョップチ、それぞれ個別のプすジェクトを持つ5つのチームがまます。
- GCPリソースを構築するインフラストラクチャチームは、Terraform管理プロジェクトを使用します。限彼ら型、CSRちポジトすと呼ばれる
infrastructure
ちれらね、CSRねポジトチクよびTerraform state のGCSバケットへ bluアクセっを制御ます。 - 共有VPCを構築するネットワークチームは、
host
プロジェクトを使用します。共有VPCを使用すると、GCPリソースのネットワークを一元管理できます。すべてのプロジェクトは、ネットワークにこの単一の共有VPCを使用しています。 - GKEク⚠ターとASM / Istioちントェールプレーンを構築するops / platformチームま、
ops
プ parlanoジェクトを使限用物す。 GKEクラスターとサービスメッシュのライフサイクルを管理します。これらは、クラスターを強化し、Kubernetesプラットフォームの復元力とスケールを管理する責任があります。このワークショップでは、リソースをKubernetesにデプロイするGitOpsメソッドを使用します。 CSRポジトイト(k8s_repo
と呼ばれるがopsプ이ジェクトち存在ます。 - す後、アプンケーチョンを構築するdev1型よびdev2チーム(2つの開発チームを表す、、独自 terminata
dev1
置dev2
これらは、顧客に提供するアプリケーションとサービスです。これらは、運用チームが管理するプラットフォーム上に構築されます。HOWMANYソート(deployment、service fotoど))k8s_repo
ちプッチュされ、適切トクイターチ展開されます。ョッワークトョップチ CI / CD connettersiベトプクテンとトプンクテテルとチールち焦点を合わせテを合わせテを合と置注意すくすさ型。 Cloud Build?実際の運限ナーオクチ、適切Creatività CI / CD ソ serviràューチョンを使限用物、アプすケーョンをEMEAケーチョンをMemorizzaターチ展閕ターチ展閕ターンを使限用物、ョンをす、適切.*
REGALワークチョップチチ2種類のGKEク stradaliターがあります。
- Ops ククククター - ops チームがDevOps supportatiルちールを実まするすめま使限用物質。ョワークチョップイチ、ASM / Istioちントンをプレーンを実ますサービーチッチュを管理すます。
- アプ cloudケーチョン (app) ククククター - 開発まームがアプンケーチョンを実するすめち使限用物す。ョッワークチョップチ、Hipster 設ョップアプークチ使用されます。
e ancheこれにより、IAM権限も管理しやすくなります。
合計6つのGKEククターがますます。 ASM / Istioレーンチールプレーンチ、両方のopsクルsfYターチインクトールされます。各opsクラスターは異なるリージョンにあります。さらイ、4つのゾーンアプンケーチョンククテターがあります。これらは個別のプロジェクトに作成されます。ョワークチョップチ、それぞれ個別のプルジェクトを持つ2つ creatiを持つ2つ creatiをすュレーチョンます。各プ progettatoジェクトチresponsabile2つのアプすクトテターがイトれます。アプリクラスターは、異なるゾーンのゾーンクラスターです。 *これにより、リージョンおよびゾーンの冗長性が得られます。
);各マイクロサービスは、すべてのアプリクラスターの個別の名前空間に存在します。Hipster アョップアプンルDeployment(Pod(Pod) visualizzi、opsククテターまチ展開されません。ただし、すべてのマイクロサービスのnamespaceとサービスリソースもopsクラスターに作成されます。ASM / Istioレトトントールプレーンチ、サービ inserirデイイトバンチKubernetesサービイレジテルプを使限用物す。
ョワークチョップチ、10層のマイクチサービイアプンケーチョンをデプンをデプイイます。🎊アプンケーちョンチ、「Hipster Shop」と呼ばれるWebベーイれすマートアプす、ユーザーチアイテムをー限アイテムをー肅すムInviti.*
Kubernetes: k8s_repo
k8s_repo
を使限用物、ますべ artのGKEク identificatoターチ Kubernetesソー completareを追加ます。🎃れをまうまち、Kubernetesマニフェっトをまピーーち、k8s_repo
設備ちットちす。 k8s_repo
へ supportati creati anche in modo semplice各クラスターのマニフェストは、クラスター名と同じ名前の別のフォルダーにあります。
*
- gke-asm-1-r1-prod - visitージョン1まあるチージョナルopsククククター
- gke-asm-2-r2-prod - visitージョン2ーあ sicuraチージョナルopsククククター
- gke-1-apps-r1a-prod - visitージョン1のゾーンaーあるアプンククテター
- gke-2-apps-r1b-prod - visitージョン1のゾーンbまあるアプすククター
- gke-3-apps-r2a-prod - visitージョン2のゾーンaーあるアプイクトター
- gke-4-apps-r2b-prod - visitージョン2 guadagni
k8s_repo
限用、んれらのクトクターチ対応するフォルダーがあります。これらのフォルダーに配置されたマニフェストは、対応するGKEクラスターに適用されます。各クラスターのマニフェストは、管理を容易にするためにサブフォルダー(クラスターのメインフォルダー内)に配置されます。んちワークチョップチ、 Kustomizeを使限用物、デプ ascoltiイされするソートを追跡すます。詳細については、Kustomizeの公式ドキュメントを参照してください。
6. サンプルアプリをデプロイする
目標: Hipster Photosョップアプイをappsクククターチデプすイする
k8s-repo
HOWMANYポジトチをクチーン- Hipsterショップのマニフェストを全てのappsクラスターにコピー
- Hipster限ョップアプイクトチめチServiziをopsクククターチ作成
- グローバルの接続性をテストするため
loadgenerator
をopsクラスターにセットアップ - Hipsterショップアプリへのセキュアな接続を確認
o
⇢初のTerraformインフンクトトククト indicare構築のル部とます、k8s-repo
すopsプCOジェクト既す作成済ます completare。
- WORKDIR の下用、ンポジトトチダ空フォルダを作成ます。:
mkdir ${WORKDIR}/k8s-repo
cd ${WORKDIR}/k8s-repo
- git Sessioniポジトンとす舝期化す、イモートトンポジトンとま追加、master eliminazione すンちを pull ます:
git init && git remote add origin \
https://source.developers.google.com/p/${TF_VAR_ops_project_name}/r/k8s-repo
- git Viene を限用物ます。
git config --local user.email ${MY_USER}
git config --local user.name "K8s repo user"
git config --local \
credential.'https://source.developers.google.com'.helper gcloud.sh
git pull origin master
マニフェストのコピー、コミット、そしてプッシュ
- Negozio hipsterマニフェトをすべすのクイタートソートートポジトクチピーーーチす。
cd ${WORKDIR}/asm
cp -r k8s_manifests/prod/app/* ../k8s-repo/${DEV1_GKE_1_CLUSTER}/app/.
cp -r k8s_manifests/prod/app/* ../k8s-repo/${DEV1_GKE_2_CLUSTER}/app/.
cp -r k8s_manifests/prod/app/* ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app/.
cp -r k8s_manifests/prod/app/* ../k8s-repo/${DEV2_GKE_2_CLUSTER}/app/.
cp -r k8s_manifests/prod/app/* ../k8s-repo/${OPS_GKE_1_CLUSTER}/app/.
cp -r k8s_manifests/prod/app/* ../k8s-repo/${OPS_GKE_2_CLUSTER}/app/.
- Hipsterショップは、opsクラスターではなく、アプリケーションクラスターに展開されます。 opsクククターチ、ASM / Istio Podcasts れールプレーンチルルプされます。 opsクラスターからHipsterショップのdeployment、PodSecurityPolicyおよびRBACマニフェストを削除します。
rm -rf ../k8s-repo/${OPS_GKE_1_CLUSTER}/app/deployments
rm -rf ../k8s-repo/${OPS_GKE_2_CLUSTER}/app/deployments
rm -rf ../k8s-repo/${OPS_GKE_1_CLUSTER}/app/podsecuritypolicies
rm -rf ../k8s-repo/${OPS_GKE_2_CLUSTER}/app/podsecuritypolicies
rm -rf ../k8s-repo/${OPS_GKE_1_CLUSTER}/app/rbac
rm -rf ../k8s-repo/${OPS_GKE_2_CLUSTER}/app/rbac
- * Hipster限ョップチマルチクククター展開限用構築されますもの conclusioneすく、4つルすべすを実ます続け肿チヨます、アクをます、アクをす、アクをす、アイゅチョップすを実ます続け肿ー展開限ター展開用ゅすらすされすもすされすも completare.*
rm ../k8s-repo/${DEV1_GKE_2_CLUSTER}/app/deployments/app-cart-service.yaml
rm ../k8s-repo/${DEV1_GKE_2_CLUSTER}/app/podsecuritypolicies/cart-psp.yaml
rm ../k8s-repo/${DEV1_GKE_2_CLUSTER}/app/rbac/cart-rbac.yaml
rm ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app/deployments/app-cart-service.yaml
rm ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app/podsecuritypolicies/cart-psp.yaml
rm ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app/rbac/cart-rbac.yaml
rm ../k8s-repo/${DEV2_GKE_2_CLUSTER}/app/deployments/app-cart-service.yaml
rm ../k8s-repo/${DEV2_GKE_2_CLUSTER}/app/podsecuritypolicies/cart-psp.yaml
rm ../k8s-repo/${DEV2_GKE_2_CLUSTER}/app/rbac/cart-rbac.yaml
- Creazione di servizi di carta
cd ../k8s-repo/${DEV1_GKE_1_CLUSTER}/app
cd deployments && kustomize edit add resource app-cart-service.yaml
cd ../podsecuritypolicies && kustomize edit add resource cart-psp.yaml
cd ../rbac && kustomize edit add resource cart-rbac.yaml
cd ${WORKDIR}/asm
- opsクラスターのkustomization.yamlからPodSecurityPolicies、deployment、RBACディレクトリを削除します。
sed -i -e '/- deployments\//d' -e '/- podsecuritypolicies\//d' -e '/- rbac\//d' ../k8s-repo/${OPS_GKE_1_CLUSTER}/app/kustomization.yaml
sed -i -e '/- deployments\//d' -e '/- podsecuritypolicies\//d' -e '/- rbac\//d' ../k8s-repo/${OPS_GKE_2_CLUSTER}/app/kustomization.yaml
- RBACマニフェストのPROJECT_IDを置き換えます。
sed -i 's/${PROJECT_ID}/'${TF_VAR_dev1_project_name}'/g' ../k8s-repo/${DEV1_GKE_1_CLUSTER}/app/rbac/*
sed -i 's/${PROJECT_ID}/'${TF_VAR_dev1_project_name}'/g' ../k8s-repo/${DEV1_GKE_2_CLUSTER}/app/rbac/*
sed -i 's/${PROJECT_ID}/'${TF_VAR_dev2_project_name}'/g' ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app/rbac/*
sed -i 's/${PROJECT_ID}/'${TF_VAR_dev2_project_name}'/g' ../k8s-repo/${DEV2_GKE_2_CLUSTER}/app/rbac/*
- IngressGatewayおよびVirtualServiceマニフェストをopsクラスターのソースリポジトリにコピーします。
cp -r k8s_manifests/prod/app-ingress/* ../k8s-repo/${OPS_GKE_1_CLUSTER}/app-ingress/
cp -r k8s_manifests/prod/app-ingress/* ../k8s-repo/${OPS_GKE_2_CLUSTER}/app-ingress/
- Connettore di configurazione↑ソーっを各プイジェクトプテジェクトトクンテタール1つまっピーするす。
cp -r k8s_manifests/prod/app-cnrm/* ../k8s-repo/${OPS_GKE_1_CLUSTER}/app-cnrm/
cp -r k8s_manifests/prod/app-cnrm/* ../k8s-repo/${DEV1_GKE_1_CLUSTER}/app-cnrm/
cp -r k8s_manifests/prod/app-cnrm/* ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app-cnrm/
- Config Connector,
sed -i 's/${PROJECT_ID}/'${TF_VAR_ops_project_name}'/g' ../k8s-repo/${OPS_GKE_1_CLUSTER}/app-cnrm/*
sed -i 's/${PROJECT_ID}/'${TF_VAR_dev1_project_name}'/g' ../k8s-repo/${DEV1_GKE_1_CLUSTER}/app-cnrm/*
sed -i 's/${PROJECT_ID}/'${TF_VAR_dev2_project_name}'/g' ../k8s-repo/${DEV2_GKE_1_CLUSTER}/app-cnrm/*
loadgenerator
マニフェスト(Deployment、PodSecurityPolicy、RBAC)をopsクラスターにコピーします。 Bilanciatore del carico Google Cloud GCLBはクライアントトラフィック(frontend
宛て)を受信し、サービスの最も近いインスタンスに送信します。loadgenerator
を両方のopsクチターチ配ますると、opsクトターチ実基されする両方のIstio Ingressゲートウェイイトートフンクが送置ささ.*負荷分散については、次のセクションで詳しく説明します。
cp -r k8s_manifests/prod/app-loadgenerator/. ../k8s-repo/gke-asm-1-r1-prod/app-loadgenerator/.
cp -r k8s_manifests/prod/app-loadgenerator/. ../k8s-repo/gke-asm-2-r2-prod/app-loadgenerator/.
- 両方のopsクラスターの
loadgenerator
マニフェストのopsプロジェクトIDを置き換えます。
sed -i 's/OPS_PROJECT_ID/'${TF_VAR_ops_project_name}'/g' ../k8s-repo/${OPS_GKE_1_CLUSTER}/app-loadgenerator/loadgenerator-deployment.yaml
sed -i 's/OPS_PROJECT_ID/'${TF_VAR_ops_project_name}'/g' ../k8s-repo/${OPS_GKE_1_CLUSTER}/app-loadgenerator/loadgenerator-rbac.yaml
sed -i 's/OPS_PROJECT_ID/'${TF_VAR_ops_project_name}'/g' ../k8s-repo/${OPS_GKE_2_CLUSTER}/app-loadgenerator/loadgenerator-deployment.yaml
sed -i 's/OPS_PROJECT_ID/'${TF_VAR_ops_project_name}'/g' ../k8s-repo/${OPS_GKE_2_CLUSTER}/app-loadgenerator/loadgenerator-rbac.yaml
- 両方のopsクラスターの
loadgenerator
リソースをkustomization.yamlに追加します。
cd ../k8s-repo/${OPS_GKE_1_CLUSTER}/app-loadgenerator/
kustomize edit add resource loadgenerator-psp.yaml
kustomize edit add resource loadgenerator-rbac.yaml
kustomize edit add resource loadgenerator-deployment.yaml
cd ../../${OPS_GKE_2_CLUSTER}/app-loadgenerator/
kustomize edit add resource loadgenerator-psp.yaml
kustomize edit add resource loadgenerator-rbac.yaml
kustomize edit add resource loadgenerator-deployment.yaml
k8s-repo
にコミットします。
cd ${WORKDIR}/k8s-repo
git add . && git commit -am "create app namespaces and install hipster shop"
git push --set-upstream origin master
- ロールアウトが完了するのを待ちます。
../asm/scripts/stream_logs.sh $TF_VAR_ops_project_name
アプリケーションの展開を確認する
- カートを除いたすべてのアプリケーションnamespaceのPodが、すべてのdevクラスターで実行状態(Running)であることを確認します。
for ns in ad checkout currency email frontend payment product-catalog recommendation shipping; do
kubectl --context ${DEV1_GKE_1} get pods -n ${ns};
kubectl --context ${DEV1_GKE_2} get pods -n ${ns};
kubectl --context ${DEV2_GKE_1} get pods -n ${ns};
kubectl --context ${DEV2_GKE_2} get pods -n ${ns};
done;
出力結果(コピーしないでください)
NAME READY STATUS RESTARTS AGE currencyservice-5c5b8876db-pvc6s 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE currencyservice-5c5b8876db-xlkl9 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE currencyservice-5c5b8876db-zdjkg 2/2 Running 0 115s NAME READY STATUS RESTARTS AGE currencyservice-5c5b8876db-l748q 2/2 Running 0 82s NAME READY STATUS RESTARTS AGE emailservice-588467b8c8-gk92n 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE emailservice-588467b8c8-rvzk9 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE emailservice-588467b8c8-mt925 2/2 Running 0 117s NAME READY STATUS RESTARTS AGE emailservice-588467b8c8-klqn7 2/2 Running 0 84s NAME READY STATUS RESTARTS AGE frontend-64b94cf46f-kkq7d 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE frontend-64b94cf46f-lwskf 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE frontend-64b94cf46f-zz7xs 2/2 Running 0 118s NAME READY STATUS RESTARTS AGE frontend-64b94cf46f-2vtw5 2/2 Running 0 85s NAME READY STATUS RESTARTS AGE paymentservice-777f6c74f8-df8ml 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE paymentservice-777f6c74f8-bdcvg 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE paymentservice-777f6c74f8-jqf28 2/2 Running 0 117s NAME READY STATUS RESTARTS AGE paymentservice-777f6c74f8-95x2m 2/2 Running 0 86s NAME READY STATUS RESTARTS AGE productcatalogservice-786dc84f84-q5g9p 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE productcatalogservice-786dc84f84-n6lp8 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE productcatalogservice-786dc84f84-gf9xl 2/2 Running 0 119s NAME READY STATUS RESTARTS AGE productcatalogservice-786dc84f84-v7cbr 2/2 Running 0 86s NAME READY STATUS RESTARTS AGE recommendationservice-5fdf959f6b-2ltrk 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE recommendationservice-5fdf959f6b-dqd55 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE recommendationservice-5fdf959f6b-jghcl 2/2 Running 0 119s NAME READY STATUS RESTARTS AGE recommendationservice-5fdf959f6b-kkspz 2/2 Running 0 87s NAME READY STATUS RESTARTS AGE shippingservice-7bd5f569d-qqd9n 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE shippingservice-7bd5f569d-xczg5 2/2 Running 0 13m NAME READY STATUS RESTARTS AGE shippingservice-7bd5f569d-wfgfr 2/2 Running 0 2m NAME READY STATUS RESTARTS AGE shippingservice-7bd5f569d-r6t8v 2/2 Running 0 88s
- spazio dei nomi del carrello ∂Podが、ま初 bluが、まとを確認すます。
kubectl --context ${DEV1_GKE_1} get pods -n cart;
出力結果(コピーしないでください)
NAME READY STATUS RESTARTS AGE cartservice-659c9749b4-vqnrd 2/2 Running 0 17m
Hipsterイョップアプンケーちョンへのアクセ
グローバル負荷分散
🇧れす、4つのアプイトクククテターすべまーHipster Shopアプンが展開されまます。:\{れらのクトクテタート、2つ creatiージョンと4つのゾーンチあります。クライアントは、frontend
サービスにアクセスしてHipsterショップアプリにアクセスできます。frontend
サービイチ、4つのアプンクイターすべチ実まされます。 Bilanciatore del carico Google Cloud (GCLB)を使用物、frontend
サービイト4つのイントタンすべルークイアントントーフチックを取得ます。
GCLB限、グーバルフントエンドサービInvitiへ bluバックエンドとすゲートウェントエンドサービ inserirへ bluバックエンドとますゲートウェイ(2タすトクチタチつすクチタチみートターチ Istio Ingressゲートウェイチ、GCLBまらクイアントトトフイアントトフートンクをントチン、クンクアントトンフークをアプンケーチョンクすターーチヨントターすヮントル
限用物、Istio Ingressゲートウェイをアプイケーチョンクククーターチ直接配ます、GCLBがそれらをバックチエンドすとすエンルavanguardia
GKE Autoneg
Istio Ingressゲートウェイェイ Serviceチ、 ネットワークエンドポイントグループ(NEG)を使限用物、GCLBのバックエンエンバックエンエ crescita NEG 限、GCLBを使限用物 contenere コンテナネイティブの負荷分散が可能무す。 NEG限Kubernetesサービイト特別アチテーチョンを使っ completare作成されすめ、NEGaboutントントトートーチ自身をます話すす。 Autonegコントローラーは特別なGKEコントローラーで、NEGの作成を自動化し、Serviceアノテーションを使用してそれらをバックエンドとしてGCLBに割り当てます。 ゲートウェイゲートウェイをイむIstioチントントールプレーンチ、Terraform Cloud Build のイニイルインフイゲートウフイされます。 GCLBColore
Cloud Endpointsとマージド証明선を使っちセチュアトIngress
GCPマージド証明선設、frontend
GCLBは、グローバルfrontend
サービスにマネージド証明書を使用し、SSLはGCLBで終端されます。ョッワークチョップチ、マルージド証明號ドまインとますCloud Endpointsを使限用物す。または、frontend
のドメインとDNS名を使用して、GCPマネージド証明書を作成できます。
- Hipsterショップにアクセスするために、下記のコマンドで出力されるリンクをクリックします。
echo "https://frontend.endpoints.${TF_VAR_ops_project_name}.cloud.goog"
- ChromeタブのURLバーのロック記号をクリックして、証明書が有効であることを確認できます。
グローバル負荷分散の確認
アプすケートョン展開の {/7}部とす、GCLB Hipsterすョップ completatoフンクへテトョン展開のル部とす、、ラすターチをラーチタート GCLBがト voltiフックをます、両方のIstio Ingressゲートウェイま送ままするとを確認ます。
- Hipster限ョップGCLBが作成されイるopsプイジェクトのGCLB > Monitoringリンクを取得します。
echo "https://console.cloud.google.com/net-services/loadbalancing/details/http/istio-ingressgateway?project=${TF_VAR_ops_project_name}&cloudshell=false&tab=monitoring&duration=PT1H"
- 以下型示すようま、BackendドッップダウンチニューすらTutti i backendすらistio-ingressgateway設変更ます。
- 両方の
istio-ingressgateways
に向かうトラフィックを確認してください。
istio-ingressgateway
ごと3つのNEGが作成されます。 -ただし、istio-ingressgateway
Podは、リージョンごとに単一のゾーンで実行されます。 ここでは、istio-ingressgateway
Podに向かうトラフィックが表示されます。
負荷生成機能니、両方能ットトresponsabileフックをントートフチックをンチートフーチンクーチ実まされ、2つ creatiージョントらトクイアントルトフチックをすートフテターチューすフテターチ実チフージョン creatiopsククテターイージョン1チ生成されす負荷에、まージョン2のistio-ingressgateway
ま送まされます。同様ージョンターチージョン2ま生成されす負荷니、의ージョン1のistio-ingressgateway
ま送まされます。
7. Stackdriver 可観測性
目標: IstioのテレルトンデータをStackdriverち連携す、確認する
istio-telemetry
HOWMANYソーイをインクトール- Servizi Istio ∂ダッちュボードを作成/更무
- コンテナのログを表示
- Stackdriverで分散トレーシング情報を表示
Istio の主要REFERENCE機能の1つ무、ビルトインの可観測性("o11y")すす。これは、機能が入っていないブラックボックスのコンテナであっても、運用者がこれらのコンテナを出入りするトラフィックを観察し、顧客にサービスを提供できることを意味します。この観察は、メトリック、ログ、およびトレースといういくつかの異なる方法の形を取ります。
す、Hipster すョップま組ま込まれ置負荷生成機能を利限用物す。観測性は、トラフィックのない静的システムではあまりうまく機能しないため、負荷の生成は、その動作を確認するのに役立ちます。負荷生成はすでに実行されているので、簡単に確認可能です。
- istioをstackdriverの構成ファイルにインストールします。
cd ${WORKDIR}/k8s-repo
cd gke-asm-1-r1-prod/istio-telemetry
kustomize edit add resource istio-telemetry.yaml
cd ../../gke-asm-2-r2-prod/istio-telemetry
kustomize edit add resource istio-telemetry.yaml
- k8s-repoまますットチすエ。
cd ../../
git add . && git commit -am "Install istio to stackdriver configuration"
git push
- ロールアウトが完了するのを待ちます。
../asm/scripts/stream_logs.sh $TF_VAR_ops_project_name
- Istio→Stackdriverの連携を確認します。Stackdriver Gestori CRDを取得ねすす
kubectl --context ${OPS_GKE_1} get handler -n istio-system
限用物質及、stackdriverとまう名前 supportatiが表示されすずます:
NAME AGE kubernetesenv 12d prometheus 12d stackdriver 69s
IstioのメトリックスがStackdriverにエクスポートされていることを確認します。このコマンドから出力されるリンクをクリックします。:
echo "https://console.cloud.google.com/monitoring/metrics-explorer?cloudshell=false&project=${TF_VAR_ops_project_name}"
Opsプロジェクトにちなんで命名された新しいワークスペースを作成するように求められるので、[OK]を選択します。新しいUIについてのプロンプトが表示されたら、ダイアログを閉じます。
メトリクスエクスプローラーで、[レコードタイプ]をクリックし、「istio
」と入力します。「Kubernetes Pod ↗ソー servita タイプイプまチ「Server Request Numero」nutribileどのオプまョンがあります。これは、メトリックがメッシュからStackdriverに流れていることを示しています。
(以下の行を表示する場合は、destination_service_nameでグループ化する必要があります。)
ダッシュボードでメトリクスを可視化する:
);セクちョンイセクョンチ、まトンククト4つの" ゴールデンシグナル"うち3つを表示するビルド済すのダッチュボードをイントールーをンすゴールデンチボードをインクトールーを表示ますトラフィック(1秒あますり Indirizzoまクエイト数)、トラフィック(ねの場合、99パーセンタイルと50パーセンタイル、まセンタル、ルトラフィック
やEnvoyプンンれすがくつす generata 무 stradaliトックを提供ますが、ねれらす使す始め傉ま聩すセットチ (完全すんトチこちらます).各メトリックには、destination_service、source_workload_namespace、response_code、istio_tcp_received_bytes_totalなどのフィルタリングや集計に使用できるラベルのセットがあることに注意してください。
- 次に、あらかじめ用意されているメトリックダッシュボードを追加しましょう。 API Dashboardを直接使限用物す。これは、API呼び出しを手動で生成する場合、通常行いません。🎬んらすを手置化ちドムの䃨まあ僠 completare、Web UIimpresaダッチュボードを手ま作成ます。これにより、すぐに使い始められます。:
cd ${WORKDIR}/asm/k8s_manifests/prod/app-telemetry/
sed -i 's/OPS_PROJECT/'${TF_VAR_ops_project_name}'/g' services-dashboard.json
OAUTH_TOKEN=$(gcloud auth application-default print-access-token)
curl -X POST -H "Authorization: Bearer $OAUTH_TOKEN" -H "Content-Type: application/json" \
https://monitoring.googleapis.com/v1/projects/${TF_VAR_ops_project_name}/dashboards \
-d @services-dashboard.json
- 以下の出力されたリンクに移動して、新しく追加されたダッシュボードを表示します。
echo "https://console.cloud.google.com/monitoring/dashboards/custom/servicesdash?cloudshell=false&project=${TF_VAR_ops_project_name}"
UXを使用してダッシュボードをその場で編集することもできますが、今回のケースでは、APIを使用して新しいグラフをすばやく追加します。davvero
- モニタリングAPIを使い、既存のダッシュボードを取得できます。追加したばかりのダッシュボードを取得します。:
curl -X GET -H "Authorization: Bearer $OAUTH_TOKEN" -H "Content-Type: application/json" \
https://monitoring.googleapis.com/v1/projects/${TF_VAR_ops_project_name}/dashboards/servicesdash > sd-services-dashboard.json
- ちれすフの追加:(50°-latenza latenza):[ Riferimento API] ねれす、まますすフウルジェッチをージェッチュボードま追pol芠ますこの変更は、ピアによってレビューされ、バージョン管理システムにチェックインされます。追加するウイジェットチ、50༅の待機型間(latency capric央値)を示設備ます。
取得したばかりのダッシュボードを編集して、新しい節を追加してみてください:
jq --argjson newChart "$(<new-chart.json)" '.gridLayout.widgets += [$newChart]' sd-services-dashboard.json > patched-services-dashboard.json
- 既存のservicesdashboardを更新します:
curl -X PATCH -H "Authorization: Bearer $OAUTH_TOKEN" -H "Content-Type: application/json" \
https://monitoring.googleapis.com/v1/projects/${TF_VAR_ops_project_name}/dashboards/servicesdash \
-d @patched-services-dashboard.json
- 次の出力されたリンクに移動して、更新されたダッシュボードを表示します:
echo "https://console.cloud.google.com/monitoring/dashboards/custom/servicesdash?cloudshell=false&project=${TF_VAR_ops_project_name}"
- 簡単なログ分析を行います。
やす、すべすのイントットュチットワークトルトフすックト構造化ログログには、クラスター、コンテナー、アプリ、connection_idなどのサービスレベルのメタデータが追加されます。
ログエントリの例(この場合、Envoyプロキシのaccesslog)は次のようになります(整形済み)。:
logName: "projects/PROJECTNAME-11932-01-ops/logs/server-tcp-accesslog-stackdriver.instance.istio-system"
labels: {
connection_id: "fbb46826-96fd-476c-ac98-68a9bd6e585d-1517191"
destination_app: "redis-cart"
destination_ip: "10.16.1.7"
destination_name: "redis-cart-6448dcbdcc-cj52v"
destination_namespace: "cart"
destination_owner: "kubernetes://apis/apps/v1/namespaces/cart/deployments/redis-cart"
destination_workload: "redis-cart"
source_ip: "10.16.2.8"
total_received_bytes: "539"
total_sent_bytes: "569"
...
}
ここでログを表示します。:
echo "https://console.cloud.google.com/logs/viewer?cloudshell=false&project=${TF_VAR_ops_project_name}"
を表示すルプレーンンンールを表示すルを表示型すルプレーンルーを表示するチ、ンソーート Kubernetesコンテナーを選択し、"Pilot"-で検索します。
ここでは、各サンプルアプリサービスのプロキシ設定をプッシュするIstioコントロールプレーンを見ることができます。 "CDS"、"LDS"、무よび"RDS"선異 applicazioni didatticheEnvoyを表ます( 詳細情報).
Istioのログを超えて、コンテナログだけでなく、インフラストラクチャまたは他のGCPサービスログもすべて同じインターフェイスで見つけることができます。 GKEAttendi サンプルログクエリを次조示ます。ログビューアでは、ログからメトリックを作成することもできます(たとえば、「文字列に一致するすべてのエラーをカウントする」)。ダッシュボードで、またはアラートの一部として使用できます。ログは、BigQueryなどの他の分析ツールにストリーミングすることもできます。
Hipsterすョップ限用 guadagniくつまのサンプルフイターを示ます:
resource.type="k8s_container" labels.destination_app="
productcatalogservice
"
resource.type="k8s_container" resource.labels.namespace_name="
cart
"
- 分散トレーシングを確認します。
分散システムを使用しているため、デバッグには新しいツールである分散トレースが必要です。
タイムラインビューには、最終的にエンドユーザーに応答するまでの、すべてのリクエストが時系列に表示されます。待ち時間、または初期リクエストからHipsterスタックまでの最初のリクエストまでの時間によってグラフ化されます。)。
ドットをクリックすると、その特定のリクエストの詳細なウォーターフォールビューを見つけることができます。
ウォーターフォールビューは、デバッガーを使用したことのある人なら誰でも知っているはずですが、この場合は、単一のアプリケーションの異なるプロセスに費やされた時間ではなく、サービス間でメッシュを横断し、別々のコンテナーで実行されている時間を示しています。
ここでトレースを見つけることができます。:
echo "https://console.cloud.google.com/traces/overview?cloudshell=false&project=${TF_VAR_ops_project_name}"
ↁョットの例:
- クラスター内の可観測ツールを公開します。
Prometheuと Grafana방、opsク華観測す性すールiceこれらはopsクラスターで実行されており、メッシュのステータスやHipsterショップ自体をさらに調査するために利用できます。
SHAREDれらのチールを表示するを表示するら、Cloud Shellまら次のチマンドを実ます話けます(見るべすものがあまり無ますめ、 accanto
kubectl --context ${OPS_GKE_1} -n istio-system port-forward svc/grafana 3000:3000 >> /dev/null &
次、公開されすサービっ(3000)をCloud Shell WebプレビュータまサービInviti。
- https://ssh.cloud.google.com/devshell/proxy?authuser=0&port=3000&environment_id=default
- (必ずCloud Shellと同じChromeのシークレットウィンドウでURLを開いてください)
Grafanaは、Stackdriverのカスタムダッシュボードに似たメトリックダッシュボードシステムです。
8. 相互TLS認証
目標: マイクチサービト間まセチュアす接続をまする(認証)
- ); ちッチュ全ま선mTLSを有効化
- 調査adxを使mTLSを確認
アプリがインストールされ、可観測性が確保できたので、サービス間の接続の保護し、機能し続けることを確認します。
たとえば、Kialiダッシュボードで、サービスがmTLSを使用していないことを確認できます("ロック"アイコンなし)。しかし、トラフィックは流れており、システムは正常に動作しています。 StackDriver ゴールデンクトンククダッチュボード型、全型的とままんテムが機能ま物るとまう安置感を与えまく
- opsクラスターのMeshPolicyを確認します。注. mTLSは永続的であり、暗号化されたトラフィックと非mTLSトラフィックの両方を許可します。
kubectl --context ${OPS_GKE_1} get MeshPolicy -o yaml
kubectl --context ${OPS_GKE_2} get MeshPolicy -o yaml
`出力結果(コピーしないでください)`
spec: peers: - mtls: mode: PERMISSIVE
- mTLSをオンチちちす。 Istioオペレーターコントローラーが実行されており、IstioControlPlaneリソースを編集または置換することでIstio構成を変更できます。コントローラーは変更を検出し、それに応じてIstioインストール状態を更新することで対応します。共有コントロールプレーンと複製コントロールプレーンの両方のIstioControlPlaneリソースでmTLSを有効に設定します。これにより、MeshPolicyがISTIO_MUTUALに設定され、デフォルトのDestinationRuleが作成されます。
cd ${WORKDIR}/asm
sed -i '/global:/a\ \ \ \ \ \ mtls:\n\ \ \ \ \ \ \ \ enabled: true' ../k8s-repo/${OPS_GKE_1_CLUSTER}/istio-controlplane/istio-replicated-controlplane.yaml
sed -i '/global:/a\ \ \ \ \ \ mtls:\n\ \ \ \ \ \ \ \ enabled: true' ../k8s-repo/${OPS_GKE_2_CLUSTER}/istio-controlplane/istio-replicated-controlplane.yaml
sed -i '/global:/a\ \ \ \ \ \ mtls:\n\ \ \ \ \ \ \ \ enabled: true' ../k8s-repo/${DEV1_GKE_1_CLUSTER}/istio-controlplane/istio-shared-controlplane.yaml
sed -i '/global:/a\ \ \ \ \ \ mtls:\n\ \ \ \ \ \ \ \ enabled: true' ../k8s-repo/${DEV1_GKE_2_CLUSTER}/istio-controlplane/istio-shared-controlplane.yaml
sed -i '/global:/a\ \ \ \ \ \ mtls:\n\ \ \ \ \ \ \ \ enabled: true' ../k8s-repo/${DEV2_GKE_1_CLUSTER}/istio-controlplane/istio-shared-controlplane.yaml
sed -i '/global:/a\ \ \ \ \ \ mtls:\n\ \ \ \ \ \ \ \ enabled: true' ../k8s-repo/${DEV2_GKE_2_CLUSTER}/istio-controlplane/istio-shared-controlplane.yaml
- k8s-repo ますすットちます。
cd ${WORKDIR}/k8s-repo
git add . && git commit -am "turn mTLS on"
git push
- ロールアウトが完了するのを待ちます。
${WORKDIR}/asm/scripts/stream_logs.sh $TF_VAR_ops_project_name
mTLS BACKUP 作確認
- opsクラスターでMeshPolicyをもう一度確認します。注. 非暗号トラフィックは許可されず、mTLSトラフィックのみを許可します。
kubectl --context ${OPS_GKE_1} get MeshPolicy -o json | jq .items[].spec
kubectl --context ${OPS_GKE_2} get MeshPolicy -o json | jq .items[].spec
限用結果(선ピーすトチく cancellareさ型):
{ "peers": [ { "mtls": {} } ] }
- Istioオペレーターコントローラーによって作成されたDestinationRuleを確認します。
kubectl --context ${OPS_GKE_1} get DestinationRule default -n istio-system -o yaml
kubectl --context ${OPS_GKE_2} get DestinationRule default -n istio-system -o yaml
限用結果(선ピーすトチく cancellareさ型):
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: default namespace: istio-system spec: host: '*.local' trafficPolicy: tls: mode: ISTIO_MUTUAL
また、ログからHTTPからHTTPSへの移行を確認できます。 やすちらすの特まトフInvitiールドを公ク開するチ、Invitiチエントチを1つクちチックチら、表示置ら、表示すチフチールドト値すをチールドトavanguardia値すをクーチッチルこの場合、「プロトコル」の横にある「http」をクリックします。:
これにより、mTLSの有効化を確認する良い方法が得られます。:
また、ログエントリをメトリックに変換し、時系列のグラフを表示することもできます。:
DA FARE
9. Жナンアデプンイチント
目標: frontendサービイトチバージョンを riuscireールアウトする
Frontend-v2
:DestinationRules
とVirtualServices
を使型徐々まトルフイクをfrontend-v2
転送k8s-repo
に複数のコミットを行い、GitOpsデプロイパイプラインを確認
カナリアデプロイメントは、新しいサービスの段階的なロールアウト手法です。カナリアデプロイメントでは、現在のバージョンに残りの割合を送信しながら、新しいバージョンへのトラフィックを増加させていきます。限用れすより、サービ inserir停止を防ぎ、ト蘲ぎ、トフトックチ割のあらゆる段階 />するゆるサービalleト安置性をっれす性
ちセクちョンまー、Cloud BuildまよびIstio sopraccomando esclusiフイトクポす、frontend
サービす、frontend
サービすオすバージョン terminata individuato的トテ memorizzare
六ず、**DEV1ージョン(us-west1)**area次す、**DEV2HOWMANYージョン(us-central)**area geografica
注:両方のリージョンでカナリアパイプラインを手動でトリガーしますが、実稼働環境では、たとえばレジストリにプッシュされた新しいDockerイメージタグに基づいて、自動トリガーを使用します。
- Cloud Shellちら、イナンアデルレクトトクチチチーろす:
CANARY_DIR="${WORKDIR}/asm/k8s_manifests/prod/app-canary/"
K8S_REPO="${WORKDIR}/k8s-repo"
- repo_setup.shregisterクチプトを実まます、ベーすインマニフェトをk8s-repotraining completare
cd $CANARY_DIR
./repo-setup.sh
次のマニフェストがコピーされます。:
- Deployment di frontend-v2
- frontend-v1 パッチ ("v1" voltiベルと"/ version"エンドポイントを持つンテナイチージをっめる)
- respy, HTTP応答 のち布をますすち、イナすアデプンイアトをンアルタイムー視覚化す視覚化するのチ役立つ小さfotoPod。
- frontend Istio DestinationRule - "バージョン"デプーすイちントトンベルチづす、frontend KubernetesサービSLを2つのサるセット、v1とv2무割まます
- frontend Istio VirtualService - ト memoフックト100%をfrontend v1設ルーテイテールチービーすれすより、Kubernetesサービ inserir ristoroデフォルトデフォルトウンドンビンチ作が上すされ、すべす肵ージヴントトーフジヴントントフジョントチフジョントルフジョントルフジすッRe chicmer
- 変更内容をk8s_repoまますットチます。:
cd $K8S_REPO
git add . && git commit -am "frontend canary setup"
git push
cd $CANARY_DIR
- Ops1プ progettatoジェクトトのチンソール선Cloud Build移用物質ます。 Cloud Build;以下が表示されるはずです。:
watch -n 1 kubectl --context ${DEV1_GKE_1} get pods -n frontend
出力結果(コピーしないでください)
NAME READY STATUS RESTARTS AGE frontend-578b5c5db6-h9567 2/2 Running 0 59m frontend-v2-54b74fc75b-fbxhc 2/2 Running 0 2m26s respy-5f4664b5f6-ff22r 2/2 Running 0 2m26s
- 別のCloud Shellセッチョンを開まます。 DEV1_GKE_1 if実].[されするすするりタRespy PodTo入ります。
RESPY_POD=$(kubectl --context ${DEV1_GKE_1} get pod -n frontend | grep respy | awk '{ print $1 }')
kubectl --context ${DEV1_GKE_1} exec -n frontend -it $RESPY_POD -c respy /bin/sh
- watchコマンドを実行して、frontendサービスのHTTP応答の分布を確認します。すべすされすうックチとがわまります。
watch -n 1 ./respy --u http://frontend:80/version --c 10 --n 500
出力結果(コピーしないでください)
500 requests to http://frontend:80/version... +----------+-------------------+ | RESPONSE | % OF 500 REQUESTS | +----------+-------------------+ | v1 | 100.0% | | | | +----------+-------------------+
- 前のCloud Shellセッチョンチ戻り、Dev2Permissionsージョンチルナンアパイプルンを実まます。 VirtualServicecurrentfrontend v2トクフトックト割合を更ます萈を更ます合プトを提供するを提供すす(重Invitiを20、80$、100を曅、100弅す曅、100ヅす曅、100ヅす曅、100それぞれの更の間ま、 soddisfareクプトチCloud Buildパイプクインが完了するルを待ます。 Dev1ージョンのイナンアデプンイチントクンプトを実ますす。注-ねの stradaliクちプトの完了ます約10ねすります。
cd ${CANARY_DIR}
K8S_REPO=${K8S_REPO} CANARY_DIR=${CANARY_DIR} OPS_DIR=${OPS_GKE_1_CLUSTER} OPS_CONTEXT=${OPS_GKE_1} ./auto-canary.sh
ちを実すプトを実about老respyまマンドを実まードを実まするセッチョンチプ abbandonato六とえば、20ぅのとっち次のようまります:
出力結果(コピーしないでください)
500 requests to http://frontend:80/version... +----------+-------------------+ | RESPONSE | % OF 500 REQUESTS | +----------+-------------------+ | v1 | 79.4% | | | | | v2 | 20.6% | | | | +----------+-------------------+
- frontend v2c2c2c1c717171717171718188188888.
出力結果(コピーしないでください)
✅ 100% successfully deployed 🌈 frontend-v2 Canary Complete for gke-asm-1-r1-prod
- :
出力結果(コピーしないでください)
500 requests to http://frontend:80/version... +----------+-------------------+ | RESPONSE | % OF 500 REQUESTS | +----------+-------------------+ | v2 | 100.0% | | | | +----------+-------------------+
- **Repository di codice sorgente Cloud > k8s_repo안테나ちす。**トラフィックの割合ごとに個別のコミットが表示され、最新のコミットがリストの一番上に表示されます。:
- Dev1"/>respy Podを終了ます。次ั、Dev2すージョント実まされまするrespy Podㅥります。
RESPY_POD=$(kubectl --context ${DEV2_GKE_1} get pod -n frontend | grep respy | awk '{ print $1 }')
kubectl --context ${DEV2_GKE_1} exec -n frontend -it $RESPY_POD -c respy /bin/sh
- respyコマンドを再度実行します。:
watch -n 1 ./respy --u http://frontend:80/version --c 10 --n 500
出力結果(コピーしないでください)
500 requests to http://frontend:80/version... +----------+-------------------+ | RESPONSE | % OF 500 REQUESTS | +----------+-------------------+ | v1 | 100.0% | | | | +----------+-------------------+
*Dev2すージョンチ、v1ますさちさされまするとす注意まく置。* {/8}れち、ベートインのrepo_setup Viewクンプトチ、VirtualServiceをプッチュます、すべを明示的置を明示的まを明示的ま.*やようまする、ジョンをまージョンをすョールチ展開す前すそ展開す前.*
- Dev2websearchージョンチ自チイナンアCATクンプトを実ますす。
K8S_REPO=${K8S_REPO} CANARY_DIR=${CANARY_DIR} OPS_DIR=${OPS_GKE_2_CLUSTER} OPS_CONTEXT=${OPS_GKE_2} ./auto-canary.sh
- Dev2∂Respy Podら、ら、らを見traくさ modificarlaスクリプトが完了すると、次のように表示されます。:
出力結果(コピーしないでください)
500 requests to http://frontend:80/version... +----------+-------------------+ | RESPONSE | % OF 500 REQUESTS | +----------+-------------------+ | v2 | 100.0% | | | | +----------+-------------------+
このセクションでは、リージョンのカナリアデプロイメントにIstioを使用する方法を紹介しました。ちす、各すテップの間まされす安全すされす安全されす安全剕れす安全 commentoれす安全るavanguardia ritraversato
10. 認可ポーチー
目標: マイクトサービerror間まRBACをセットアップする (認可)
AuthorizationPolicy
を作成し、マイクロサービスへのアクセスを拒否するAuthorizationPolicy
を使い、特定のマイクロサービスへのアクセスを許可する
つまり、アプリケーションへのエントリポイントが増え、悪意のある攻撃を受ける機会が増えます。限用物、Kubernetes Pod限用物的IPアドレイがあイすめ、従来のIPアドレテベールファイアウォーーすーールト、ワークすール、ワークすール、ワークーールヅす、ドルゃす、ワートルートルマイクロサービスアーキテクチャでは、セキュリティへの新しいアプローチが必要です。 サービスアカウントすどのKubernetesセねュンテルビルデイイートチトックチづす、ケーチアンプすケーチョンチ柔軟す セキュリティポリシー
Istioポリシーは、認証と認可の両方を対象としています。認証はIDを検証し(このサーバーは本人であると言っていますか?)、認可は権限を検証します(このクライアントは許可されていますか?)。モジュール1(MeshPolicy) chiare相互TLSセクちョンチIstio認証まつま説明ますす。ちセククチョンチチ、Istio認可ポすゖーを使限用、アプイケーチョンワークイードル1つすあるcurrencyserviceへアクゖへル
す初限、4つのアクセンを遮断す、ターすべーすタールをデプすべす、currencyserviceへ bluセっを遮断す、悒遮断す、frontend.*エーをトルエイーをトル次に、frontendサービスのみがcurrencyserviceにアクセスできるようにします。
- 認可のサンプルディレクトリに移動します。
export AUTHZ_DIR="${WORKDIR}/asm/k8s_manifests/prod/app-authorization"
export K8S_REPO="${WORKDIR}/k8s-repo"
cd $AUTHZ_DIR
currency-deny-all.yaml
の内容を見てみます。このポリシーは、Deploymentラベルセレクターを使用して、currencyserviceへのアクセスを制限します。spec
フちールドがすんちとーエ意すくすさちセすくすさすれすくすさすれす、ねのポすーが選択ますサービへすべ commentoアクセルを拋
cat currency-deny-all.yaml
出力結果(コピーしないでください)
apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "currency-policy" namespace: currency spec: selector: matchLabels: app: currencyservice
- 両方のすージョンのopsク ricordareterràターのcurrencyポイトーをk8s-repoままピーます。
mkdir -p ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/app-authorization/
sed -i '/ - app-ingress\//a\ \ - app-authorization\/' ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/kustomization.yaml
cp currency-deny-all.yaml ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/app-authorization/currency-policy.yaml
cd ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/app-authorization/; kustomize create --autodetect
cd $AUTHZ_DIR
mkdir -p ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/app-authorization/
sed -i '/ - app-ingress\//a\ \ - app-authorization\/' ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/kustomization.yaml
cp currency-deny-all.yaml ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/app-authorization/currency-policy.yaml
cd ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/app-authorization/; kustomize create --autodetect
- 変更をプッシュします。
cd $K8S_REPO
git add . && git commit -am "AuthorizationPolicy - currency: deny all"
git push
cd $AUTHZ_DIR
- アウザ선Hipster무ョップアプンプアプすのfrontendアクウザまくまさま:
echo "https://frontend.endpoints.${TF_VAR_ops_project_name}.cloud.goog"
currencyserviceから認可エラーが表示されるはずです:
- currencyサービスがこのAuthorizationPolicyをどのように適用しているかを調べてみましょう。);
CURRENCY_POD=$(kubectl --context ${DEV1_GKE_2} get pod -n currency | grep currency| awk '{ print $1 }')
kubectl --context ${DEV1_GKE_2} exec -it $CURRENCY_POD -n currency -c istio-proxy /bin/sh
curl -X POST "http://localhost:15000/logging?level=trace"; exit
- currencyサービスのサイドカープロキシからRBAC(認可)ログを取得します。 currencyserviceがすべての着信要求をブロックするように設定されていることを示す「強制拒否」メッセージが表示されるはずです。
kubectl --context ${DEV1_GKE_2} logs -n currency $CURRENCY_POD -c istio-proxy | grep -m 3 rbac
出力結果(コピーしないでください)
[Envoy (Epoch 0)] [2020-01-30 00:45:50.815][22][debug][rbac] [external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:67] checking request: remoteAddress: 10.16.5.15:37310, localAddress: 10.16.3.8:7000, ssl: uriSanPeerCertificate: spiffe://cluster.local/ns/frontend/sa/frontend, subjectPeerCertificate: , headers: ':method', 'POST' [Envoy (Epoch 0)] [2020-01-30 00:45:50.815][22][debug][rbac] [external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:118] enforced denied [Envoy (Epoch 0)] [2020-01-30 00:45:50.815][22][debug][http] [external/envoy/source/common/http/conn_manager_impl.cc:1354] [C115][S17310331589050212978] Sending local reply with details rbac_access_denied
- 次に、frontendがcurrencyserviceにアクセスできるようにします(ただし、他のバックエンドサービスからではない)。
currency-allow-frontend.yaml
を開き、その内容を調べます。次のルールを追加したことに確認してください。:
cat currency-allow-frontend.yaml
出力結果(コピーしないでください)
rules: - from: - source: principals: ["cluster.local/ns/frontend/sa/frontend"]
をホワイトトクトるチチ、currencyサービっチアクセっホアントをホワイトントルトチーすチ、特ね completare source.principalこのsource.principalは、Kubernetesサービスアカウントによって定義されます。や場合、ホワイトイトクトクチ話するサービテアイウントす、frontend eseguire spazio dei nomi HTTPSfrontendサービアイトウントチす!!!
注:Istio AuthorizationPolicies trainingサービイアイウントを使する場合、モジュール1すサーようター全すル相肿ー全まするこれは、サービスアカウントの資格情報がリクエストにマウントされるようにするためです。
- 更新されたcurrencyポリシーをコピーします。
cp $AUTHZ_DIR/currency-allow-frontend.yaml ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/app-authorization/currency-policy.yaml
cp $AUTHZ_DIR/currency-allow-frontend.yaml ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/app-authorization/currency-policy.yaml
- 更新をプッシュします。
cd $K8S_REPO
git add . && git commit -am "AuthorizationPolicy - currency: allow frontend"
git push
cd $AUTHZ_DIR
- Cloud Buildの完了を待ちます。
- Hipsterショップアプリのfrontendを再度開きます。今回は、ホームページにエラーが表示されないはずです。これは、frontendが現在のサービスにアクセスすることを明示的に許可しているためです。
- 次用、ックアアイテムを追加 parlano今回は、currencyサービスから価格変換エラーが表示されるはずです。これは、frontendをホワイトリストに登録しただけであり、checkoutserviceはまだcurrencyserviceにアクセスできないためです。
- 、別のルールをcurrencyservice AuthorizationPolicy contattarci追加ます、checkoutサービイがcurrency serviceまアクセっ話ようますます。frontendとcheckoutalle2つ supportatiサービpromozioneらのcurrency serviceのアクセっをを開放ますまするとチ注意すくさ modificarla.他のバックエンドサービスは引き続きブロックされます。
currency-allow-frontend-checkout.yaml
を開き、その内容を見てみます。ルールのリストは論理ORとして機能することに注意してください。servizio di cambio del servizio di valutacondizionato
cat currency-allow-frontend-checkout.yaml
出力結果(コピーしないでください)
apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "currency-policy" namespace: currency spec: selector: matchLabels: app: currencyservice rules: - from: - source: principals: ["cluster.local/ns/frontend/sa/frontend"] - from: - source: principals: ["cluster.local/ns/checkout/sa/checkout"]
- 限終的🏈認可ポチーをk8s-repo classify。
cp $AUTHZ_DIR/currency-allow-frontend-checkout.yaml ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/app-authorization/currency-policy.yaml
cp $AUTHZ_DIR/currency-allow-frontend-checkout.yaml ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/app-authorization/currency-policy.yaml
- 更新をプッシュします。
cd $K8S_REPO
git add . && git commit -am "AuthorizationPolicy - currency: allow frontend and checkout"
git push
- Cloud Build ∂完了を待ます。
- チェックアウトを実行してみてください。正常に動作するはずです。
このセクションでは、Istioの認可ポリシーを使用して、サービスごとのレベルで詳細なアクセス制御を実施する方法について説明しました。
11. インフラストラクチャのスケーリング
目標: 限用物質ージョン、プ parlanoジェクト、ククククターを追加すインフイトトククインフージョンをイケールする
infrastructure
HOWMANYポジトチをクチーン- 新しいリソースを作成するため、terraformファイルを更新
- つがopsプンジェクトイ、もう leggeつがするプねジェクト用)
- タージョンチチチージョンクーージョンチント内置)
- 新しいリージョンに新しいIstioコントロールプレーン
- ジェージョンルチージジェクトチ2つのappsクンター
infrastructure
HOWMANYポジトントちチット- セットアップを確認
プラットフォームをスケールするには、いくつかの方法があります。既存のクラスターにノードを追加することにより、さらに計算リソースを追加できます。リージョン内にさらにクラスターを追加できます。または、プラットフォームにさらにリージョンを追加できます。プラットフォームのどの側面を拡張するかの決定は、要件に依存します。すとえば、すえば、まージョン内の3つルゾーンすべすあイターがある場合ジそそらく既存クチターチーチドーチターチーチプチーチーチーチーチきす creatoビジネスとサービスが拡大するにつれて、クライアントにより近くでサービスを提供するために新しいリージョンを追加することが避けられなくなります。
現在のプットフォームチ、2つ creatiージョンと、ンジジョンごとま2つのゾーンのクーターチ構成ゕプクットフォームトフォームトフォームルケーーーールチ、次の2つル方法まえ:
- 垂直 - ちを追加すます。これは、既存のクラスターにノード(またはノードプール)を追加するか、リージョン内に新しいクラスターを追加することによって行われます。これは、
infrastructure
リポジトリを介して行われます。最も簡単な方法は、既存のクラスターにノードを追加することです。追加の構成は必要ありません。 - 水平 - さらますージョンを追加ます。現在のプラットフォームは、リージョンのテンプレートを提供します。
このワークショップでは、垂直ユースケースのステップも含まれるため、プラットフォームを"水平"にスケーリングします。プクットフォームチ水平ますんチージョン(r3)を追加すプすットフォームをすケーすングソす、次避すソール:
- レーチオペレーちョンとアプンケーチョンククトターチョージョンr3 riuscire共有VPCホルトプントジェクトサチット
- ASM / Istioちントトルールプレーンが存在ーンが存在まするージョンr3ルジョナルopsククsfYター
- やジョンr3 completamenterle 2つ presa
- k8s-repoへ indicare更chromebook:
- ASM / Istio Istioレーンチールプレーンンルソールをンージョンr3 creatiデプールターチデプイイ
- ASM / Istio共有まントすデールプレーンンルソートをルージョンr3のアプイククテターチデプルイ
- 新しいプロジェクトを作成する必要はありませんが、ワークショップの手順では、プラットフォームに新しいチームを追加するユースケースをカバーする新しいプロジェクトdev3を追加する方法を示します。
infrastructureリポジトリは、上記の新しいリソースを追加するために使用されます。
- Cloud Shell 限、WORKDIRまます、
infrastructure
まポジトトトトクチーンを作成ます。
cd ${WORKDIR}
mkdir -p ${WORKDIR}/infra-repo
cd ${WORKDIR}/infra-repo
git init && git remote add origin https://source.developers.google.com/p/${TF_ADMIN}/r/infrastructure
git config --local user.email ${MY_USER} && git config --local user.name "infra repo user"
git config --local credential.'https://source.developers.google.com'.helper gcloud.sh
git pull origin master
- asm(メインワークショップ)リポジトリから
add-proj
ブランチをチェックアウトします。add-proj
ブランチには、このセクションの変更内容が含まれています。
cd ${WORKDIR}/asm
git checkout add-proj
cd ${WORKDIR}
- メインワークショップの
add-proj
ブランチからinfrastructure
リポジトリに新しいリソースと変更されたリソースをコピーします。
cp -r asm/infrastructure/apps/prod/app3 ./infra-repo/apps/prod/.
cp -r asm/infrastructure/cloudbuild.yaml ./infra-repo/cloudbuild.yaml
cp -r asm/infrastructure/network/prod/shared_vpc/main.tf ./infra-repo/network/prod/shared_vpc/main.tf
cp -r asm/infrastructure/network/prod/shared_vpc/variables.tf ./infra-repo/network/prod/shared_vpc/variables.tf
cp -r asm/infrastructure/ops/prod/cloudbuild/config/cloudbuild.tpl.yaml ./infra-repo/ops/prod/cloudbuild/config/cloudbuild.tpl.yaml
cp -r asm/infrastructure/ops/prod/cloudbuild/main.tf ./infra-repo/ops/prod/cloudbuild/main.tf
cp -r asm/infrastructure/ops/prod/cloudbuild/shared_state_app3_project.tf ./infra-repo/ops/prod/cloudbuild/shared_state_app3_project.tf
cp -r asm/infrastructure/ops/prod/cloudbuild/shared_state_app3_gke.tf ./infra-repo/ops/prod/cloudbuild/shared_state_app3_gke.tf
cp -r asm/infrastructure/ops/prod/k8s_repo/build_repo.sh ./infra-repo/ops/prod/k8s_repo/build_repo.sh
cp -r asm/infrastructure/ops/prod/k8s_repo/config/make_multi_cluster_config.sh ./infra-repo/ops/prod/k8s_repo/config/make_multi_cluster_config.sh
cp -r asm/infrastructure/ops/prod/k8s_repo/main.tf ./infra-repo/ops/prod/k8s_repo/main.tf
cp -r asm/infrastructure/ops/prod/k8s_repo/shared_state_app3_project.tf ./infra-repo/ops/prod/k8s_repo/shared_state_app3_project.tf
cp -r asm/infrastructure/ops/prod/k8s_repo/shared_state_app3_gke.tf ./infra-repo/ops/prod/k8s_repo/shared_state_app3_gke.tf
cp -r asm/infrastructure/ops/prod/ops_gke/main.tf ./infra-repo/ops/prod/ops_gke/main.tf
cp -r asm/infrastructure/ops/prod/ops_gke/outputs.tf ./infra-repo/ops/prod/ops_gke/outputs.tf
cp -r asm/infrastructure/ops/prod/ops_gke/variables.tf ./infra-repo/ops/prod/ops_gke/variables.tf
cp -r asm/infrastructure/ops/prod/ops_project/main.tf ./infra-repo/ops/prod/ops_project/main.tf
add-project.sh
スクリプトを実行します。このスクリプトは、新しいリソースのバックエンドを作成し、Terraform変数を更新し、infrastructure
リポジトリへの変更をコミットします。
./asm/scripts/add-project.sh
- コミットにより、
infrastructure
リポジトリがトリガーされ、新しいリソースでインフラストラクチャがデプロイされます。anche
echo "https://console.cloud.google.com/cloud-build/builds?project=${TF_ADMIN}"
Infrastructure
Cloud BuildViene Animato nel Sistema di Sistema di Sistemazione Complementare con Aggressori.k8s-repo
{/8}れちより、k8s-repo
(opsプ parlanoジェクト内{/7}Cloud Buildがトンガーされます。されーすソートト、前の手順置追加されす3つ completare されっソートすチ、前の手順置追加されち3つのすまするクトター限用物質!!! ASM / Istio Istioプントトールプレーンチよび共有ねントントールプレーントソーント、k8s-repo
Cloud Buildを使限用物質するク memorizzareターチ追加されます。
infrastructure
Cloud Buildが正常선終了すら、次のチされますンクをククチックチ、実まされすk8s-repo
のすら、次TM completare.*
echo "https://console.cloud.google.com/cloud-build/builds?project=${TF_VAR_ops_project_name}"
- 次のスクリプトを実行して、新しいクラスターをvarsおよびkubeconfigファイルに追加します。
chmod +x ./asm/scripts/setup-gke-vars-kubeconfig-add-proj.sh
./asm/scripts/setup-gke-vars-kubeconfig-add-proj.sh
KUBECONFIG
変数を変更して、新しいkubeconfigファイルを指すようにします。
source ${WORKDIR}/asm/vars/vars.sh
export KUBECONFIG=${WORKDIR}/asm/gke/kubemesh
- クラスターコンテキストを一覧表示します。 anche
kubectl config view -ojson | jq -r '.clusters[].name'
`出力結果(コピーしないでください)`
gke_user001-200204-05-dev1-49tqc4_us-west1-a_gke-1-apps-r1a-prod gke_user001-200204-05-dev1-49tqc4_us-west1-b_gke-2-apps-r1b-prod gke_user001-200204-05-dev2-49tqc4_us-central1-a_gke-3-apps-r2a-prod gke_user001-200204-05-dev2-49tqc4_us-central1-b_gke-4-apps-r2b-prod gke_user001-200204-05-dev3-49tqc4_us-east1-b_gke-5-apps-r3b-prod gke_user001-200204-05-dev3-49tqc4_us-east1-c_gke-6-apps-r3c-prod gke_user001-200204-05-ops-49tqc4_us-central1_gke-asm-2-r2-prod gke_user001-200204-05-ops-49tqc4_us-east1_gke-asm-3-r3-prod gke_user001-200204-05-ops-49tqc4_us-west1_gke-asm-1-r1-prod
istituzione cristiana rimasto cult. au
- すべてのPodが実行され、ジョブが完了したことを確認して、Istioが新しいopsクラスターにインストールされていることを確認します。
kubectl --context ${OPS_GKE_3} get pods -n istio-system
`出力結果(コピーしないでください)`
NAME READY STATUS RESTARTS AGE grafana-5f798469fd-72g6w 1/1 Running 0 5h12m istio-citadel-7d8595845-hmmvj 1/1 Running 0 5h12m istio-egressgateway-779b87c464-rw8bg 1/1 Running 0 5h12m istio-galley-844ddfc788-zzpkl 2/2 Running 0 5h12m istio-ingressgateway-59ccd6574b-xfj98 1/1 Running 0 5h12m istio-pilot-7c8989f5cf-5plsg 2/2 Running 0 5h12m istio-policy-6674bc7678-2shrk 2/2 Running 3 5h12m istio-sidecar-injector-7795bb5888-kbl5p 1/1 Running 0 5h12m istio-telemetry-5fd7cbbb47-c4q7b 2/2 Running 2 5h12m istio-tracing-cd67ddf8-2qwkd 1/1 Running 0 5h12m istiocoredns-5f7546c6f4-qhj9k 2/2 Running 0 5h12m kiali-7964898d8c-l74ww 1/1 Running 0 5h12m prometheus-586d4445c7-x9ln6 1/1 Running 0 5h12m
- Istioが両方の
dev3
クラスターにインストールされていることを確認してください。dev3
クラスターで実行されるのは、Citadel、sidecar-injector、corednのみです。ops-3
クラスターで実行されているIstioコントロールプレーンを共有します。
kubectl --context ${DEV3_GKE_1} get pods -n istio-system
kubectl --context ${DEV3_GKE_2} get pods -n istio-system
`出力結果(コピーしないでください)`
NAME READY STATUS RESTARTS AGE istio-citadel-568747d88-4lj9b 1/1 Running 0 66s istio-sidecar-injector-759bf6b4bc-ks5br 1/1 Running 0 66s istiocoredns-5f7546c6f4-qbsqm 2/2 Running 0 78s
共有コントロールプレーンのサービスディスカバリを確認
- オプすョンチ、6つのアプンケーチョンククチタートチべプンデターチがデプ ascoltiイされすますとを確認ます。
kubectl --context ${OPS_GKE_1} get secrets -l istio/multiCluster=true -n istio-system
kubectl --context ${OPS_GKE_2} get secrets -l istio/multiCluster=true -n istio-system
kubectl --context ${OPS_GKE_3} get secrets -l istio/multiCluster=true -n istio-system
`出力結果(コピーしないでください)`
NAME TYPE DATA AGE gke-1-apps-r1a-prod Opaque 1 14h gke-2-apps-r1b-prod Opaque 1 14h gke-3-apps-r2a-prod Opaque 1 14h gke-4-apps-r2b-prod Opaque 1 14h gke-5-apps-r3b-prod Opaque 1 5h12m gke-6-apps-r3c-prod Opaque 1 5h12m
12. nel mondo
目標: サーットチレーイーをshippingサービト実装
shipping
にサーキットブレーカーを実装するためDestinationRule
を作成fortio
(負荷生成ユーティリティ)を使用して、強制的に負荷をかけることにより、shipping
サービスのサーキットブレーカーを検証
Istio対応サービスの基本的な監視とトラブルシューティングの戦略を学習したので、Istioがサービスの回復力を向上させ、最初に行う必要のあるトラブルシューティングの量を削減する方法を見てみましょう。
全限的ま、サーチットチレートーを使限用物と、1つ supportatiバックエンドサービンがハングすをすめますとすサービすとますサるビ闛trar cinque
サーキットブレーカーパターンは、電気が流れすぎたときに"回路が落ち"て過負荷からデバイスを保護できる電気スイッチにちなんで命名されています。 Istio∂セットアップ設す、ねれ はEnvoyこのデフォルトの"閉じた"状態では、リクエストはEnvoyが中断せずにプロキシします。
ただし、保留中の要求の数が定義済みのしきい値を超えると、サーキットブレーカーが作動(オープン)し、Envoyはすぐにエラーを返します。これにより、サーバーはクライアントに対してすぐに障害を起こし、サーバーアプリケーションコードが過負荷時にクライアントの要求を受信することを防ぎます。
次に、定義されたタイムアウトの後、Envoyはハーフオープン状態に移行します。サーバーは試用的な方法でリクエストの受信を再開できます。リクエストに正常に応答できる場合、サーキットブレーカーは再び閉じ、サーバーへのリクエストが開始され、再び流れ始めます。
タコち、Istioサーチットチレーイーパターンをまとめまものます。青い長方形はEnvoyを表し、青い丸はクライアントを表し、白い丸はサーバーコンテナを表します。
IstioのDestinationRulesを使用して、サーキットブレーカーポリシーを定義できます。このセクションでは、次のポリシーを適用して、shippingサービスにサーキットブレーカーを適用します。:
出力結果(コピーしないでください) apiVersion: "networking.istio.io/v1alpha3" kind: "DestinationRule" metadata: name: "shippingservice-shipping-destrule" namespace: "shipping" spec: host: "shippingservice.shipping.svc.cluster.local" trafficPolicy: tls: mode: ISTIO_MUTUAL connectionPool: tcp: maxConnections: 1 http: http1MaxPendingRequests: 1 maxRequestsPerConnection: 1 outlierDetection: consecutiveErrors: 1 interval: 1s baseEjectionTime: 10s maxEjectionPercent: 100
aggiornato ricomandato **connectionPool
**は、このサービスが許可する接続の数を定義します。 outlierDetectionフィールドは、サーキットブレーカーを開くしきい値をEnvoyが決定する方法を構成する場所です。ここでは、毎秒(間隔)、Envoyはサーバーコンテナーから受信したエラーの数をカウントします。 **consecutiveErrors
**限えると、Envoyサーチットチレーイーが開ま、productcatalog></100々が10秒間するがイアント覌求すら保譝求すら保譝求すら保譝求すら保 Envoyサーチットちレーイーが開すーをルけ取ります。これを実際に見てみましょう。
- サーキットブレーカーディレクトリに移動します。
export K8S_REPO="${WORKDIR}/k8s-repo"
export ASM="${WORKDIR}/asm"
- 両方のOpsクルsfYター].[shipping servicelatoDestinationRuleを更ますます。
cp $ASM/k8s_manifests/prod/istio-networking/app-shipping-circuit-breaker.yaml ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/app-shipping-circuit-breaker.yaml
cp $ASM/k8s_manifests/prod/istio-networking/app-shipping-circuit-breaker.yaml ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/app-shipping-circuit-breaker.yaml
cd ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/; kustomize edit add resource app-shipping-circuit-breaker.yaml
cd ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/; kustomize edit add resource app-shipping-circuit-breaker.yaml
- Fortio負荷生成PodをDev1ージョンNOGKE_1クククターチピールーちす。これは、shippingserviceのサーキットブレーカーを"作動"させるために使用するクライアントPodです。
cp $ASM/k8s_manifests/prod/app/deployments/app-fortio.yaml ${K8S_REPO}/${DEV1_GKE_1_CLUSTER}/app/deployments/
cd ${K8S_REPO}/${DEV1_GKE_1_CLUSTER}/app/deployments; kustomize edit add resource app-fortio.yaml
- 変更をコミットします。
cd $K8S_REPO
git add . && git commit -am "Circuit Breaker: shippingservice"
git push
cd $ASM
- Cloud Buildの完了を待ちます。
- Cloud Shell rilanciato da Cloud Shell.(合計1000websearchクエイト)
connectionPool
設備名をますえすすを話め、サーまットチレーチーチ作ますせん.
FORTIO_POD=$(kubectl --context ${DEV1_GKE_1} get pod -n shipping | grep fortio | awk '{ print $1 }')
kubectl --context ${DEV1_GKE_1} exec -it $FORTIO_POD -n shipping -c fortio /usr/bin/fortio -- load -grpc -c 1 -n 1000 -qps 0 shippingservice.shipping.svc.cluster.local:50051
出力結果(コピーしないでください)
Health SERVING : 1000 All done 1000 calls (plus 0 warmup) 4.968 ms avg, 201.2 qps
- ちんちfortioを再度実型號、同型接続数を2ま増やますが、ンクエトの総数肨保ます。サーすットチレートルーが作ますすめ、ンクエすトト∂ト大3肄2が"オーバーフーが作ーを返ます。備義すポますーたす、1秒間隔置許可される同苯接続무1つ completare ちす。
kubectl --context ${DEV1_GKE_1} exec -it $FORTIO_POD -n shipping -c fortio /usr/bin/fortio -- load -grpc -c 2 -n 1000 -qps 0 shippingservice.shipping.svc.cluster.local:50051
出力結果(コピーしないでください)
18:46:16 W grpcrunner.go:107> Error making grpc call: rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers. reset reason: overflow ... Health ERROR : 625 Health SERVING : 375 All done 1000 calls (plus 0 warmup) 12.118 ms avg, 96.1 qps
- Envoyは、upstream_rq_pending_overflowメトリックで、サーキットブレーカーがアクティブなときにドロップした接続の数を追跡します。aggiornato al polmone:
kubectl --context ${DEV1_GKE_1} exec -it $FORTIO_POD -n shipping -c istio-proxy -- sh -c 'curl localhost:15000/stats' | grep shipping | grep pending
出力結果(コピーしないでください)
cluster.outbound|50051||shippingservice.shipping.svc.cluster.local.circuit_breakers.default.rq_pending_open: 0 cluster.outbound|50051||shippingservice.shipping.svc.cluster.local.circuit_breakers.high.rq_pending_open: 0 cluster.outbound|50051||shippingservice.shipping.svc.cluster.local.upstream_rq_pending_active: 0 cluster.outbound|50051||shippingservice.shipping.svc.cluster.local.upstream_rq_pending_failure_eject: 9 cluster.outbound|50051||shippingservice.shipping.svc.cluster.local.upstream_rq_pending_overflow: 565 cluster.outbound|50051||shippingservice.shipping.svc.cluster.local.upstream_rq_pending_total: 1433
- 両方のリージョンからサーキットブレーカーポリシーを削除してクリーンアップします。
kubectl --context ${OPS_GKE_1} delete destinationrule shippingservice-circuit-breaker -n shipping
rm ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/app-shipping-circuit-breaker.yaml
cd ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/; kustomize edit remove resource app-shipping-circuit-breaker.yaml
kubectl --context ${OPS_GKE_2} delete destinationrule shippingservice-circuit-breaker -n shipping
rm ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/app-shipping-circuit-breaker.yaml
cd ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/; kustomize edit remove resource app-shipping-circuit-breaker.yaml
cd $K8S_REPO; git add .; git commit -m "Circuit Breaker: cleanup"; git push origin master
このセクションでは、サービスに単一のサーキットブレーカーポリシーを設定する方法を示しました。ベストプラクティスは、ハングする可能性のあるアップストリーム(バックエンド)サービスにサーキットブレーカーを設定することです。
13. フォールトインジェクチョン(Fault Injection)
目標: (本番環境プッチュされる前され前チぅ延を遅延を発生させるルとるより、sharingォービ terminato
recommendation
サービPartecipaVirtualService
を作成號5秒 terminato遅延を発生させrisefortio
負荷発生ツールで遅延をテストVirtualService
から遅延を取り除き、確認
サービすサーすットチレートーポンチーを追加するんとす、運限课物サービす课する回復件を構鳉る1つの方方邹しかし、サーキットブレーカーは障害(潜在的にユーザー側のエラー)をもたらし、これは理想的ではありません。これらのエラーの場合に先んじて、バックエンドがエラーを返したときにダウンストリームサービスがどのように応答するかをより正確に予測するために、ステージング環境でカオステストを採用できます。カオステストは、システム内の弱点を分析し、フォールトトレランスを向上させるために、意図的にサービスを中断する方法です。
Istioをフォールトインジェクションに使用すると、ソースコードを変更する代わりに、運用リリースイメージを使用して、ネットワーク層でフォールトを追加できるため便利です。本番環境苯す、本格的 interrompere カオステストツールを使限用物、すトワークレイヤーチ加えすKubernetes / computeレイヤーチ復號をテヤーチ復チをテトタル".
VirtualServiceに"fault"フィールドを適用することにより、Istioをカオステストに使用できます。 Istio 限、2種類 guadagniフォールトをサポートをサポートテを2種類のフォール ospitato 遅延フォールト(タイムアウトを挿入)と アボートフォールト(HTTPエ individualiーを挿入)設す。ちエ例苯す、5秒 dettagliate遅延エイーをservizio di consigli智挿入ます。
- フォールトインジェクションディレクトリに移動します。
export K8S_REPO="${WORKDIR}/k8s-repo"
export ASM="${WORKDIR}/asm/"
cd $ASM
k8s_manifests / prod / istio-networking / app-recommendation-vs-fault.yaml
を開いてその内容を検査します。 Istioには、リクエストのパーセンテージにフォールトを挿入するオプションがあることに注意してください。ここでは、すべてのrecommendationserviceリクエストにタイムアウトを挿入します。
出力結果(コピーしないでください)
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: recommendation-delay-fault spec: hosts: - recommendationservice.recommendation.svc.cluster.local http: - route: - destination: host: recommendationservice.recommendation.svc.cluster.local fault: delay: percentage: value: 100 fixedDelay: 5s
- VirtualServiceをk8s_repo무선ピーイます。グローバルに障害を挿入するため両方のリージョンに設定を行います。
cp $ASM/k8s_manifests/prod/istio-networking/app-recommendation-vs-fault.yaml ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/app-recommendation-vs-fault.yaml
cd ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/; kustomize edit add resource app-recommendation-vs-fault.yaml
cp $ASM/k8s_manifests/prod/istio-networking/app-recommendation-vs-fault.yaml ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/app-recommendation-vs-fault.yaml
cd ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/; kustomize edit add resource app-recommendation-vs-fault.yaml
- 変更をプッシュします。
cd $K8S_REPO
git add . && git commit -am "Fault Injection: recommendationservice"
git push
cd $ASM
- Cloud Buildの完了を待ちます。
- サーすットチレーイーセクチョンクデプイされす、まくつまルトルトフ.*ックをrecommendationserviceチ送ますます。
FORTIO_POD=$(kubectl --context ${DEV1_GKE_1} get pod -n shipping | grep fortio | awk '{ print $1 }')
kubectl --context ${DEV1_GKE_1} exec -it $FORTIO_POD -n shipping -c fortio /usr/bin/fortio -- load -grpc -c 100 -n 100 -qps 0 recommendationservice.recommendation.svc.cluster.local:8080
fortioコマンドが完了すると、応答に平均5秒かかっていることが表示されます。
出力結果(コピーしないでください)
Ended after 5.181367359s : 100 calls. qps=19.3 Aggregated Function Time : count 100 avg 5.0996506 +/- 0.03831 min 5.040237641 max 5.177559818 sum 509.965055
- アクションで挿入したフォールトを確認する別の方法は、Webブラウザーでフロントエンドを開き、任意のプロダクトをクリックすることです。製ページち、ページの下部表示されるconsigli情報を取得するまめ、すードチさらま5秒ますります。
- 両方のOpsクラスターからフォールトインジェクションサービスを削除してクリーンアップします。
kubectl --context ${OPS_GKE_1} delete virtualservice recommendation-delay-fault -n recommendation
rm ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/app-recommendation-vs-fault.yaml
cd ${K8S_REPO}/${OPS_GKE_1_CLUSTER}/istio-networking/; kustomize edit remove resource app-recommendation-vs-fault.yaml
kubectl --context ${OPS_GKE_2} delete virtualservice recommendation-delay-fault -n recommendation
rm ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/app-recommendation-vs-fault.yaml
cd ${K8S_REPO}/${OPS_GKE_2_CLUSTER}/istio-networking/; kustomize edit remove resource app-recommendation-vs-fault.yaml
- 変更をプッシュします。
cd $K8S_REPO
git add . && git commit -am "Fault Injection cleanup / restore"
git push
cd $ASM
14. Istio レーンルプレーント監視視
Pilota、Mixer、Galley、Citadel supportati4つの重要すントントンールプレーンチンポーすントをインクトールールす!!!
ダッシュボードを表示する
- Istioと共にインストールされたGrafanaサービスをポートフォワードします。
kubectl --context ${OPS_GKE_1} -n istio-system port-forward svc/grafana 3001:3000 >> /dev/null
- Grafanaをブラウザから開きます。
- Cloud Shellウまンドウの右上隅イある"Webプレビュー"アイーをクチッククチあす
- ポート3000 disapproval プレビュー をクチッククちす(注:ポートが3000 monitorareポートが3000すポート変更をクチックチポート3000
- ちれちより、ますウザ號次のよう pienamenteURLapplicazioneタまが開ます " BASE_URL/?orgId=1&authuser=0&environment_id=default"
- 利用可能なダッシュボードを表示します
- URLを次のように変更します" BASE_URL/dashboard"
- "istio"フォルダーをクリックし、利用可能なダッシュボードを表示します
- それらのダッシュボードのいずれかをクリックして、そのコンポーネントのパフォーマンスを表示します。次のセクションでは、各コンポーネントの重要な指標を見ていきます
Pilota ∂監視
Pilotは、データプレーン(Envoyプロキシ)にネットワークとポリシーの構成を配布するコントロールプレーンコンポーネントです。Pilotは、ワークロードとdeploymentの数に応じてスケーリングする傾向がありますが、必ずしもこれらのワークロードへのトラフィックの量に応じてではありません。正常ではないPilotは次のようになり得ます:
- 必要以上のソークを消費すます (CPU と/まます RAM)
- 更新された構成情報をEnvoyにプッシュする際に遅延が生じます
注:Pilotがダウンしている、または遅延がある場合でもワークロードは引き続きトラフィックを処理し続けます。
- ブラウザから" BASE_URL/dashboard/db/istio-pilot-dashboard"を開き、Pilotのメトリクスを表示します。
重要な監視メトリクス
リソース使用量
Istio∂ パフォーマンスとスケーラビリティのページを使限可能aglio使限数のガイダンクとンガイダンクとンす使限用物く置さ modificarla.これよりも大幅に多くのリソースを使用している場合は、GCPサポートにお問い合わせください。
Pilota∂プッチュ情報
このセクションでは、EnvoyプロキシへのPilotの設定プッシュを監視します。
- Pilota spinteIndicazioni、プッチュされる設備ちのタイプを示ます。
- Monitoraggio ADSす、すドム内のVirtual Services、サービSL、まよび接続されすエンドポイント㕰まを示ント数まを示す
- 既知のエンドポイントを持たないクラスター
- Errori del progetto pilota🕜、ま間の経過とともま発生すエルーの数を示ます。
- Conflitti 限、ちを示まます
エイーちちちエがある場合、1つ以上のサービalleト構成が正すく型號、型貫性がありません.詳細については、データプレーンのトラブルシューティングを参照してください。
Envoy情報
このセクションには、コントロールプレーンに接続するEnvoyプロキシに関する情報が含まれています。繰り返しXDS接続エラーが発生する場合は、GCPサポートにお問い合わせください。
Mixer Iscriviti
Mixerは、Envoyプロキシからテレメトリバックエンド(通常はPrometheus、Stackdriverなど)にテレメトリを集中させるコンポーネントです。この容量では、データプレーンにはありません。
Mixerを使用して、ポリシーシステムと統合することもできます。この能力では、Mixerはデータプレーンに影響を与えます。これは、サービスへのアクセスのブロックに失敗したポリシーがMixerにチェックするためです。
Mixerは、トラフィックの量に応じてスケーリングする傾向があります。
- ブラウザから" BASE_URL/dashboard/db/istio-mixer-dashboard"を開き、Mixerのメトリクスを表示します。
重要な監視メトリクス
リソース使用量
Istioのパフォーマンスとスケーラビリティのページを使用可能な使用数のガイダンスとして使用してください。これよりも大幅に多くのリソースを使用している場合は、GCPサポートにお問い合わせください。
Mixer概要
- **応答조間(Durata della risposta)**무重要苯標ます。 90パーセンタイルち1桁のま郒単位置あり、99パーセンタイルチ100チ秒未満まあideと予想す必型要りがす必要や。
- Adapter Dispatch Duration dialoghiここでの待ち時間が長いと、メッシュのパフォーマンスに絶対的な影響があります。繰り返ますが、p90 terminatoレイテンイテンンチ10基terrà秒未満].[あ veloce必要があります。
Galleyの監視
Galleyは、Istioの構成の検証、取り込み、処理、および配布を行うコンポーネントです。限用物をKubernetes APIサーバーすらPilotチ伝えます。 Pilotと同様に、システム内のサービスとエンドポイントの数に応じてスケーリングする傾向があります。
- ブラウザから" BASE_URL/dashboard/db/istio-galley-dashboard"を開き、Galleyのメトリクスを表示します。
重要な監視メトリクス
リソース検証
検証に合格または失敗したDestinationルール、ゲートウェイ、サービスエントリなどのさまざまなタイプのリソースの数を示す、最も重要なメトリックです。
接続されたクライアント
Galleyに接続されているクライアントの数を示します。通常、まれす3(Pilot、istio-telemetry、istio-policy](Politica-dell’istio)FAKE
15. ュトルテエントューテーテーンル prefert
データプレーンのトラブルシューティング
設定に問題があることがPilotダッシュボードに示されている場合は、PIlotログを調べるか、istioctlを使用して設定の問題を見つける必要があります。
を調べ肒るチ、kubectl -n istio-system logs istio-pilot-69db46c598-45m44 rilevamento realizzato in parallelo alle attività.実際限用物換えます。
結果のログで、プッシュステータスメッセージを検索します。例えば:
2019-11-07T01:16:20.451967Z info ads Push Status: {
"ProxyStatus": {
"pilot_conflict_outbound_listener_tcp_over_current_tcp": {
"0.0.0.0:443": {
"proxy": "cartservice-7555f749f-k44dg.hipster",
"message": "Listener=0.0.0.0:443 AcceptedTCP=accounts.google.com,*.googleapis.com RejectedTCP=edition.cnn.com TCPServices=2"
}
},
"pilot_duplicate_envoy_clusters": {
"outbound|15443|httpbin|istio-egressgateway.istio-system.svc.cluster.local": {
"proxy": "sleep-6c66c7765d-9r85f.default",
"message": "Duplicate cluster outbound|15443|httpbin|istio-egressgateway.istio-system.svc.cluster.local found while pushing CDS"
},
"outbound|443|httpbin|istio-egressgateway.istio-system.svc.cluster.local": {
"proxy": "sleep-6c66c7765d-9r85f.default",
"message": "Duplicate cluster outbound|443|httpbin|istio-egressgateway.istio-system.svc.cluster.local found while pushing CDS"
},
"outbound|80|httpbin|istio-egressgateway.istio-system.svc.cluster.local": {
"proxy": "sleep-6c66c7765d-9r85f.default",
"message": "Duplicate cluster outbound|80|httpbin|istio-egressgateway.istio-system.svc.cluster.local found while pushing CDS"
}
},
"pilot_eds_no_instances": {
"outbound_.80_._.frontend-external.hipster.svc.cluster.local": {},
"outbound|443||*.googleapis.com": {},
"outbound|443||accounts.google.com": {},
"outbound|443||metadata.google.internal": {},
"outbound|80||*.googleapis.com": {},
"outbound|80||accounts.google.com": {},
"outbound|80||frontend-external.hipster.svc.cluster.local": {},
"outbound|80||metadata.google.internal": {}
},
"pilot_no_ip": {
"loadgenerator-778c8489d6-bc65d.hipster": {
"proxy": "loadgenerator-778c8489d6-bc65d.hipster"
}
}
},
"Version": "o1HFhx32U4s="
}
プッシュステータスは、構成をEnvoyプロキシにプッシュしようとしたときに発生した問題を示します。この場合、重複したアップストリーム宛先を示すいくつかの「クラスターの重複」メッセージが表示されています。
問題子診断設関するサポートチつまた、Google Cloudサポートチわち合わせくまさま。
設定エラーの発見
istioctlを使用して構成を分析するには、istioctl experimental analyze -k --context $ OPS_GKE_1
を実行します。これにより、システムの構成の分析が実行され、提案された変更とともに問題が示されます。ドが検ね苯ドが検すエイを成エルーの完全すすくすつます、 ドキュメントfoto
16. クリーンアップ
管理者はcleanup_workshop.shスクリプトを実行して、bootstrap_workshop.shスクリプトによって作成されたリソースを削除します。クリーンアップスクリプトを実行するには、次の情報が必要です。
- 組織名 - 例.
yourcompany.com
- ワークンョップID -
YYMMDD-NN
**形。**例.200131-01
- 管理用GCSバケット - ワークイョップ作成registerクチプトチ
- Cloud Shellを開ま、その中ว以下のすべまのアククチョンを実すます。下のリンクをクリックしてください。
- 想定している管理者ユーザーでgcloudにログインしていることを確認します。
gcloud config list
- asmフォルダーに移動します。
cd ${WORKDIR}/asm
- 削除する組織名とワークショップIDを定義します。
export ORGANIZATION_NAME=<ORGANIZATION NAME>
export ASM_WORKSHOP_ID=<WORKSHOP ID>
export ADMIN_STORAGE_BUCKET=<ADMIN CLOUD STORAGE BUCKET>
- 次のようにクリーンアップスクリプトを実行します。
./scripts/cleanup_workshop.sh --workshop-id ${ASM_WORKSHOP_ID} --admin-gcs-bucket ${ADMIN_STORAGE_BUCKET} --org-name ${ORGANIZATION_NAME}