安装和升级网关

Cloud Service Mesh 允许您将网关部署和管理为服务网格的一部分。网关描述了在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。网关是 Envoy 代理,可让您精确控制进出网格的流量。网关主要用于管理入站流量,但您也可以将网关配置为管理其他类型的流量。例如:

  • 出站网关:通过出站流量网关,您可以为离开网格的流量配置专用退出节点,从而限制哪些服务可以或应该访问外部网络,或者启用安全控制出站流量的添加“网格安全”等。

  • 东西网关:东西流量的代理,允许服务工作负载在不同网络上的多主网格中跨集群边界通信。默认情况下,此网关在互联网上为公开。

本页面介绍了部署和升级网关代理的最佳做法,以及配置自己的 istio-ingressgatewayistio-egressgateway 网关代理的示例。流量分配、重定向和重试逻辑等 应用 网关 网关代理的配置。然后,您可以将虚拟服务绑定到网关,而不是将应用层流量路由 (L7) 添加到同一 API 资源。因此,您可以像管理服务网格中的任何其他数据层面流量一样管理网关流量。

您可以通过不同的方式部署网关,并且可以选择在同一集群中使用多个拓扑。如需详细了解这些拓扑,请参阅 Istio 文档中的网关部署拓扑

部署网关的最佳做法

部署网关的最佳实践取决于您使用的是代管式数据平面还是非代管式数据平面

代管式数据平面的最佳实践

  1. 启用代管式数据平面
  2. 向命名空间添加代管式修订版本标签
  3. 单独部署和管理控制层面和网关。
  4. 为保证安全性,我们建议您在与控制层面不同的命名空间中部署网关。
  5. 使用自动边车注入(又称“自动注入”)为网关注入代理配置,具体做法类似于为服务注入边车代理。

最佳做法包括:

  • 确保代管式网关能够自动更新为采用最新的增强功能和安全更新措施。
  • 将网关实例的管理和维护工作分流到 Cloud Service Mesh 代管式数据平面

非代管式数据平面的最佳实践

  1. 单独部署和管理控制层面和网关。
  2. 为保证安全性,我们建议您在与控制层面不同的命名空间中部署网关。
  3. 使用自动边车注入(又称“自动注入”)为网关注入代理配置,具体做法类似于为服务注入边车代理。

最佳做法包括:

  • 您的命名空间管理员无需对整个集群授予较高权限,即可管理网关。
  • 让您的管理员使用与管理 Kubernetes 应用相同的部署工具或机制来部署和管理网关。
  • 使管理员能够完全控制网关 Deployment,并简化操作。当新升级可用或配置更改时,管理员只需重启网关即可更新它们。这使得操作网关 Deployment 的体验与操作服务的 Sidecar 代理相同。

部署网关

为了支持用户使用现有部署工具,Cloud Service Mesh 支持 部署网关的方法 IstioIstioOperator、Helm 和 Kubernetes YAML。每种方法都会产生相同的结果。虽然您可以选择自己最熟悉的方法,但我们建议您使用 Kubernetes YAML 方法,因为它更易于修改,而且您可以将混合清单存储在源代码控制系统中。

  1. 为网关创建命名空间(如果您还没有命名空间)。将 GATEWAY_NAMESPACE 替换为您的命名空间名称。

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. 如需启用自动注入功能,请使用默认注入标签(如果设置了默认标记)或名称空间的修订版本标签为您的命名空间添加标签。您添加的标签还取决于 代管式 Cloud Service Mesh 或安装了集群内控制平面Sidecar 注入器 Webhook 会使用标签将注入的 Sidecar 与特定控制平面修订版本相关联。

    根据您的安装类型(代管式控制平面或集群内控制平面)选择下面的标签页。

    代管式

    使用以下命令查找可用的发布渠道:

    kubectl -n istio-system get controlplanerevision
    

    输出类似于以下内容:

    NAME                AGE
    asm-managed         6d7h
    asm-managed-rapid   6d7h
    

    在输出中,NAME 列的值是与 Cloud Service Mesh 版本可用的发布版本对应的修订版本标签。

    集群内

    对于集群内控制平面,istiod Service 和部署通常 具有类似于 istio.io/rev=asm-1187-26 的修订版本标签,其中 asm-1187-26 标识 Cloud Service Mesh 版本。修订版本将成为 istiod 服务名称的一部分,例如 istiod-asm-1187-26.istio-system

    使用以下命令在集群内控制层面的 istiod 上查找修订版本标签:

    kubectl get deploy -n istio-system -l app=istiod \
      -o=jsonpath='{.items[*].metadata.labels.istio\.io\/rev}''{"\n"}'
    
  3. 启用用于注入的命名空间。将 REVISION 替换为修订版本标签的值。

    kubectl label namespace GATEWAY_NAMESPACE istio-injection- istio.io/rev=REVISION --overwrite
    
  4. 如果您使用 asmcli 安装了 Cloud Service Mesh,请切换到您在 --output_dir 中指定的目录,然后使用 cd 转到 samples 目录。

    如果您未使用 asmcli 进行安装,请从 anthos-service-mesh 代码库中复制网关的配置文件。

  5. 您可以按原样部署位于 samples/gateways/ 目录中的示例网关配置,也可以根据需要对其进行修改。

    入站流量

    kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-ingressgateway
    

    出站流量

    kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-egressgateway
    
  6. 创建部署后,验证新服务是否正常运行:

    kubectl get pod,service -n GATEWAY_NAMESPACE
    

    验证输出内容类似如下:

    NAME                                      READY   STATUS    RESTARTS   AGE
    pod/istio-ingressgateway-856b7c77-bdb77   1/1     Running   0          3s
    
    NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
    service/istio-ingressgateway   LoadBalancer   10.24.5.129    34.82.157.6      80:31904/TCP   3s

