使用 HSM 和 Vault 在本地安装 Anthos Service Mesh

本指南介绍如何在 GKE on VMware 中执行 Anthos Service Mesh 版本 1.7.8-asm.10 的全新安装,以及如何使用 Thales Luna HSM 7+Hashicorp Vault 安全地生成 Istiod 的 CA 签名密钥并保护 CA 签名密钥。

如果您安装了先前版本的 Anthos Service Mesh,请参阅升级 Anthos Service Mesh GKE on VMware。此安装将在集群上针对 asm-multicloud 配置文件启用支持的功能

准备工作

在开始设置之前,请查看以下要求。

使用要求

  • 您必须有 Anthos 订阅。或者,用户可以选择仅适用于 Google Cloud 上的 GKE Enterprise 的随用随付结算选项。如需了解详情,请参阅 GKE Enterprise 价格指南

  • 您必须联系支持团队,要求其授予您访问映像的权限。支持团队还会向您提供其他帮助。

  • 验证安装 Anthos Service Mesh 的集群至少具有 4 个 vCPU、15 GB 内存和 4 个节点。

  • 您必须使用以下语法命名服务端口:name: protocol[-suffix],其中方括号表示必须以短划线开头的可选后缀。如需了解详情,请参阅为服务端口命名

  • 验证是否已在支持的环境中列出了您的集群版本。如需检查集群版本,您可以使用 gkectl 命令行工具。 如果您未安装 gkectl,请参阅 GKE On-Prem 下载

    gkectl version
  • 您的基础架构中应具有 Thales Luna HSM 7+。HSM 应设置网络服务并且可以从 Anthos Service Mesh 集群访问。

  • 您的基础架构中应具有 Hashicorp Vault 服务器,存储用于访问 HSM 的凭据。Vault 服务器应能通过网络从 Anthos Service Mesh 集群访问。

设置环境

在控制 Anthos Service Mesh 安装过程的机器上安装以下工具。

安装必要的工具后,请执行以下步骤:

  1. 使用 Google Cloud CLI 进行身份验证:

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    
  3. 安装 kubectl

    gcloud components install kubectl
    
  4. 如需使用 Online Boutique 示例应用部署并测试您的安装,请安装 kpt

    gcloud components install kpt
    
  5. 将上下文切换到用户集群(如有必要):

    kubectl config use-context CLUSTER_NAME
  6. 向您的用户账号(您的 Google Cloud 登录电子邮件地址)授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user=USER_ACCOUNT

部署依赖项

  • 在基础架构中部署 Thales Luna HSM 7+,以安全管理 Istiod CA 签名密钥。确保 HSM 具有网络服务和与 Anthos Service Mesh 集群的连接。
  • 在基础架构中部署 Hashicorp Vault 服务器,以存储用于访问 HSM 的凭据。确保 Vault 服务器与 Anthos Service Mesh 集群之间有网络连接。
  • 拥有可访问 Vault 服务器、HSM 和安装 Anthos Service Mesh 的 Kubernetes 集群的工作站。

设置硬件安全模块 (HSM)

本部分列出了设置硬件安全模块 (HSM) 和生成加密密钥的步骤。

预配 HSM 凭据和槽

按照 HSM 安装指南执行以下步骤。

  1. 将 HSM 设置为网络 HSM。

  2. 使用 HSM 为 mTLS 连接预配 PEM 文件,包括客户端密钥文件、客户端证书文件和服务器证书文件。

  3. 为 Anthos Service Mesh 预配 HSM 槽并记录槽标签和 PIN 码。

