在本地安装 Anthos Service Mesh

本指南介绍如何在 GKE on VMware 上进行 Anthos Service Mesh 版本 1.8.6-asm.8 的全新安装。如果您安装了先前版本的 Anthos Service Mesh,请参阅升级 Anthos Service Mesh GKE on VMware。此安装会在集群上启用支持的功能。本指南将集群称为 cluster1,但您可以重复以下步骤来设置多个集群。

关于控制层面组件

GKE on VMware 预安装有以下 Istio 组件:

  • Anthos Service Mesh 证书授权机构 (Citadel) 安装在 kube-system 命名空间中。
  • Pilot 和 Istio 入站流量网关安装在 gke-system 命名空间中。

GKE on VMware 使用这些组件来启用入站流量,以及保护由 Google 控制的组件之间的通信。如果您只需要入站流量功能,则无需安装 OSS Istio 或 Anthos Service Mesh。如需详细了解如何配置入站流量,请参阅启用入站流量

安装 Anthos Service Mesh 时,其组件会安装在 istio-system 命名空间中。由于 Anthos Service Mesh 组件位于不同的命名空间中,因此不会与 GKE on VMware 预安装的 Istio 组件发生冲突。

准备工作

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

使用要求

  • 您必须有 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

设置您的环境

在控制安装过程的计算机上,您需要使用以下工具。请注意,您只能在用户集群上安装 Anthos Service Mesh,不能在管理员集群上安装。

安装 Google Cloud CLI 后:

  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
    

设置环境变量

  1. 使用此命令输出中 NAME 列下的值获取集群的上下文名称:

    kubectl config get-contexts
  2. 将环境变量设置为集群上下文名称,本指南后面将在许多步骤中用到这些环境变量:

    export CTX_CLUSTER1=CLUSTER1_CONTEXT_NAME

授予集群管理员权限

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

    kubectl --context="${CTX_CLUSTER1}" create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user=USER_ACCOUNT

下载安装文件

    Linux

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

    预期输出为 Verified OK

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

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

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

  4. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.8.6-asm.8
  5. Mac OS

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

    预期输出为 Verified OK

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

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

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

  9. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.8.6-asm.8
  10. Windows

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

    预期输出为 Verified OK

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

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

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

  14. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.8.6-asm.8

配置证书授权机构

本部分介绍如何生成 Anthos Service Mesh On-Prem 用来对工作负载进行签名的证书和密钥。

为了获得最佳安全性,我们强烈建议您维护离线根 CA,并使用从属 CA 为每个集群颁发 CA。如需了解详情,请参阅插入 CA 证书。在此配置中,服务网格中的所有工作负载都将使用相同的根证书授权机构 (CA)。每个 Anthos Service Mesh CA 使用中间 CA 签名密钥和证书(由根 CA 签名)。当网格中存在多个 CA 时,这会建立 CA 间的信任层次结构。您可以重复这些步骤,为任意数量的证书授权机构预配证书和密钥。

  1. 为证书和密钥创建一个目录:

    mkdir -p certs && \
    pushd certs
  2. 生成根证书和密钥:

    make -f ../tools/certs/Makefile.selfsigned.mk root-ca
    

    这会生成以下文件:

    • root-cert.pem:根证书
    • root-key.pem:根密钥
    • root-ca.conf:openssl 用于生成根证书的配置
    • root-cert.csr:根证书的 CSR
  3. 生成中间证书和密钥:

    make -f ../tools/certs/Makefile.selfsigned.mk cluster1-cacerts

    此操作会在名为 cluster1 的目录中生成以下文件:

    • ca-cert.pem:中间证书
    • ca-key.pem:中间密钥
    • cert-chain.pem:istiod 使用的证书链
    • root-cert.pem:根证书

    如果您使用离线计算机执行这些步骤,请将生成的目录复制到有权访问集群的计算机。

  4. 创建 Secret cacerts(包括所有输入文件 ca-cert.pemca- key.pemroot-cert.pemcert-chain.pem):

    kubectl --context="${CTX_CLUSTER1}" create namespace istio-system
    kubectl --context="${CTX_CLUSTER1}" create secret generic cacerts -n istio-system \
      --from-file=cluster1/ca-cert.pem \
      --from-file=cluster1/ca-key.pem \
      --from-file=cluster1/root-cert.pem \
      --from-file=cluster1/cert-chain.pem

    Anthos Service Mesh On-Prem 将检测这些证书/密钥是否存在,并在安装过程的后续步骤中使用这些证书/密钥。

  5. 返回上一个目录:

    popd