网关选择器

网关配置应用于 istio-ingressgatewayistio-egressgateway 代理,以管理网格的入站和出站流量,从而指定要进入或离开网格的流量。网关部署的 Pod 上的标签供网关配置资源使用,因此,您的网关选择器必须与这些标签匹配。

例如,在上述部署中,istio=ingressgateway 是在网关 Pod 上设置的。如需将网关配置应用于这些部署,您需要选择相同的标签:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
...

有关网关配置和虚拟服务的示例, 请参阅 frontend.yaml

升级网关

就地升级

对于大多数用例,您应该按照就地升级模式升级网关。由于网关利用 Pod 注入功能,因此创建新网关 Pod 将自动注入最新的配置(包括版本)。

如果要更改网关使用的控制平面修订版本,您可以在网关 Deployment 上设置 istio.io/rev 标签,该标签也将触发滚动重启。

代管式控制平面

由于 Google 负责管理代管式控制平面升级,因此您只需重启网关 Deployment,即可自动注入具有最新配置和版本的新的 Pod。

kubectl rollout restart deployment istio-ingressgateway \
  -n GATEWAY_NAMESPACE

集群内控制平面

如需在具有集群内控制平面时将相同的模式应用于网关,您需要更改网关使用的控制平面修订版本。请在网关 Deployment 上设置 istio.io/rev 标签,以触发滚动重启。所需的步骤取决于您是否需要更新命名空间和/或网关 pod 中的修订版本标签。

  • 如果您已为注入的命名空间添加标签,请将命名空间上的 istio.io/rev 标签设置为新的修订版本值:

      kubectl label namespace GATEWAY_NAMESPACE \
        istio-injection- istio.io/rev=REVISION \
        --overwrite
    
  • 如果您只为网关 pod 启用了注入,请将 Deployment 上的 istio.io/rev 标签设置为新的修订版本值,如以下 Kubernetes YAML 文件所示:

    cat <<EOF > gateway-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: istio-ingressgateway
      namespace: GATEWAY_NAMESPACE
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      template:
        metadata:
          annotations:
            # This is required to tell Anthos Service Mesh to inject the gateway with the
            # required configuration.
            inject.istio.io/templates: gateway
          labels:
            istio: ingressgateway
            istio.io/rev: REVISION
        spec:
          containers:
          - name: istio-proxy
            image: auto # The image will automatically update each time the pod starts.
    EOF
    
    kubectl apply -f gateway-deployment.yaml
    

Canary 升级(高级)

如果您使用的是集群内控制平面,并且希望更慢地控制新控制平面修订版本的发布,则可以遵循 Canary 升级模式。您可以运行网关 Deployment 的多个版本,并确保部分流量按预期正常运行。例如,如果要发布新的修订版本 Canary,请创建网关 Deployment 的副本,并将 istio.io/rev=REVISION 标签设置为新修订版本和新名称,例如istio-ingressgateway-canary

apiVersion: apps/v1
kind: Deployment
metadata:
  name: istio-ingressgateway-canary
  namespace: GATEWAY_NAMESPACE
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  template:
    metadata:
      annotations:
        inject.istio.io/templates: gateway
      labels:
        istio: ingressgateway
        istio.io/rev: REVISION # Set to the control plane revision you want to deploy
    spec:
      containers:
      - name: istio-proxy
        image: auto

创建此 Deployment 后,您将有两个网关版本,这两个版本由同一 Service 选择:

kubectl get endpoints -o "custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name"

NAME                   PODS
istio-ingressgateway   istio-ingressgateway-788854c955-8gv96,istio-ingressgateway-canary-b78944cbd-mq2qf

如果您确信应用按预期正常运行,请运行以下命令,通过删除使用旧 istio.io/rev 标签集的 Deployment 来转换为新版本:

kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE

如果您在使用新版网关测试应用时遇到问题,请运行以下命令,通过删除使用新 istio.io/rev 标签集的 Deployment,切换回旧版:

kubectl delete deploy/istio-ingressgateway-canary -n GATEWAY_NAMESPACE

高级配置

配置网关的最低 TLS 版本

对于 Cloud Service Mesh 1.14 及更高版本,默认最低 TLS 版本 网关服务器为 1.2您可以使用 minProtocolVersion 字段配置最低 TLS 版本。如需了解详情,请参阅 ServerTLSSettings

排查网关问题

未能从 auto 更新网关映像

部署或升级网关时,Cloud Service Mesh 会将 auto 作为占位符插入 image 字段中。在调用变更 webhook 之后, Cloud Service Mesh 会自动将此占位符替换为实际的 Cloud Service Mesh 代理映像。如果对更改网络钩子的调用失败,则 auto 占位符仍然存在,并且将找不到容器。这通常是由命名空间标签不正确引起的。确保您已配置正确的命名空间,然后再次部署或升级网关。