生成 HSM 密钥加密密钥 (KEK)

  1. 在可访问 HSM 的机器上,下载 HSM 工具(仅适用于 Linux amd-64)。

    gsutil cp gs://artifacts.thalescpl-io-k8s-kms-plugin.appspot.com/binary/k8s-kms-plugin .
  2. 在将 HSM 工具作为本地服务器运行之前设置环境变量,该服务器连接到 HSM 并在本地 Unix 网域套接字 (UDS) 上传送流量。

    export P11_TOKEN=HSM slot label
    export ChrystokiConfigurationPath=path to the Thales HSM Chrystoki configuration file
    export P11_LIB=path to the libCryptoki2.so file for accessing the Thales HSM
    export P11_PIN_FILE=path to the file that stores the HSM slot PIN
    export SOCKET=/tmp/.hsm-sock
    ./k8s-kms-plugin serve &

    您应会看到如下所示的输出:

    The token has been initialized and is reassigned to slot 412789065
    INFO Loaded P11 PIN from file: /home/hsm/hsm-credential/pin  line="cmd/serve.go:93"
    INFO KMS Plugin Listening on : /var/.hsm-sock  line="cmd/serve.go:119"
    INFO Serving on socket: /tmp/.hsm-sock  line="cmd/serve.go:198"
  3. 如果 HSM 没有密钥加密密钥 (KEK),请按照以下步骤生成一个。将 k8s-kms-plugin 用作客户端,以与 HSM 工具服务器通信。如果要明确指定 KEK ID,您可以在命令中传递 --kek-id 标志。否则,系统会自动生成一个随机 KEK ID。

    ./k8s-kms-plugin generate-kek --kek-id KEK ID

    记录 KEK ID。您将在后续步骤中用到它。

  4. HSM 使用导入的根证书来验证签名的 Istiod CA 证书。您可以按照此步骤将根证书导入 HSM。将 k8s-kms-plugin 用作客户端,以与 HSM 工具服务器通信。使用以下命令导入根证书。

    ./k8s-kms-plugin import-ca -f root cert PEM file

为 Vault 身份验证设置 Kubernetes

  1. 在 Kubernetes 集群中,为 Vault 创建一个专用服务账号和 RBAC 政策,以调用 TokenReview API。为此,请创建一个专用命名空间。

  2. vault 命名空间中创建默认服务账号,设置权限,然后提取关联的 JSON Web 令牌 (JWT),以便 Vault 服务器可以调用 Kubernetes TokenReview API。注意:您可以使用任何具有足够的权限的 Kubernetes 服务账号和命名空间。

  3. 为要设置的集群配置集群后缀。为配置使用专用目录。

    export CLUSTER_SUFFIX="c1"
    mkdir ${CLUSTER_SUFFIX}
    cd ${CLUSTER_SUFFIX}
    
  4. 切换到您要管理的集群并创建 vault 命名空间。kubectl 会自动创建默认服务账号。

    kubectl create ns vault
    
  5. 要授予权限,请将服务账号 default.vault 绑定到 auth-delegator 角色。

    kubectl apply -f -<< EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
     name: role-tokenreview-binding
     namespace: vault
    roleRef:
     apiGroup: rbac.authorization.k8s.io
     kind: ClusterRole
     name: system:auth-delegator
    subjects:
     - kind: ServiceAccount
       name: default
       namespace: vault
    EOF
    
  6. 创建一个 Secret 来存储令牌凭据。

    VAULT_SA_SECRET=default-token
    kubectl apply -n vault -f - << EOF
    apiVersion: v1
    kind: Secret
    metadata:
     name: "${VAULT_SA_SECRET}"
     annotations:
       kubernetes.io/service-account.name: default
    type: kubernetes.io/service-account-token
    EOF
    
  7. 获取服务账号 default.vault 的 JWT。

    VAULT_SA_JWT_TOKEN=$(kubectl get -n vault secret $VAULT_SA_SECRET -o jsonpath="{.data.token}" | base64 --decode)
    echo $VAULT_SA_JWT_TOKEN > ${CLUSTER_SUFFIX}-tokenreview_jwt
    cat ${CLUSTER_SUFFIX}-tokenreview_jwt
    
  8. 检索 Kubernetes API 服务器的地址和 CA 证书。稍后,配置 Vault 服务器以调用 Kubernetes API 服务器。

  9. 获取 Kubernetes 公共 IP:Port 值。

    K8S_ADDR=$(kubectl config  view -o jsonpath="{.clusters[?(@.name == '$(kubectl config current-context)')].cluster.server}")
    echo $K8S_ADDR > ${CLUSTER_SUFFIX}-k8s_addr
    cat ${CLUSTER_SUFFIX}-k8s_addr
    
  10. 获取用于对 Kubernetes API 服务器进行身份验证的证书。

    VAULT_SA_CA_CRT=$(kubectl get -n vault secret $VAULT_SA_SECRET -o jsonpath="{.data['ca\.crt']}" | base64 --decode)
    echo $VAULT_SA_CA_CRT > "${CLUSTER_SUFFIX}-k8s_cert"
    cat "${CLUSTER_SUFFIX}-k8s_cert"
    
  11. 将证书文件转换为 PEM 文件格式并进行验证。

    sed -i 's/ CERTIFICATE/CERTIFICATE/g' ${CLUSTER_SUFFIX}-k8s_cert
    sed -i 's/ /\n/g' ${CLUSTER_SUFFIX}-k8s_cert
    sed -i 's/CERTIFICATE/ CERTIFICATE/g' ${CLUSTER_SUFFIX}-k8s_cert
    
  12. 验证证书是否有效。

    openssl x509 -in ${CLUSTER_SUFFIX}-k8s_cert -noout -text
    
  13. 返回之前的目录。

    cd ..
    

