您正在查看 Anthos Service Mesh 1.7 的文档。查看最新文档或选择其他可用版本:

安装 Anthos clusters on AWS

本指南介绍如何在 Anthos clusters on AWS 上进行 Anthos Service Mesh 版本 1.7.6-asm.1 的全新安装。

Anthos Service Mesh 预安装了 Istio 入站流量网关。但是,如果您希望使用入站流量控制器,则可以使用 Anthos Service Mesh 来设置 Kubernetes Ingress 资源。本指南介绍了如何安装 Anthos Service Mesh 并视需要设置 Kubernetes Ingress 资源。

准备工作

在开始安装 Anthos Service Mesh 之前,请确保您已执行以下任务:

要求

  • 确保安装 Anthos Service Mesh 的用户集群至少具有 4 个 vCPU、15 GB 内存和 4 个副本。

  • 在部署工作负载之前,请查看为服务端口命名

  • 确保您的集群版本列在受支持的环境中。

限制

一个 Google Cloud 项目只能关联一个网格。

设置环境

在要安装 Anthos Service Mesh 的机器上,您需要以下工具。请注意,您只能在用户集群上安装 Anthos Service Mesh,不能在管理员集群上安装。

  • curl 命令行工具。
  • Cloud SDKgcloud 命令行工具)。

安装 Cloud SDK 后:

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

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    
  3. 安装 kubectl

    gcloud components install kubectl
    
  4. 安装 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

下载安装文件

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.6-asm.1-linux-amd64.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.6-asm.1-linux-amd64.tar.gz.1.sig
    openssl dgst -verify - -signature istio-1.7.6-asm.1-linux-amd64.tar.gz.1.sig istio-1.7.6-asm.1-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,若要将内容提取到当前工作目录,请运行以下命令:

    tar xzf istio-1.7.6-asm.1-linux-amd64.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.7.6-asm.1 的安装目录。istio-1.7.6-asm.1/bin 目录包含 istioctl 命令行工具,用于安装 Anthos Service Mesh。

  4. 确保您位于 Anthos Service Mesh 安装的根目录。

    cd istio-1.7.6-asm.1
  5. 为方便起见,请将 /bin 目录添加到 PATH 中:

    export PATH=$PWD/bin:$PATH

创建 istio-system 命名空间

为控制层面组件创建一个名为 istio-system 的命名空间:

kubectl create namespace istio-system

配置验证网络钩子

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

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

apiVersion: v1
kind: Service
metadata:
  name: istiod
  namespace: istio-system
  labels:
    istio.io/rev: asm-176-1
    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-176-1

安装 Anthos Service Mesh

本部分介绍了如何在用户集群上安装 Anthos Service Mesh,用于启用 asm-multicloud 配置文件的支持的功能页面上列出的支持的默认功能。您可以选择为公共子网或专用子网启用 Ingress。

公共

  1. 安装 Anthos Service Mesh:

    istioctl install \
      --set profile=asm-multicloud \
      --set revision=asm-176-1
    

    --set revision 参数会将格式为 istio.io/rev=asm-176-1 的修订版本标签添加到 istiod。自动 Sidecar 注入器网络钩子使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。如需为命名空间启用 Sidecar 自动注入功能,您必须使用一个与 istiod 上的标签匹配的修订版本来为其添加标签。

  2. 配置验证网络钩子,使其能够使用修订版本标签查找 istiod 服务:

    kubectl apply -f istiod-service.yaml
    

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

专用

在下面的代码中,您将 service.beta.kubernetes.io/aws-load-balancer-internal 注释添加到 Anthos Service Mesh 创建的所有服务中。如果存在此注释,则 Anthos clusters on AWS 会创建专用 Ingress 服务。

  1. 将以下 YAML 保存到名为 istio-operator-internal-lb.yaml 的文件:

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      components:
        ingressGateways:
        - enabled: true
          k8s:
            serviceAnnotations:
              service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    
  2. 安装 Anthos Service Mesh:

    istioctl install \
     --set profile=asm-multicloud \
     --set revision=asm-176-1 \
     -f istio-operator-internal-lb.yaml
    

    --set revision 参数会将格式为 istio.io/rev=asm-176-1 的修订版本标签添加到 istiod。自动 Sidecar 注入器网络钩子使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。如需为命名空间启用 Sidecar 自动注入功能,您必须使用一个与 istiod 上的标签匹配的修订版本来为其添加标签。

  3. 配置验证网络钩子,使其能够使用修订版本标签查找 istiod 服务:

    kubectl apply -f istiod-service.yaml
    

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

在没有 Prometheus 和 Kiali 的情况下安装

默认情况下,在 Anthos Service Mesh 1.7 及更早版本中,Anthos Service Mesh 会从 docker.ioquay.io 的原始软件包库中安装 PrometheusKiali。如果您不想安装这些工具或不允许连接到这些代码库,请将 -set addonComponents.prometheus.enabled=false--set addonComponents.kiali.enabled=false 传递给 istioctl install。例如,使用以下命令从公共子网安装排除 Prometheus 和 Kiali。

  istioctl install \
    --set profile=asm-multicloud \
    --set addonComponents.prometheus.enabled=false \
    --set addonComponents.kiali.enabled=false \
    --revision=asm-176-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                    1/1     Running     0          7m36s
