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