使用共享控制层面、单 VPC 架构在 GKE 上构建多集群服务网格

本教程介绍如何使用 Istio 多集群服务网格跨多个 Kubernetes 集群部署应用。Istio 多集群服务网格 通过 Istio 多集群服务网格,多个 Kubernetes 集群上运行的服务可彼此安全通信。Kubernetes 集群可在任何位置运行,甚至可在不同的云平台上运行,例如在 Google Cloud 中运行的 Kubernetes Engine (GKE) 集群或在本地数据中心内运行的 Kubernetes 集群。

Istio服务网格的一种开源实现,您可用它来发现、动态路由并安全连接到 Kubernetes 集群上运行的 Service。Istio 还提供了一个政策驱动型框架,用于在网格中实现路由、负载平衡、节流、遥测、断路、身份验证和服务调用授权,且只需极少或完全不需要更改应用代码。安装在 Kubernetes 集群中时,Istio 会使用 Kubernetes Service 注册表自动发现集群中运行的互连服务(即微服务)并为其创建一个服务网格。

Istio 的组件可以用数据层面和控制层面进行描述。数据层面负责承载网格中的网络流量,而控制层面负责配置和管理网格:

  • 数据层面:Istio 通过注入一个 Sidecar 来为网格中 Service 的每个 Pod 运行一个代理,从而参与 Service 通信。Sidecar 会运行一个名为 Envoy 的智能代理,以实现 Service 的网络路由、安全性和可观测性。
  • 控制层面:一个名为 Pilot 的组件负责为 Envoy Sidecar 提供配置。名为 Citadel 的组件会向每个 Service 分配证书。

一个 Kubernetes 集群中运行的微服务可能需要与在其他 Kubernetes 集群中运行的微服务进行通信。例如,可能微服务需要跨地区和跨环境通信,也可能微服务的所有者要维护自己的 Kubernetes 集群。利用 Istio,您可以跨多个 Kubernetes 集群创建服务网格,将远程集群中运行的微服务(甚至 Kubernetes 之外的虚拟机中运行的外部微服务)包含在内。

Istio 为多集群部署提供下面两种主要配置:

共享 Istio 控制层面配置会使用在其中一个集群上运行的 Istio 控制层面。该控制层面的 Pilot 负责管理本地和远程集群上的 Service 配置,并为所有集群配置 Envoy Sidecar。此配置会生成单个 Istio 服务网格,其中包含多个 Kubernetes 集群中运行的 Service。在共享控制层面配置中,Istio 控制层面集群中运行的 Pilot 必须具有对每个集群中运行的所有 Pod 的 IP 地址访问权限。

您可以通过两种方式之一在集群之间实现 Pod 到 Pod 的 IP 地址连接:

  1. 您可以在层面网络(例如单个 VPC)中创建所有集群,其中防火墙规则应允许集群之间进行 Pod 到 Pod 的 IP 地址连接。集群也可能存在于连接 VPN 的网络中。在任一情况下,控制集群中的 Pilot Pod 都可以通过 Pod IP 地址直接访问远程集群中的所有 Pod。
  2. 您的集群不在单个网络中,并且依赖于控制集群中 Pilot Pod 的不同机制来访问远程集群中的 Pod。在这种情况下,Pilot Pod 无法使用 Pod IP 地址直接访问其他 Pod,因此需要使用 Istio Ingress 网关实现不同网络中集群之间的网络连接。

在本教程中,您将使用单个 VPC 网络中的共享控制层面架构,在两个 GKE 集群中部署 Istio。Istio 控制层面集群中的 Pilot Pod 将具有与远程集群中运行的 Pod 的直接 IP 地址连接。在本教程中,您将使用一个 10 层演示微服务应用 Online Boutique,它被拆分到两个 GKE 集群中。微服务以不同的编程语言编写。如需了解每个微服务所用的语言,请参阅 README 页面

您需在 Google Cloud 项目中构建以下架构。

在两个集群中部署 10 个微服务的架构。

在此架构中,您有一个 control 集群和一个 remote 集群。Istio 控制层面部署在 control 集群上。这两个集群与本地(在同一集群中)和非本地(在另一集群中)的各种微服务进行通信。

