使用 Istio API 安装和升级网关
Cloud Service Mesh 允许您将网关部署和管理为服务网格的一部分。网关描述了在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。网关主要用于管理入站流量,但您也可以将网关配置为管理其他类型的流量。
出站网关:通过出站流量网关,您可以为离开网格的流量配置专用退出节点,从而限制哪些服务可以或应该访问外部网络,或者启用安全控制出站流量的添加“网格安全”等。
入站流量网关:借助入站流量网关,您可以配置专用入口节点来接收传入的 HTTP/TCP 连接。
东西网关:东西流量的代理,允许服务工作负载在不同网络上的多主网格中的集群边界之间通信。默认情况下,此网关在互联网上为公开。
本页介绍了部署和升级网关代理的最佳实践,以及配置自己的 istio-ingressgateway
和 istio-egressgateway
网关代理的示例。
您可以通过不同的方式部署网关,并且可以选择在同一集群中使用多个拓扑。如需详细了解这些拓扑,请参阅 Istio 文档中的网关部署拓扑。
部署网关的最佳做法
部署网关的最佳实践取决于您使用的是代管式数据平面还是非代管式数据平面。
代管式数据平面的最佳实践
- 启用代管式数据平面。
- 向命名空间添加代管式修订版本标签。
- 单独部署和管理控制层面和网关。
- 为保证安全性,我们建议您在与控制层面不同的命名空间中部署网关。
- 使用自动边车注入(又称“自动注入”)为网关注入代理配置,具体做法类似于为服务注入边车代理。
最佳做法包括:
- 确保代管式网关能够自动更新为采用最新的增强功能和安全更新措施。
- 将网关实例的管理和维护工作交给 Cloud Service Mesh 代管式数据平面来处理。
非代管式数据平面的最佳实践
- 单独部署和管理控制层面和网关。
- 为保证安全性,我们建议您在与控制层面不同的命名空间中部署网关。
- 使用自动边车注入(又称“自动注入”)为网关注入代理配置,具体做法类似于为服务注入边车代理。
最佳做法包括:
- 您的命名空间管理员无需对整个集群授予较高权限,即可管理网关。
- 让您的管理员使用与管理 Kubernetes 应用相同的部署工具或机制来部署和管理网关。
- 使管理员能够完全控制网关 Deployment,并简化操作。当新升级可用或配置更改时,管理员只需重启网关即可更新它们。这使得操作网关部署的体验与操作服务的 Sidecar 代理相同。
部署示例网关
为通过现有部署工具支持用户,Cloud Service Mesh 支持以与 Istio 相同的方式部署网关:IstioOperator
、Helm 和 Kubernetes YAML。每种方法都会产生相同的结果。虽然您可以选择自己最熟悉的方法,但我们建议您使用 Kubernetes YAML 方法,因为它更易于修改,而且您可以将混合清单存储在源代码控制系统中。
以下步骤展示了如何部署示例网关。
为网关创建命名空间(如果您还没有命名空间)。将
GATEWAY_NAMESPACE
替换为您的命名空间名称。kubectl create namespace GATEWAY_NAMESPACE
启用用于注入的命名空间。具体步骤取决于您的控制平面实现。
受管理 (TD)
- 将默认注入标签应用于命名空间:
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 控制平面的现有用户:我们建议您使用默认注入,但也支持基于修订版本的注入。请按照以下说明操作:
运行以下命令以查找可用的发布渠道:
kubectl -n istio-system get controlplanerevision
输出类似于以下内容:
NAME AGE asm-managed-rapid 6d7h
注意:如果上述列表中显示了两个控制平面修订版本,请移除其中一个。不支持在集群中使用多个控制平面渠道。
在输出中,
NAME
列的值是与 Cloud Service Mesh 版本可用的发布版本对应的修订版本标签。将修订版本标签应用于命名空间:
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
我们建议您使用默认注入,但也支持基于修订版本的注入:请按照以下说明操作:
使用以下命令查找
istiod
的修订版本标签:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
将修订版本标签应用于命名空间。在以下命令中,
REVISION_LABEL
是您在上一步中记下的istiod
修订版本标签的值。kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
从
anthos-service-mesh
代码库复制示例网关的配置文件。将目录更改为
samples
目录。如需确保您位于正确的目录中,请运行ls
命令以列出目录内容,然后确认存在gateways
目录(您将在下一步中访问该目录)和online-boutique
目录。部署入站或出站流量网关。您可以按原样部署位于
samples/gateways/
目录中的示例网关配置,也可以根据需要对其进行修改。入站
kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-ingressgateway
出站流量
kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-egressgateway
创建部署后,验证新服务是否正常运行:
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-ingressgateway
和 istio-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
占位符仍然存在,并且将找不到容器。这通常是由命名空间标签不正确引起的。确保您已配置正确的命名空间,然后再次部署或升级网关。