promsd-576b8db4d6-lqf64                   2/2     Running     1          7m19s

注入 Sidecar 代理

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

  • 您需要在具有在集群上运行的工作负载的所有命名空间上启用自动注入,然后再安装 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-176-1-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-176-1,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-176-1-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-176-1,istio=istiod,pod-template-hash=5788d57586

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

  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 提供预配置的入站流量网关 istio-ingressgateway,该网关可用于管理流向服务网格上运行的应用的入站流量。如需允许从集群外部(例如通过浏览器)访问应用,请执行以下操作:

  • 您需要获取将 istio-ingressgateway 配置为使用的外部负载平衡器的外部 IP 地址或主机名和端口。

  • 您的应用必须定义网关和 VirtualService 资源,类似于 Online Boutique 示例应用的 frontend-gateway.yaml

如需获取 istio-ingressgateway 的外部地址,请执行以下操作:

  1. 创建 INGRESS_HOST 环境变量:

    export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
  2. 创建 INGRESS_PORT 环境变量:

    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    
  3. 如需进行测试,请部署一个示例应用,例如 Online Boutique

  4. 如需通过浏览器访问该应用,请在网址中使用 $INGRESS_HOST:$INGRESS_PORT 的值。

问题排查

Anthos clusters on AWS 会要求标记包含负载平衡器端点的子网。Anthos clusters on AWS 会自动标记在 AWSCluster 资源的 spec.Networking.ServiceLoadBalancerSubnetIDs 字段中指定的所有子网。

如果您要向用户集群添加额外的子网,或者需要将标记重新应用到现有子网,请执行以下步骤。

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 使用 kubectl 获取集群的 AWS VPC 的 ID,并将其存储为变量。

     export VPC_ID=$(\
     env HTTP_PROXY=http://localhost:8118 \
     kubectl get awscluster cluster-0 -o jsonpath='{.spec.networking.vpcID}')
    
  3. 使用 echo 检查变量内容。输出类似于 vpc-12345678abcdef0

    echo $VPC_ID
    
  4. 将集群 ID 保存到环境变量。

    export CLUSTER_ID=$(\
    env HTTP_PROXY=http://localhost:8118 \
    kubectl get awscluster cluster-0 -o jsonpath='{.status.clusterID}')
    

    您可以使用 echo 检查变量:

    echo $CLUSTER_ID
    

    响应包含您的集群 ID。

    gke-12345678
    
  5. 默认情况下,Anthos clusters on AWS 会设置含有专用和公共子网的 VPC。如需检索子网 ID,请使用 aws 命令行工具。

    从以下选项中进行选择:

    • 公共(如果要在公共子网上公开 Service)。
    • 专用(如果要在专用子网上公开 Service)。
    • 多个子网(如果要在多个子网上公开 Service)。

    公开

     export SUBNET_ID=$(aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*public*" \
     --query "Subnets[*].SubnetId" \
     --output text)
    

    输出内容是包含子网 ID 的对象。它类似于 subnet-1234abcdefg。您可以使用 echo 检查变量:

    echo $SUBNET_ID
    

    响应会包含您的子网 ID。

    subnet-012345678abcdef
    

    专用

     export SUBNET_ID=$(aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*private*" \
     --query "Subnets[*].SubnetId" \
     --output text)
    

    输出内容是包含子网 ID 的对象。它类似于 subnet-1234abcdefg。您可以使用 echo 检查变量:

    echo $SUBNET_ID
    

    响应会包含您的子网 ID。

    subnet-012345678abcdef
    

    多个子网

    如果您为 AWSNodePool 使用多个子网(例如,如果您使用多个可用性区域),则需要单独标记子网 ID。

    使用 aws ec2 describe-subnets 检索子网 ID 的列表。

    如需获取所有公共子网的列表,请运行以下命令:

    aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*public*" \
     --query "Subnets[*].SubnetId" \
     --output text
    

    如需获取所有专用子网的列表,请运行以下命令:

    aws ec2 describe-subnets \
     --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*private*" \
     --query "Subnets[*].SubnetId" \
     --output text
    

    响应会包含您的子网 ID。

    subnet-012345678abcdef
    subnet-abcdef123456789
    subnet-123456789abcdef
    
  6. 使用集群 ID 标记您的子网。如果您拥有多个子网,请选择“多个子网”。

    单个子网

    aws ec2 create-tags \
    --resources $SUBNET_ID \
    --tags Key=kubernetes.io/cluster/$CLUSTER_ID,Value=shared
    

    多个子网

    针对您的每个子网运行以下命令:

    aws ec2 create-tags \
    --resources subnet-ids \
    --tags Key=kubernetes.io/cluster/$CLUSTER_ID,Value=shared
    

    subnet-ids 替换为子网 ID 列表,以空格分隔。例如 subnet-012345678abcdef subnet-abcdef123456789 subnet-123456789abcdef

后续步骤

在 Anthos clusters on AWS 上创建示例部署