现在,在下一步中使用集群的目录中的三个文件配置 Vault。

设置 Vault 以存储 HSM 凭据

当 Vault 服务器使用有效证书传送 TLS 流量时,请配置 Vault PKI 并配置 Kubernetes 身份验证。以下是设置单个根 CA 和每个集群的中间 CA 的示例。

  1. 以根用户身份登录 Vault。

    vault login
    
  2. 存储 HSM 的 Secret。

    SECRET_PATH=asm-$CLUSTER_SUFFIX
    vault secrets enable -path=$SECRET_PATH  kv
    vault secrets tune -max-lease-ttl=87600h $SECRET_PATH
    export HSM_SECRET_PATH="$SECRET_PATH/hsm"
    vault kv put ${HSM_SECRET_PATH} clientcert=HSM_CLIENT_CERT clientkey=HSM_CLIENT_KEY servercert=HSM_SERVER_CERT PIN=HSM_PIN
    vault kv get ${HSM_SECRET_PATH}
    
  3. 创建具有 PKI 路径权限的政策。

    vault policy write asm-$CLUSTER_SUFFIX-hsm-policy -<< EOF
    path "${HSM_SECRET_PATH}" {
    capabilities = ["read"]
    }
    EOF
    
  4. 为集群添加 Kubernetes 身份验证。

    vault auth enable --path="${HSM_SECRET_PATH}"  kubernetes
    
  5. 将 Kubernetes JWT、Kubernetes 地址和 Kubernetes CA 证书设置到 Vault 身份验证路径中。

    vault write auth/${HSM_SECRET_PATH}/config \
    token_reviewer_jwt=cat "${CLUSTER_SUFFIX}"-tokenreview_jwt \
    kubernetes_host=cat "${CLUSTER_SUFFIX}"-k8s_addr \
    kubernetes_ca_cert=@"${CLUSTER_SUFFIX}"-k8s_cert
    
  6. 允许 istiod-service-account.istio-systemdemo 角色进行身份验证,并使用创建的政策。

    vault write auth/${HSM_SECRET_PATH}/role/istiod \
    bound_service_account_names=istiod-service-account \
    bound_service_account_namespaces=istio-system \
    policies=asm-$CLUSTER_SUFFIX-hsm-policy \
    ttl=768h
    
  7. 返回到父文件夹。

    cd ..
    

下载安装文件

    Linux

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-linux-amd64.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-linux-amd64.tar.gz.1.sig
    openssl dgst -verify /dev/stdin -signature istio-1.7.8-asm.10-linux-amd64.tar.gz.1.sig istio-1.7.8-asm.10-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.7.8-asm.10-linux-amd64.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.7.8-asm.10 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 install/kubernetes/operator/profiles 目录中。

  4. Mac OS

  5. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz
  6. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.7.8-asm.10-osx.tar.gz.1.sig istio-1.7.8-asm.10-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  7. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.7.8-asm.10-osx.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.7.8-asm.10 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 install/kubernetes/operator/profiles 目录中。

  8. Windows

  9. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip
  10. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.7.8-asm.10-win.zip.1.sig istio-1.7.8-asm.10-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  11. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.7.8-asm.10-win.zip

    该命令会在当前工作目录中创建一个名为 istio-1.7.8-asm.10 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 install/kubernetes/operator/profiles 目录中。

  12. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.7.8-asm.10
  13. 为方便起见,请将 /bin 目录中的工具添加到 PATH:
    export PATH=$PWD/bin:$PATH