目标

  • 在单个 VPC 中创建两个 GKE 集群,即 controlremote
  • 在这两个 GKE 集群上以多集群模式安装 Istio,并在 control 集群上部署 Istio 控制层面。
  • 安装在这两个集群中拆分的 Online Boutique 应用。
  • 观察这两个集群中展开的服务网格。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 GKE and Cloud Source Repositories API。

    启用 API

设置环境

请通过 Cloud Shell 运行本教程中的所有终端命令。

  1. 在 Google Cloud Console 中,打开 Cloud Shell:

    打开 Cloud Shell

  2. 克隆以下 GitHub 代码库,下载本教程所需的文件:

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/istio-multicluster-gke.git
    
  3. 将代码库文件夹设为 $WORKDIR 文件夹,您将在该文件夹中执行与本教程相关的所有任务:

    cd $HOME/istio-multicluster-gke
    WORKDIR=$(pwd)
    

    完成本教程后,您可以删除该文件夹。

  4. 安装 kubectx/kubens

    git clone https://github.com/ahmetb/kubectx $WORKDIR/kubectx
    export PATH=$PATH:$WORKDIR/kubectx
    

    借助这些工具,您可通过切换上下文或命名空间更轻松地处理多个 Kubernetes 集群。

创建 GKE 集群

在本部分中,您将在启用别名 IP 地址的默认 VPC 中创建两个 GKE 集群。使用别名 IP 地址范围,GKE 集群可以分配来自 Google Cloud 已知的 CIDR 地址块的 IP 地址。此配置会导致 Pod IP 地址本身可在 VPC 中路由,从而使得不同集群中的 Pod 具有直接 IP 地址连接。

  1. 在 Cloud Shell 中,创建两个 GKE 集群:一个集群名为 control,其中安装 Istio 控制层面,另一个集群名为 remote,将添加到 Istio 多集群服务网格。您可以在默认 VPC 中创建这两个集群,但应在不同的地区中。

    gcloud container clusters create control --zone us-west2-a \
        --machine-type "e2-standard-4" --disk-size "100" \
        --num-nodes "4" --network "default" --enable-ip-alias --async
    
    gcloud container clusters create remote --zone us-central1-f \
        --machine-type "e2-standard-4" --disk-size "100" \
        --num-nodes "4" --network "default" --enable-ip-alias
    
  2. 稍等几分钟,直到这两个集群都创建完成。验证每个集群的状态是否为 RUNNING

    gcloud container clusters list
    

    输出内容类似如下:

    NAME     LOCATION       MASTER_VERSION   MASTER_IP      MACHINE_TYPE   NODE_VERSION     NUM_NODES  STATUS
    remote   us-central1-f  1.19.9-gke.1400  34.70.12.109   e2-standard-4  1.19.9-gke.1400  4          RUNNING
    control  us-west2-a     1.19.9-gke.1400  34.94.220.232  e2-standard-4  1.19.9-gke.1400  4          RUNNING
    
  3. 在本教程中,将 KUBECONFIG 变量设置为使用新的 kubeconfig 文件:

    touch ${WORKDIR}/istiokubecfg
    export KUBECONFIG=${WORKDIR}/istiokubecfg
    
  4. 连接到这两个集群,以在 kubeconfig 文件中生成相关条目:

    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    gcloud container clusters get-credentials control --zone us-west2-a --project ${PROJECT_ID}
    gcloud container clusters get-credentials remote --zone us-central1-f --project ${PROJECT_ID}
    

    kubeconfig 文件用于集群身份验证。创建 kubeconfig 文件后,您可以快速切换集群之间的上下文。

  5. 为方便起见,请使用 kubectx 重命名上下文名称:

    kubectx control=gke_${PROJECT_ID}_us-west2-a_control
    kubectx remote=gke_${PROJECT_ID}_us-central1-f_remote
    

配置网络

