本教程适用于有意使用 Istio 服务网格安全地部署 Kubernetes Service 并启用双向 TLS (mTLS) 通信的 Kubernetes 用户和管理员。
Istio 和 Cloud Service Mesh
Istio 不是受支持的 Google 产品。我们建议改为运行托管式 Cloud Service Mesh。如需了解详情,请参阅在 GKE Autopilot 集群上预配 Cloud Service Mesh。
Cloud Service Mesh 具有以下优势:
- 您可以使用 Fleet API 预配托管式 Cloud Service Mesh,而无需
istioctl
等客户端工具。 - Cloud Service Mesh 会自动将边车代理注入到工作负载中,而无需向容器授予提升的权限。
- 您无需进行任何额外配置,即可查看适用于网格和服务的丰富信息中心,然后使用这些指标配置服务等级目标 (SLO) 和提醒,以监控应用的运行状况。
- 托管式 Cloud Service Mesh 控制平面会自动升级,以确保您获得最新的安全补丁和功能。
- Cloud Service Mesh 托管式数据平面会自动升级工作负载中的边车代理,以便在代理升级和安全补丁可用时,您无需自行重启服务。
- Cloud Service Mesh 是受支持的产品,可以使用标准开源 Istio API 进行配置。如需了解详情,请参阅支持的功能。
目标
本教程包括以下步骤:
- 创建 GKE Autopilot 集群。
- 使用
istioctl
命令行工具安装 Istio。 - 部署一个示例应用以测试双向 TLS (mTLS) 身份验证。
- 使用
PeerAuthentication
自定义资源将 Istio 配置为使用 mTLS 身份验证进行服务到服务通信。 - 使用 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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/container.clusterAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
准备环境
如需设置您的环境,请按以下步骤操作:
设置环境变量:
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 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 2m57s
当 Istio Pod 处于
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
当 Pod 处于
Running
状态时,按Ctrl+C
返回到命令行。请查看以下清单:
此清单描述了公开应用并使用 Istio 作为 Ingress 控制器的 Istio 网关和 VirtualService 资源。
将清单应用到您的集群:
kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
配置 mTLS
默认情况下,Istio 中会启用双向 TLS (mTLS) 身份验证。这意味着 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 验证 mTLS 身份验证是否已启用且在 Istio 服务网格中正常运行。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
请查看以下清单:
此清单描述了一个定义 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
当 Pod 处于
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 架构中心。