在控制层面中设置资源

  1. 设置环境变量。

    export CLUSTER_SUFFIX="c1"
    export VAULT_ADDR="https://VAULT_IP:PORT"
    
  2. 将包含用于对 Vault 进行身份验证的证书的文件复制到名为 cert 的文件中。例如,Vault 服务器的 TLS 证书 ${VAULT_CACERT}

    cp ${VAULT_CACERT} ./cert
    
  3. 从命名空间 istio-system 中的文件创建 ConfigMap

    kubectl create ns istio-system
    kubectl delete configmap vault-tls-cert -n istio-system
    kubectl create configmap vault-tls-cert -n istio-system --from-file=./cert
    

配置验证网络钩子

安装 Anthos Service Mesh 时,您可以在 istiod 上设置修订版本标签。您需要在验证网络钩子上设置相同的修订版本。

将以下 YAML 复制到名为 istiod-service.yaml 的文件中:

apiVersion: v1
kind: Service
metadata:
  name: istiod
  namespace: istio-system
  labels:
    istio.io/rev: asm-178-10
    app: istiod
    istio: pilot
    release: istio
spec:
  ports:
    - port: 15010
      name: grpc-xds # plaintext
      protocol: TCP
    - port: 15012
      name: https-dns # mTLS with k8s-signed cert
      protocol: TCP
    - port: 443
      name: https-webhook # validation and injection
      targetPort: 15017
      protocol: TCP
    - port: 15014
      name: http-monitoring # prometheus stats
      protocol: TCP
  selector:
    app: istiod
    istio.io/rev: asm-178-10

安装 Anthos Service Mesh

  1. 设置环境变量以将 ASM 配置为与 Vault 和 HSM 交互。以下命令可将等待时间缩短为 10 秒,这是因为由于操作者的待处理导入操作,Istiod 将无法完全准备就绪。

    export HSM_SLOT_LABEL=the HSM slot label
    export VAULT_ADDR=address of the vault server
    export HSM_SECRET_PATH=the path to the HSM secret on Vault
    export KEK_ID=the HSM slot KEK ID
    export HSM_PLUGIN_IMAGE=gcr.io/thalescpl-io-k8s-kms-plugin/hsm-plugin:asm-1.7-1
    export VAULT_CLIENT_IMAGE=gcr.io/gke-release/asm/vaultclient:latest
    export WAIT_FOR_RESOURCES_TIMEOUT=10s
  2. 运行以下命令以使用 asm-multicloud 配置文件安装 Anthos Service Mesh。如果您要启用支持的可选功能,请在以下命令行中添加 -f 和 YAML 文件名。如需了解详情,请参阅启用可选功能

    istioctl install --set profile=asm-multicloud \
       --set revision=asm-178-10 \
       --set values.hsm.enabled=true \
       --set values.hsm.hsmKEKID=${KEK_ID} \
       --set values.hsm.hsmPluginImage=${HSM_PLUGIN_IMAGE} \
       --set values.hsm.hsmSlotLabel=${HSM_SLOT_LABEL} \
       --set values.hsm.vaultClientImage=${VAULT_CLIENT_IMAGE} \
       --set values.hsm.vaultAddr=${VAULT_ADDR} \
       --set values.hsm.vaultAuthPath=auth/${HSM_SECRET_PATH}/login \
       --set values.hsm.vaultAuthRole=istiod \
       --set values.hsm.vaultAuthJwtPath="/var/run/secrets/kubernetes.io/serviceaccount/token" \
       --set values.hsm.vaultSecretPath=${HSM_SECRET_PATH} \
       --set values.global.jwtPolicy="first-party-jwt"
    
  3. 配置验证网络钩子,使其能够使用修订版本标签查找 istiod 服务:

    kubectl apply -f istiod-service.yaml
    

    此命令会创建一个服务条目,可让验证网络钩子在配置应用之前自动检查配置。

  4. 验证 Istiod 是否已正确初始化和并处于等待状态。

    kubectl get pod -l app=istiod -n istio-system

    您应会看到如下所示的输出:

    NAME                      READY   STATUS    RESTARTS   AGE
    istiod-66ff56d76c-f9p5l   2/3     Running   2          1m27s

    可以看到 Istiod 尚未完全就绪,因为 discovery 容器被阻止并正在等待证书。

  5. 检查 Istiod 容器的日志,确保其处于正确的状态。

    kubectl logs -c hsm-plugin -l app=istiod -n istio-system

    您应会看到如下所示的输出:

    The token has been initialized and is reassigned to slot 412789065
    INFO Loaded P11 PIN from file: /var/run/hsm-credential/pin  line="cmd/serve.go:93"
    INFO KMS Plugin Listening on : /var/run/hsm-socket/.sock  line="cmd/serve.go:119"
    INFO Serving on socket: /var/run/hsm-socket/.sock  line="cmd/serve.go:198"
    KEK ID: 7651a4ea-eeb7-4c1f-927b-8c871c2127aa
    kubectl logs -c discovery -l app=istiod -n istio-system

    输出的最后一行应该类似如下:

    ...
    2020-10-15T21:56:56.918931Z info    pkica   Wait until the CA certificate secret istio-system.istio-ca-cert can be loaded...