在本部分中,您将配置 VPC 路由,以使两个集群中的 Pod 具有直接 IP 地址连接。为 GKE 集群启用别名 IP 地址范围时,系统会为每个集群创建两个次要子网。主要子网用于节点 IP 地址,而两个次要子网用于 Pod CIDR 和 Service IP 地址。

  1. 在 Cloud Shell 中,检查两个集群的次要 IP 地址:

    gcloud compute networks subnets describe default --region=us-west2 --format=json | jq '.secondaryIpRanges[]'
    gcloud compute networks subnets describe default --region=us-central1 --format=json | jq '.secondaryIpRanges[]'
    

    对于 control 集群,输出类似于以下内容:

    {
      "ipCidrRange": "10.56.0.0/14",
      "rangeName": "gke-control-pods-47496b0c"
    }
    {
      "ipCidrRange": "10.0.0.0/20",
      "rangeName": "gke-control-services-47496b0c"
    }
    

    对于 remote 集群,输出类似于以下内容:

    {
      "ipCidrRange": "10.0.16.0/20",
      "rangeName": "gke-remote-services-66101313"
    }
    {
      "ipCidrRange": "10.60.0.0/14",
      "rangeName": "gke-remote-pods-66101313"
    }
    
  2. 将集群的 Pod IP 范围和主要 IP 地址范围存储在变量中以备后用:

    CONTROL_POD_CIDR=$(gcloud container clusters describe control --zone us-west2-a --format=json | jq -r '.clusterIpv4Cidr')
    REMOTE_POD_CIDR=$(gcloud container clusters describe remote --zone us-central1-f --format=json | jq -r '.clusterIpv4Cidr')
    CONTROL_PRIMARY_CIDR=$(gcloud compute networks subnets describe default --region=us-west2 --format=json | jq -r '.ipCidrRange')
    REMOTE_PRIMARY_CIDR=$(gcloud compute networks subnets describe default --region=us-central1 --format=json | jq -r '.ipCidrRange')
    
  3. 为所有 IP CIDR 范围创建一个列表变量:

    ALL_CLUSTER_CIDRS=$CONTROL_POD_CIDR,$REMOTE_POD_CIDR,$CONTROL_PRIMARY_CIDR,$REMOTE_PRIMARY_CIDR
    

    您需要所有节点都能够彼此通信以及与 Pod CIDR 范围通信。

  4. 将集群节点的网络标记存储在变量中:

    ALL_CLUSTER_NETTAGS=$(gcloud compute instances list --format=json | jq -r '.[].tags.items[0]' | uniq | awk -vORS=, '{ print $1 }' | sed 's/,$/\n/')
    

    您稍后会在防火墙规则中使用这些网络标记。

  5. 创建一条防火墙规则,以允许集群的 Pod CIDR 范围和节点之间的流量:

    gcloud compute firewall-rules create istio-multicluster-rule \
        --allow=tcp,udp,icmp,esp,ah,sctp \
        --direction=INGRESS \
        --priority=900 \
        --source-ranges="${ALL_CLUSTER_CIDRS}" \
        --target-tags="${ALL_CLUSTER_NETTAGS}" --quiet
    

在两个 GKE 集群上安装 Istio

在本部分中,您将使用 Istio Operator 在这两个集群上的多集群配置中安装和配置 Istio。

  1. 在 Cloud Shell 中,下载 Istio:

    cd ${WORKDIR}
    export ISTIO_VER=1.9.5
    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VER} TARGET_ARCH=x86_64 sh -
    

    在生产环境中,为确保行为一致,建议对应用版本进行硬编码(即使用已知且经过测试的版本号)。

