使用外部负载均衡器公开入站流量网关

概览

使用 Cloud Service Mesh 时,您可以将入站流量网关作为服务网格的一部分进行部署和管理。您可以使用外部负载均衡器(集群外部的物理或软件负载均衡器)将流量发送到入站流量网关,从而进一步使用 Cloud Service Mesh 为集群配置负载均衡。

本页介绍了如何使用 Cloud Service Mesh 配置外部负载均衡器。 或者,您可以设置具有多个后端配置的入站流量网关

准备工作

要完成本文档中的步骤,您需要以下资源:

  • 安装了 Cloud Service Mesh 的 Kubernetes 集群。

  • 可以访问运行集群的节点的外部负载均衡器。您可以使用负载均衡器的外部 IP 地址,将此外部负载均衡器配置为集群入站流量网关的前端。

设置环境

从可以访问您要使用的集群的工作站运行以下命令。确保 kubectl 工具已配置为使用您的集群特有的集群上下文。

  1. 设置环境变量。

    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
    
  2. 设置外部负载均衡器的 IP address

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [\Optional/] 为入站流量网关节点添加标签。这可确保网关部署到集群中的特定节点。

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP 是 Kubernetes 集群中托管入站流量网关的节点。为您的每一个入站流量节点运行此 kubectl 命令。

创建入站流量网关

在完成本部分中的说明之前,您需要确定控制平面实现。如需执行此操作,请按照识别控制平面实现中的说明操作。

  1. 创建命名空间。此命名空间用于部署入站流量网关。

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

    受管理 (TD)

    1. 将默认注入标签应用于命名空间:
    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
    

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

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

      kubectl -n istio-system get controlplanerevision
      

      输出类似于以下内容:

      NAME                AGE
      asm-managed-rapid   6d7h
      

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

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

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

      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
    

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

    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 ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. 应用入站流量网关清单文件

    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
    
  3. 使用外部负载均衡器 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)"
    
  4. [可选] 修补 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 端口信息

  1. 获取 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}')
    
  2. 显示 NodePorts

    echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT}
    echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT}
    echo STATUS_PORT=${STATUS_PORT}
    

配置外部负载均衡器

使用上一步中显示的 NodePorts 配置外部负载均衡器和入站流量网关之间的连接。

  1. 在负载均衡器配置中配置健康检查。

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP 是 Kubernetes 集群中托管入站流量网关的节点的 IP 地址。此 IP 地址必须可从外部负载均衡器访问。您需要为每个集群节点设置一次此配置,因此可能需要进行多次设置。

    • STATUS_PORT:公开入站流量网关的健康状况 API 需要使用的 NodePort。您可以从上一步中复制此信息。此值对于集群中的每个节点都是相同的。

  2. 在负载均衡器中配置用于路由 HTTPHTTPS 流量的节点池。对端口 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:公开入站流量网关的 HTTP 流量需要使用的 NodePort。您可以从上一步中复制此信息。此值对于集群中的每个节点都是相同的。

    • HTTPS_INGRESS_PORT:公开入站流量网关的 HTTPS 流量需要使用的 NodePort。您可以从上一步中复制此信息。此值对于集群中的每个节点都是相同的。

如需验证设置,请确保负载均衡器上的健康检查都通过。

后续步骤