安装 Anthos Service Mesh

  1. 为项目 ID 创建环境变量:

    export PROJECT_ID=YOUR_PROJECT_ID
  2. 为项目编号创建环境变量:

    export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
  3. 为网格标识符创建环境变量:此标识符可以是任何字符串,但应采用在您的集群之间一致的格式。

    export MESH_ID="proj-${PROJECT_NUMBER}"
  4. 为集群的控制层面创建配置,该配置将使用 asm-multicloud 配置文件安装 Anthos Service Mesh。如果您要启用受支持的可选功能,请在以下命令行中添加 -f 和 YAML 文件名。如需了解详情,请参阅启用可选功能

    在以下示例中,使用前面的步骤中定义的 MESH_ID

    cat <<EOF > cluster.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      profile: asm-multicloud
      revision: asm-186-8
      values:
        global:
          meshID: MESH_ID
          multiCluster:
            clusterName: CLUSTER_NAME
          network: NETWORK_ID
    EOF
    
  5. 如果需要,请切换到 istio-1.8.6-asm.8 目录。istioctl 客户端依赖于版本。请确保使用 istio-1.8.6-asm.8/bin 目录中的版本。

  6. 将配置应用于集群:

    bin/istioctl install --context="${CTX_CLUSTER1}" -f cluster.yaml
    

设置默认网络

  1. istio-system 命名空间中设置默认网络。

    在以下示例中,NETWORK_ID 可以是标识集群网络的任意字符串。采用这种本地配置时,每个集群都有自己的网络,因此每个集群应具有不同的值。NETWORK_ID语法和字符集中介绍的 Kubernetes 标签具有相同的字符串限制。

     kubectl --context="${CTX_CLUSTER1}" label \
    namespace istio-system topology.istio.io/network=NETWORK_ID

配置验证网络钩子

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

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

    cat <<EOF > istiod-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
     name: istiod
     namespace: istio-system
     labels:
       istio.io/rev: asm-186-8
       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-186-8
    EOF
    
  2. 配置验证网络钩子,使其能够使用修订版本标签查找 istiod 服务:

    kubectl --context="${CTX_CLUSTER1}" apply -f istiod-service.yaml
    

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

自动双向 TLS(自动 mTLS)默认情况下处于启用状态。通过自动 mTLS,客户端边车代理会自动检测服务器是否具有 Sidecar。客户端 Sidecar 会将 mTLS 发送到具有 Sidecar 的工作负载,并将纯文本流量发送到没有 Sidecar 的工作负载。

检查控制层面组件

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

kubectl --context="${CTX_CLUSTER1}" get pod -n istio-system

预期输出如下所示:

NAME                                      READY   STATUS      RESTARTS   AGE
istio-ingressgateway-74cc894bfd-786rg     1/1     Running     0          7m19s
istiod-78cdbbbdb-d7tps                    1/1     Running     0          7m36s
promsd-576b8db4d6-lqf64                   2/2     Running     1          7m19s

注入边车代理

Anthos Service Mesh 使用边车代理来增强网络安全性、可靠性和可观测性。借助 Anthos Service Mesh,这些功能可以从应用的主容器中抽象出来,并在作为同一 Pod 中单独的容器提供的常见进程外代理中实现。

您需要启用自动边车代理注入(自动注入),并为在安装 Anthos Service Mesh 之前集群上运行的所有工作负载重启 Pod,才能完成安装。

要启用自动注入功能,请使用安装 Anthos Service Mesh 时在 istiod 上设置的修订版本标签来为您的命名空间添加标签。Sidecar 注入器网络钩子会使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。添加标签后,必须重启命名空间中的所有现有 Pod,才能注入 Sidecar。

在将新工作负载部署到新命名空间中之前,请先确保配置自动注入,以便 Anthos Service Mesh 能够监控和保护流量。

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

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

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

    输出类似于以下内容:

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

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

  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
    

后续步骤

如果您计划为本地服务网格使用多个集群,请参阅在多个集群和网络的本地安装 Anthos Service Mesh

否则,下一步将是配置外部 IP 地址