本教學課程適用於 Kubernetes 使用者和管理員,協助他們瞭解如何使用 Istio 服務網格安全地部署 Kubernetes 服務,並啟用相互 TLS (mTLS) 通訊。
Istio 和 Cloud Service Mesh
Istio 不是 Google 支援的產品。建議改用受管理 Cloud Service Mesh。詳情請參閱「在 GKE 上佈建代管 Cloud Service Mesh 控制層」。
Cloud Service Mesh 具有下列優點:
- 您可以使用 Fleet API 佈建代管 Cloud Service Mesh,不需使用
istioctl等用戶端工具。 - Cloud Service Mesh 會自動將 Sidecar Proxy 插入工作負載,不需授予容器進階權限。
- 您無須額外設定,即可查看網格和服務的豐富資訊主頁,然後使用這些指標設定服務等級目標 (SLO) 和快訊,監控應用程式的健康狀態。
- 代管 Cloud Service Mesh 控制層會自動升級,確保您取得最新的安全性修補程式和功能。
- Cloud Service Mesh 代管資料層會自動升級工作負載中的 Sidecar Proxy,因此當 Proxy 升級和安全性修補程式可用時,您不需要自行重新啟動服務。
- Cloud Service Mesh 是支援的產品,可使用標準開放原始碼 Istio API 進行設定。詳情請參閱「支援的功能」。
目標
本教學課程包含下列步驟:
- 建立 GKE Autopilot 叢集。
- 使用
istioctl指令列工具安裝 Istio。 - 部署範例應用程式,測試相互傳輸層安全標準 (mTLS) 驗證。
- 使用
PeerAuthentication自訂資源,設定 Istio 使用 mTLS 驗證機制進行服務對服務通訊。 - 使用 Kiali 資訊主頁驗證 mTLS 驗證。
費用
在本文件中,您將使用下列 Google Cloud計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectl、gcloud CLI 和 Terraform。如果您未使用 Cloud Shell,則必須安裝 gcloud CLI。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為要建立的專案名稱。 Google Cloud -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
如果尚未啟用,請啟用 GKE API:
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為要建立的專案名稱。 Google Cloud -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
如果尚未啟用,請啟用 GKE API:
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
-
將角色授予使用者帳戶。針對下列各個 IAM 角色執行下列指令一次:
roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
準備環境
如要設定環境,請按照下列步驟操作:
設定環境變數:
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:
如要安裝最新版本 Istio,請按照下列步驟操作:
curl -L https://istio.io/downloadIstio | sh -如要安裝特定版本的 Istio,請按照下列步驟操作:
export ISTIO_VERSION=VERSION_NUMBER curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -將 VERSION_NUMBER 替換為要安裝的 Istio 版本。如要瞭解 Istio 版本,請參閱版本公告。
將
istioctl指令列工具新增至 PATH:cd istio-* export PATH=$PWD/bin:$PATH在叢集上安裝 Istio:
istioctl install --set profile="default" -y這個步驟可能需要幾分鐘才能完成。
等待 Istio Pod 準備就緒:
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 2m57sIstio Pod
Running後,請按下Ctrl+C返回指令列。
部署範例應用程式
在本節中,您將使用 Bank of Anthos 範例應用程式,建立具有 mTLS 驗證的服務網格。
新增命名空間標籤,指示 Istio 啟用 Envoy Sidecar Proxy 的自動插入功能:
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 3m4sPod
Running後,請按下Ctrl+C返回指令列。請查看下列資訊清單:
這個資訊清單說明 Istio Gateway 和 VirtualService 資源,這些資源會公開應用程式,並將 Istio 做為 Ingress 控制器。
將資訊清單套用至叢集:
kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
設定 mTLS
Istio 預設會啟用雙向傳輸層安全標準 (mTLS) 驗證。也就是說,Istio 會監控已遷移至 Istio Proxy 的伺服器工作負載,並自動設定用戶端 Proxy,與這些工作負載建立 mTLS 連線。此外,Istio 也會設定用戶端 Proxy,在連線至沒有 Sidecar Proxy 的工作負載時,不要使用 mTLS。
Istio 可將 mTLS 設定為下列三種模式:
PERMISSIVE:工作負載會接受 mTLS 和純文字流量。STRICT:工作負載只接受 mTLS 流量。DISABLE:mTLS 已停用。如要使用自己的安全解決方案,請使用這個模式。
您可以全域套用 mTLS 設定,也可以為每個命名空間或工作負載套用設定。在本教學課程中,您將使用 STRICT mTLS 模式,為每個命名空間套用設定。
請查看下列資訊清單:
這個資訊清單說明對等互連驗證 Istio 自訂資源。
將資訊清單套用至叢集:
kubectl apply -f peer-authentication.yaml
如要進一步瞭解 Istio 中的 mTLS,請參閱「相互傳輸層安全標準 (mTLS) 驗證」。
確認已啟用 mTLS
Kiali 是 Istio 服務網格的網頁式觀測能力資訊主頁,提供微服務環境的圖形檢視畫面,方便您監控及排解應用程式問題。您可以使用 Kiali 驗證 mTLS 驗證是否已啟用,且在 Istio 服務網格中正常運作。Kiali 需要 Prometheus 做為遙測資料來源。本教學課程會使用 Google Cloud Managed Service for Prometheus。
安裝查詢介面
為監控查詢介面建立 Kubernetes 命名空間:
kubectl create namespace monitoring將
roles/monitoring.viewer角色授予monitoring命名空間中的defaultKubernetes ServiceAccount,以便查詢介面使用 Workload Identity Federation for GKE 讀取指標:PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/monitoring/sa/default" \ --role=roles/monitoring.viewer \ --condition=None部署查詢介面工作負載:
kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml查看下列資訊清單:
這個資訊清單說明
PodMonitoring資源,用於收集 Istio 和 Envoy Proxy 指標。將資訊清單套用至叢集:
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查看下列資訊清單:
這個資訊清單說明定義 Kiali 伺服器的 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 kiali-5f6b7c8d9-abcde 1/1 Running 0 1mPod
Running後,請按下Ctrl+C返回指令列。在 Kiali 伺服器服務上設定通訊埠轉送,即可存取資訊主頁:
kubectl -n istio-system port-forward svc/kiali 8080:20001開啟網頁預覽。在 Kiali 中,前往「Graph」部分,然後在「Display」下拉式選單中選取「Security」選項。這個檢視畫面會顯示圖表中每個節點的安全狀態。如果節點顯示「已啟用 mTLS」徽章,表示該服務已啟用 mTLS;如果節點未顯示徽章,表示 mTLS 未啟用。
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
刪除 Google Cloud 專案:
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 --location us-central1 istio-cluster --quiet
後續步驟
- 探索 Google Cloud 的參考架構、圖表和最佳做法。歡迎瀏覽 Cloud Architecture Center。