使用外部负载均衡器公开入站流量网关
概览
使用 Cloud Service Mesh 时,您可以将入站流量网关作为服务网格的一部分进行部署和管理。您可以使用外部负载均衡器(集群外部的物理或软件负载均衡器)将流量发送到入站流量网关,从而进一步使用 Cloud Service Mesh 为集群配置负载均衡。
本页介绍了如何使用 Cloud Service Mesh 配置外部负载均衡器。 或者,您可以设置具有多个后端配置的入站流量网关。
准备工作
要完成本文档中的步骤,您需要以下资源:
安装了 Cloud Service Mesh 的 Kubernetes 集群。
可以访问运行集群的节点的外部负载均衡器。您可以使用负载均衡器的外部 IP 地址将此外部负载均衡器配置为集群入站流量网关的前端。
设置环境
从可以访问您要使用的集群的工作站运行以下命令。确保 kubectl
工具已配置为使用您的集群特有的集群上下文。
设置环境变量。
export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
设置外部负载均衡器的
IP address
。export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
[\Optional/] 为入站流量网关节点添加标签。这可确保网关部署到集群中的特定节点。
kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
- INGRESSGATEWAY_NODE_IP 是 Kubernetes 集群中托管入站流量网关的节点。为您的每一个入站流量节点运行此
kubectl
命令。
- INGRESSGATEWAY_NODE_IP 是 Kubernetes 集群中托管入站流量网关的节点。为您的每一个入站流量节点运行此
创建入站流量网关
在完成本部分中的说明之前,您需要确定控制平面实现。如需执行此操作,请按照识别控制平面实现中的说明操作。
创建命名空间。此命名空间用于部署 Ingress 网关。
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
启用用于注入的命名空间。具体步骤取决于您的控制平面实现。
受管理 (TD)
- 将默认注入标签应用于命名空间:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
代管式 (Istiod)
建议:运行以下命令,将默认注入标签应用于命名空间:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
如果您是使用 Managed Istiod 控制平面的现有用户: 我们建议您使用默认注入,但基于修订版本的注入 支持。请按照以下说明操作:
运行以下命令查找可用的发布渠道:
kubectl -n istio-system get controlplanerevision
输出类似于以下内容:
NAME AGE asm-managed-rapid 6d7h
注意:如果上述列表中显示了两个控制平面修订版本,请移除其中一个。不支持在集群中使用多个控制平面渠道。
在输出中,
NAME
列的值是与 Cloud Service Mesh 版本可用的发布版本对应的修订版本标签。将修订版本标签应用于命名空间:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
集群内
建议:运行以下命令,将默认注入标签应用于命名空间:
kubectl label namespace ${ASM_INGRESSGATEWAY_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 ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
应用入站流量网关清单文件。
kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
预期输出:
serviceaccount/asm-ingressgateway created role.rbac.authorization.k8s.io/asm-ingressgateway created rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created deployment.apps/asm-ingressgateway created service/asm-ingressgateway created poddisruptionbudget.policy/asm-ingressgateway created horizontalpodautoscaler.autoscaling/asm-ingressgateway created
使用外部负载均衡器 IP 地址修补
ingressgateway
服务。cat <<EOF > asm-external-ip-patch.yaml spec: externalIPs: - ${EXTERNAL_LB_IP_ADDRESS} loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS} EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
[可选] 修补
ingressgateway
部署以实现入站流量网关节点标签亲和性。cat <<EOF > asm-ingress-node-label-patch.yaml spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ${ASM_INGRESSGATEWAY_NODE_LABEL} operator: Exists EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
设置外部负载均衡器
在本部分中,您将配置外部负载均衡器, 来自集群的入站流量网关
提取入站流量网关 Service
端口信息
获取
NodePorts
。export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
显示
NodePorts
。echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT} echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT} echo STATUS_PORT=${STATUS_PORT}
配置外部负载均衡器
使用上一步中显示的 NodePorts
配置外部负载均衡器和入站流量网关之间的连接。
在负载均衡器配置中配置健康检查。
hosts: CLUSTER_NODE_IP Protocol: HTTP Port: STATUS_PORT Path: /healthz/ready
CLUSTER_NODE_IP 是 Kubernetes 集群中托管入站流量网关的节点的 IP 地址。此 IP 地址必须可从外部负载均衡器访问。您需要为每个集群节点设置一次此配置,因此可能需要进行多次设置。
STATUS_PORT:公开入站流量网关的健康状况 API 需要使用的
NodePort
。您可以从上一步中复制此信息。此值对于集群中的每个节点都是相同的。
在负载均衡器中配置用于路由
HTTP
和HTTPS
流量的节点池。对端口 80 (HTTP
) 和端口 443 (HTTPS
) 的流量使用以下IP:PORT
配置。80 -> CLUSTER_NODE_IP:HTTP_INGRESS_PORT 443 -> CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
CLUSTER_NODE_IP 是 Kubernetes 集群中托管入站流量网关的节点的 IP 地址。此 IP 地址必须可从外部负载均衡器访问。您需要为每个集群节点设置一次此配置,因此可能需要进行多次设置。
HTTP_INGRESS_PORT:是
NodePort
, Ingress 网关的 HTTP 流量是否公开。您可以从上一步中复制此信息。此值对于集群中的每个节点都是相同的。HTTPS_INGRESS_PORT:是
NodePort
, 入站流量网关的 HTTPS 流量公开。您可以从上一步中复制此信息。此值对于集群中的每个节点都是相同的。
如需验证设置,请确保负载均衡器上的健康检查都通过。
后续步骤
- 详细了解安装和升级网关