多集群服务网格部署要求您在网格中的所有集群之间建立信任。您可以使用通用根证书授权机构 (CA) 为多个集群生成中间证书。默认情况下,所有集群都会创建自签名证书。网格中的所有工作负载均使用根 CA 作为信任根。每个 Istio CA 都会使用由根 CA 签名的中间 CA 签名密钥和证书。当网格中存在多个 Istio CA 时,这会建立 CA 间的信任层次结构。Istio 代码库随附示例证书,仅供参考。在每个集群内,您可以使用之前创建的相应集群证书创建 istio-system 命名空间和一个名为 cacrts 的密钥。

  1. 在这两个 GKE 集群中创建一个 istio-system 命名空间和 cacerts Secret:

    kubectl --context control create namespace istio-system
    kubectl --context control create secret generic cacerts -n istio-system \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/ca-cert.pem \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/ca-key.pem \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/root-cert.pem \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/cert-chain.pem
    kubectl --context remote create namespace istio-system
    kubectl --context remote create secret generic cacerts -n istio-system \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/ca-cert.pem \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/ca-key.pem \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/root-cert.pem \
      --from-file=${WORKDIR}/istio-$ISTIO_VER/samples/certs/cert-chain.pem
    
  2. control 集群创建 istio 配置:

    cat <<EOF > ${WORKDIR}/istio_control.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      name: istio-control
    spec:
      values:
        global:
          meshID: mesh1
          multiCluster:
            clusterName: control
          network: network1
      components:
        ingressGateways:
          - name: istio-eastwestgateway
            label:
              istio: eastwestgateway
              app: istio-eastwestgateway
              topology.istio.io/network: network1
            enabled: true
            k8s:
              env:
                # sni-dnat adds the clusters required for AUTO_PASSTHROUGH mode
                - name: ISTIO_META_ROUTER_MODE
                  value: "sni-dnat"
                # traffic through this gateway should be routed inside the network
                - name: ISTIO_META_REQUESTED_NETWORK_VIEW
                  value: network1
              serviceAnnotations:
                cloud.google.com/load-balancer-type: "Internal"
                networking.gke.io/internal-load-balancer-allow-global-access: "true"
              service:
                ports:
                  - name: status-port
                    port: 15021
                    targetPort: 15021
                  - name: tls
                    port: 15443
                    targetPort: 15443
                  - name: tls-istiod
                    port: 15012
                    targetPort: 15012
                  - name: tls-webhook
                    port: 15017
                    targetPort: 15017
    EOF
    
  3. control 集群上安装 Istio 控制层面:

    ${WORKDIR}/istio-${ISTIO_VER}/bin/istioctl install --context control -f ${WORKDIR}/istio_control.yaml
    

    输入 y 以继续安装。Istio 完成安装需要 2-3 分钟。

  4. 验证所有 Istio 部署是否都在运行:

    kubectl --context control get pods -n istio-system
    

    当所有 Pod 都在运行或已完成时,表示 Istio 已准备就绪。

    输出内容类似如下:

    NAME                                     READY   STATUS    RESTARTS   AGE
    istio-eastwestgateway-69b49b9785-f5msp   1/1     Running   0          9m11s
    istio-ingressgateway-5c65f88f66-rdd2r    1/1     Running   0          52m
    istiod-6c56d9cbd8-k9klt                  1/1     Running   0          52m
    
  5. 等待系统为 istio-eastwestgateway 服务分配一个外部 IP 地址。检查 istio-eastwestgateway 的外部 IP 地址:

    kubectl --context control get svc istio-eastwestgateway -n istio-system
    

    输出内容类似如下:

    NAME                    TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                                                           AGE
    istio-eastwestgateway   LoadBalancer   10.60.7.19   10.168.0.6    15021:31557/TCP,15443:30306/TCP,15012:31791/TCP,15017:32341/TCP   14m
    

    请注意,外部 IP 地址是内部负载平衡器 IP 地址。您需要内部负载平衡器,因为两个集群位于同一 VPC 上,并且可以通过内部负载平衡器进行通信。

  6. 使用 istio-eastwestgateway 网关和 VirtualService 在 control 克隆中公开 istiod 服务。remote 集群的 Envoy 代理必须能够与 control 集群中的 istiod Service 通信。通过运行以下命令来创建网关和 VirtualService:

    kubectl --context control apply -f ${WORKDIR}/istio-"${ISTIO_VER}"/samples/multicluster/expose-istiod.yaml
    

    输出内容类似如下:

    gateway.networking.istio.io/istiod-gateway created
    virtualservice.networking.istio.io/istiod-vs created
    

    control 集群中的 Istio 控制平面授予对 remote 集群 API 服务器的访问权限。这样可以启用以下功能:

    1. 使控制平面能够对 remote 集群中运行的工作负载的连接请求进行身份验证。如果没有 API 服务器访问权限,控制平面会拒绝请求。
    2. 允许发现 remote 集群中运行的服务端点。
  7. 运行以下命令,为 control 集群中的 Istio 控制平面授予 remote 集群 API 服务器的访问权限。

    ${WORKDIR}/istio-${ISTIO_VER}/bin/istioctl x create-remote-secret \
    --context=remote \
    --name=remote | \
    kubectl apply -f - --context=control
    

    输出内容类似如下:

    secret/istio-remote-secret-remote created
    

    在后续步骤中,您将为 control 集群配置访问 remote 集群中资源的权限。

    Istio 控制层面需要访问网格中的所有集群,才能发现 Service、端点和 Pod 特性。为了获得此访问权限,您将为 remote 集群创建一个 kubeconfig 文件,并将此文件添加作为 control 集群中的密钥istio-remote Helm 图表在 remote 集群中创建一个名为 istio-multi 的 Kubernetes 服务帐号,该帐号具有最低要求的基于角色的访问权限控制 (RBAC) 访问权限。以下步骤使用 istio-multi 服务帐号的凭据生成 remote 集群的 kubeconfig 文件。

  8. 获取 istio-eastwestgateway ILB 地址:

    export DISCOVERY_ADDRESS=$(kubectl --context control -n istio-system get svc istio-eastwestgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    

    remote 集群中运行的 Envoy 辅助信息文件代理使用此地址连接 control 集群中的 istiod

  9. remote 集群创建 istio 配置:

    cat <<EOF > ${WORKDIR}/istio_remote.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      profile: remote
      values:
        global:
          meshID: mesh1
          multiCluster:
            clusterName: remote
          network: network1
          remotePilotAddress: ${DISCOVERY_ADDRESS}
    EOF
    
  10. remote 集群上安装 Istio:

    ${WORKDIR}/istio-${ISTIO_VER}/bin/istioctl install --context=remote -f ${WORKDIR}/istio_remote.yaml
    

    输入 y 以继续安装。Istio 完成安装需要 2-3 分钟。

  11. 检查 remote 集群中的 Istio 部署:

    kubectl --context remote -n istio-system get pods
    

    输出内容类似如下:

    NAME                                   READY   STATUS    RESTARTS   AGE
    istio-ingressgateway-c68779485-4fpmm   1/1     Running   0          3m50s
    istiod-866555cf49-w6qsx                1/1     Running   0          3m57s
    

    现在,两个集群通过 control 集群进行设置,用于为 remote 集群提供 Istio 控制层面。在下一部分中,您将部署两个集群之间拆分的示例应用。

部署 Online Boutique 应用

在本部分中,您将在两个集群中安装 Online Boutique 应用。

  1. 在 Cloud Shell 中,在这两个集群中创建 online-boutique 命名空间:

    for cluster in $(kubectx);
    do
        kubectx $cluster;
        kubectl create namespace online-boutique;
    done
    
  2. 给这两个集群中的 online-boutique 命名空间加标签,以实现自动 Istio Sidecar 代理注入

    for cluster in $(kubectx);
    do
        kubectx $cluster;
        kubectl label namespace online-boutique istio-injection=enabled
    done
    

    此步骤可确保在 online-boutique 命名空间中创建的所有 Pod 都已部署 Envoy Sidecar。

  3. control 集群中安装 Online Boutique 应用资源:

    kubectl --context control -n online-boutique apply -f $WORKDIR/istio-single-controlplane/single-network/control
    

    输出类似于以下内容:

    deployment.apps/emailservice created
    deployment.apps/checkoutservice created
    deployment.apps/frontend created
    deployment.apps/paymentservice created
    deployment.apps/productcatalogservice created
    deployment.apps/currencyservice created
    deployment.apps/shippingservice created
    deployment.apps/adservice created
    gateway.networking.istio.io/frontend-gateway created
    virtualservice.networking.istio.io/frontend-ingress created
    serviceentry.networking.istio.io/currency-provider-external created
    virtualservice.networking.istio.io/frontend created
    serviceentry.networking.istio.io/whitelist-egress-googleapis created
    service/emailservice created
    service/checkoutservice created
    service/recommendationservice created
    service/frontend created
    service/paymentservice created
    service/productcatalogservice created
    service/cartservice created
    service/currencyservice created
    service/shippingservice created
    service/redis-cart created
    service/adservice created
    
  4. remote 集群中安装 Online Boutique 应用资源:

    kubectl --context remote -n online-boutique apply -f $WORKDIR/istio-single-controlplane/single-network/remote
    

    输出类似于以下内容:

    deployment.apps/loadgenerator created
    deployment.apps/cartservice created
    deployment.apps/recommendationservice created
    service/emailservice created
    service/checkoutservice created
    service/recommendationservice created
    service/frontend created
    service/paymentservice created
    service/productcatalogservice created
    service/cartservice created
    service/currencyservice created
    service/shippingservice created
    service/redis-cart created
    service/adservice created
    
  5. 验证所有工作负载是否都在 control 集群中运行:

    kubectl --context control -n online-boutique get pods
    

    输出类似于以下内容:

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-5db678b487-zs6g9               2/2     Running   0          69s
    checkoutservice-b5b8858c7-djnzk          2/2     Running   0          70s
    currencyservice-954d8c5f-mv7kh           2/2     Running   0          70s
    emailservice-5c5555556b-9jk59            2/2     Running   0          71s
    frontend-6fbb48ffc6-gmnsv                2/2     Running   0          70s
    paymentservice-5684b97df7-l9ccn          2/2     Running   0          70s
    productcatalogservice-55479b967c-vqw6w   2/2     Running   0          70s
    shippingservice-59bd8c7b8c-wln4v         2/2     Running   0          69s
    
  6. 验证所有工作负载是否都在 remote 集群中运行:

    kubectl --context remote -n online-boutique get pods
    

    输出类似于以下内容:

    NAME                                     READY   STATUS    RESTARTS   AGE
    cartservice-5db5d5c5f9-vvwgx             2/2     Running   0          63s
    loadgenerator-8bcfd68db-gmlfk            2/2     Running   0          63s
    recommendationservice-859c7c66d5-f2x9m   2/2     Running   0          63s
    

前面两个步骤中的输出表明,Online Boutique 应用微服务是在 controlremote 集群之间拆分的。

访问 Online Boutique 应用

  1. 在 Cloud Shell 中,获取 control 集群的 Istio Ingress 网关 IP 地址:

    kubectl --context control get -n istio-system service istio-ingressgateway -o json | jq -r '.status.loadBalancer.ingress[0].ip'
    

    输出会显示 Istio Ingress 网关的 IP 地址。

  2. 将 Istio Ingress 网关 IP 地址复制并粘贴到网络浏览器标签页中,然后刷新页面。您会看到 Online Boutique 首页。

    Online Boutique 首页,其中显示各种产品(如自行车、相机、打字机等)的图片。

    请在应用中导航、浏览各种产品,并将产品放入购物车和进行结帐等等。

    您会发现,Online Boutique 应用正在两个环境中的两个 Kubernetes 集群上完全正常地运行。

监控服务网格

您可以使用 Kiali 来直观呈现服务网格。Kiali 是一种服务网格可监测性工具。如需使用 Kiali,您必须将 Prometheus 和 Kiali 安装到 control 集群。

  1. 将 Prometheus 和 Kiali 插件部署到 control 集群:

    kubectl --context control apply -f https://raw.githubusercontent.com/istio/istio/release-${ISTIO_VER:0:3}/samples/addons/prometheus.yaml
    kubectl --context control apply -f https://raw.githubusercontent.com/istio/istio/release-${ISTIO_VER:0:3}/samples/addons/kiali.yaml
    

    如果 Kiali 安装因出错而失败,请尝试再次运行相同的命令。再次运行命令时,可能存在一些计时问题。

  2. 确保 Prometheus 和 Kiali Pod 正在运行:

    kubectl --context control get pods -n istio-system
    

    输出内容类似如下:

    kiali-cb9fb9554-x2r5z                    1/1     Running   0          7m46s
    prometheus-6d87d85c88-zv8cr              2/2     Running   0          3m57s
    
  3. 在 Cloud Shell 中,在 control 集群上公开 Kiali:

    kubectl --context control port-forward svc/kiali 8080:20001 -n istio-system --context control >> /dev/null &
    
  4. control 集群上打开 Kiali 网页界面:选择网页预览,然后选择在端口 8080 上预览

  5. 出现 Kiali 登录提示时,使用用户名 admin 和密码 admin 登录。

  6. 从菜单中选择图表

  7. 选择命名空间下拉列表中,选择 online-boutique

  8. 图表下方的菜单中,选择服务图表 (Service Graph)。

  9. 或者,从显示菜单中,选择集群框流量动画来观看 loadgenerator 对您的应用生成流量的过程。

    流量动画,其中显示“loadgenerator”对您的应用生成流量的过程。

上图显示了分布在两个集群中的微服务的共享 Istio 服务网格。无论是哪个集群,随着添加新的微服务,系统都会自动发现微服务并将其添加到网格中。利用层面网络连接,您可灵活地拥有多个集群,同时通过共享控制层面轻松管理所有微服务。

清除数据

完成本教程后,请清理您在 Google Cloud 上创建的资源,以免这些资源将来产生费用。以下部分介绍如何删除这些资源。

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

重置 kubeconfig

  • 取消设置 KUBECONFIG 变量:

    unset KUBECONFIG
    rm ${WORKDIR}/istiokubecfg
    

后续步骤