为 Istiod 签署证书

  1. 从 Kubernetes Secret 下载加密的 CSR。

    kubectl get secret istio-ca-cert-csr -n istio-system -o jsonpath={.data} > encrypted_csr.json
    
  2. 解密 CSR。

    kubectl get secret istio-ca-cert-csr -n istio-system -o jsonpath={.data} > encrypted_csr.json
    ./k8s-kms-plugin decrypt-csr -f encrypted_csr.json -o csr.pem
    
  3. 安全管理员应该获取 csr.pem 文件,并使用根 CA 为其签名。

  4. 将您的证书链置于名为 cert-chain.pem 的文件的根目录中,然后运行以下命令。

    kubectl create secret generic istio-ca-cert --from-file=cert-chain.pem -n istio-system
    
  5. 在 Istiod 日志中检查 Istiod 是否成功加载新的证书链。

    kubectl logs ISTIOD_POD -c discovery -n istio-system | grep "CA cert\:" -A 60
    

    您应看到类似如下所示的输出:

    2020-10-24T18:58:14.354254Z info    pkica   CA cert:
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----

中间证书: -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----

根证书: -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----

验证安装

按照以下步骤验证 Anthos Service Mesh 安装是否正常运行。

检查控制层面组件

  1. 检查 istio-system 中的控制层面 pod 是否正在运行,请运行以下命令:

    kubectl get pod -n istio-system

    预期输出如下所示:

    NAME                                      READY   STATUS      RESTARTS   AGE
    istio-ingressgateway-74cc894bfd-786rg     1/1     Running     0          7m19s
    istiod-78cdbbbdb-d7tps                    3/3     Running     0          7m36s
    promsd-576b8db4d6-lqf64                   2/2     Running     1          7m19s
  2. 从 Sidecar 触发对服务的 TLS 调用,并使用 bookinfo 作为示例来检查服务使用的证书。

    kubectl exec POD -c istio-proxy -- openssl s_client -alpn istio -showcerts -connect details:9080
    

    检查输出中的证书,应在输出中看到服务器端证书链。

注入边车代理

Anthos Service Mesh 使用 Sidecar 代理来增强网络安全性、可靠性和可观测性。借助 Anthos Service Mesh,这些功能可以从应用的主容器中抽象出来,并在作为同一 pod 中单独的容器提供的常见进程外代理中实现。如需向 pod 注入边车代理,您需要使用安装 Anthos Service Mesh 时在 istiod 上设置的相同修订版本标签来为命名空间添加标签,以配置自动边车代理注入(自动注入)。

  • 您需要在具有在集群上运行的工作负载的所有命名空间上启用自动注入,然后再安装 Anthos Service Mesh。

  • 在部署新的工作负载之前,请务必配置自动注入,以便 Anthos Service Mesh 可以监控和保护流量。

