使用 Istio API 安装和升级网关

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

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

  • 入站流量网关:借助入站流量网关,您可以配置专用入口节点来接收传入的 HTTP/TCP 连接。

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

本页介绍了部署和升级网关代理的最佳实践,以及配置自己的 istio-ingressgatewayistio-egressgateway 网关代理的示例。

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

部署网关的最佳做法

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

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

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

最佳做法包括:

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

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

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

最佳做法包括:

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

部署示例网关

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

以下步骤展示了如何部署示例网关。

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

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. 启用用于注入的命名空间。具体步骤取决于您的控制平面实现

    受管理 (TD)

    1. 将默认注入标签应用于命名空间:
    kubectl label namespace GATEWAY_NAMESPACE \
        istio.io/rev- istio-injection=enabled --overwrite
    

    受管理(Istiod)

    推荐:运行以下命令可将默认注入标签应用于命名空间:

      kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    如果您是使用托管式 Istiod 控制平面的现有用户:我们建议您使用默认注入,但也支持基于修订版本的注入。请按照以下说明操作:

    1. 运行以下命令以查找可用的发布渠道:

      kubectl -n istio-system get controlplanerevision
      

      输出类似于以下内容:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注意:如果上述列表中显示了两个控制平面修订版本,请移除其中一个。不支持在集群中使用多个控制平面渠道。

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

    2. 将修订版本标签应用于命名空间:

      kubectl label namespace GATEWAY_NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    集群内

    推荐:运行以下命令可将默认注入标签应用于命名空间:

      kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    我们建议您使用默认注入,但也支持基于修订版本的注入:请按照以下说明操作:

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

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 将修订版本标签应用于命名空间。在以下命令中,REVISION_LABEL 是您在上一步中记下的 istiod 修订版本标签的值。

      kubectl label namespace GATEWAY_NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  3. anthos-service-mesh 代码库复制示例网关的配置文件。

  4. 将目录更改为 samples 目录。如需确保您位于正确的目录中,请运行 ls 命令以列出目录内容,然后确认存在 gateways 目录(您将在下一步中访问该目录)和 online-boutique 目录。

  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

像管理任何其他 Kubernetes 应用一样管理网关资源。anthos-service-mesh-packages 代码库中的示例旨在提供指导和快速入门。您可以根据需要对其进行自定义。

网关选择器

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

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

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

如需查看网关配置和虚拟服务的示例,请参阅 Online Boutique 示例应用中的 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 Cloud 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,网关服务器的默认最低 TLS 版本为 1.2。您可以使用 minProtocolVersion 字段配置最低 TLS 版本。如需了解详情,请参阅 ServerTLSSettings

不受支持的功能

如果您使用的是 TRAFFIC_DIRECTOR 控制平面实现,则网关不支持以下字段或值:

  • 值为 AUTO_PASSTHROUGH 的 ServerTLSSettings.TLSmode
  • ServerTLSSettings.verifyCertificateSpki
  • ServerTLSSettings.verifyCertificateHash

排查网关问题

未能从 auto 更新网关映像

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