如需启用自动注入,请运行以下命令:

  1. 使用以下命令查找 istiod 的修订版本标签:

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    输出类似于以下内容:

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-178-10-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-178-10,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-178-10-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-178-10,istio=istiod,pod-template-hash=5788d57586

    在输出中的 LABELS 列下,记下 istiod 修订版本标签的值,该值位于前缀 istio.io/rev= 之后。在此示例中,该值为 asm-178-10

  2. 应用修订版本标签并移除 istio-injection 标签(如果存在)。在以下命令中,NAMESPACE 是您要启用自动注入的命名空间的名称,REVISION 是您在上一步中记下的修订版本标签。

    kubectl label namespace NAMESPACE istio-injection-istio.io/rev=REVISION --overwrite
    

    您可以忽略输出中的 "istio-injection not found" 消息。这意味着命名空间之前没有 istio-injection 标签,对于 Anthos Service Mesh 的新安装或新部署,这是预期现象。如果命名空间同时具有 istio-injection 和修订版本标签,自动注入将失败,因此 Anthos Service Mesh 文档中的所有 kubectl label 命令都包含移除 istio-injection 标签。

  3. 如果在安装 Anthos Service Mesh 之前集群上已运行工作负载,请重启 pod 以触发重新注入。

    如何重启 pod 取决于您的应用和集群所在的环境。例如,在预演环境中,您可能只需删除所有 pod 即可使其重启。但是,在生产环境中,您可能需要通过实现蓝绿部署流程来安全地重启 pod,以避免流量中断。

    您可以使用 kubectl 执行滚动重启:

    kubectl rollout restart deployment -n NAMESPACE
    
  4. 验证 pod 是否配置为指向 istiod 的新版本。

    kubectl get pods -n NAMESPACE -l istio.io/rev=REVISION
    

配置外部 IP 地址

默认的 Anthos Service Mesh 安装假定为 LoadBalancer 服务自动分配外部 IP 地址。在 GKE on VMware 上并非如此。因此,您需要为 Anthos Service Mesh 入站流量网关资源手动分配 IP 地址。

要配置外部 IP 地址,请根据集群的负载均衡模式,按照以下某一部分的说明执行操作:

配置集成式负载均衡模式

  1. 打开 istio-ingressgateway Service 的配置:

    kubectl edit svc -n istio-system istio-ingressgateway
    

    istio-ingressgateway Service 的配置会在 shell 的默认文本编辑器中打开。

  2. 在文件中的规范 (spec) 块下添加以下行:

    loadBalancerIP: <your static external IP address>
    

    例如:

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. 保存文件。

配置手动负载均衡模式

要在负载均衡器上使用虚拟 IP 地址 (VIP) 公开 NodePort 类型的服务,请先获取 nodePort 值:

  1. 在 shell 中查看 istio-ingressgateway Service 的配置:

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    系统会显示 Anthos Service Mesh 网关的每个端口。命令输出如下所示:

     ...
     ports:
     - name: status-port
       nodePort: 30391
       port: 15020
       protocol: TCP
       targetPort: 15020
     - name: http2
       nodePort: 31380
       port: 80
       protocol: TCP
       targetPort: 80
     - name: https
       nodePort: 31390
       port: 443
       protocol: TCP
       targetPort: 443
     - name: tcp
       nodePort: 31400
       port: 31400
       protocol: TCP
       targetPort: 31400
     - name: https-kiali
       nodePort: 31073
       port: 15029
       protocol: TCP
       targetPort: 15029
     - name: https-prometheus
       nodePort: 30253
       port: 15030
       protocol: TCP
       targetPort: 15030
     - name: https-grafana
       nodePort: 30050
       port: 15031
       protocol: TCP
       targetPort: 15031
     - name: https-tracing
       nodePort: 31204
       port: 15032
       protocol: TCP
       targetPort: 15032
     - name: tls
       nodePort: 30158
       port: 15443
       protocol: TCP
       targetPort: 15443
     ...
    
  2. 通过负载均衡器公开这些端口。

    例如,名为 http2 的服务端口具有 port 80 和 nodePort 31380。假设您的用户集群的节点地址是 192.168.0.10192.168.0.11192.168.0.12,并且负载均衡器的 VIP 地址是 203.0.113.1

    配置负载均衡器以将发送到 203.0.113.1:80 的流量转发到 192.168.0.10:31380192.168.0.11:31380192.168.0.12:31380。您可以选择要在此给定 VIP 地址上公开的服务端口。

后续步骤