谷歌云 Kubernetes 实操手册:配置 Ingress 以实现内部负载平衡

准备环境

为使用内部 HTTP(S) 负载平衡器准备好您的环境:

1、准备网络环境,以便将负载平衡器代理部署到指定区域中。配置网络和子网部分介绍了如何部署代理专用子网。您不必手动部署防火墙规则,因为这些规则由 GKE Ingress 控制器进行管理。您必须在部署 Ingress 之前完成此操作。

2、通过 Kubernetes Ingress API 部署负载平衡器资源。下文提供了具体操作步骤。

部署适用于内部 HTTP(S) 负载平衡的 Ingress

请按照以下部分中的说明部署 Ingress。

第 1 步:创建负载均衡的网络和子网

您需要一个包含两个子网的 VPC 网络:一个用于负载平衡器的后端,另一个用于负载平衡器的代理。内部 HTTP(S) 负载平衡器是地区负载平衡器。对于 VPC 网络中的流量,如果其来源所在的子网与负载平衡器位于同一地区,那么该流量会被路由到负载平衡器。

本示例使用以下 VPC 网络、地区和子网:

  • 网络:网络是名为 lb-network 的自定义模式 VPC 网络。
  • 后端子网:us-central1 地区中名为 backend-subnet 的子网使用 10.1.2.0/24 作为其主要 IP 地址范围。
  • 代理子网:us-central1 地区中名为 proxy-only-subnet 的子网使用 10.129.0.0/23 作为其主要 IP 地址范围。

为后端配置网络和子网

使用 gcloud compute networks create 命令创建自定义 VPC 网络:

    gcloud compute networks create lb-network --subnet-mode=custom

使用 gcloud compute networks subnets create 命令在 us-central1 地区的 lb-network 网络中创建子网:

    gcloud compute networks subnets create backend-subnet \

    --network=lb-network \

    --range=10.1.2.0/24 \

    --region=us-central1


配置代理专用子网

代理专用子网适用于 us-central1 地区内的所有内部 HTTP(S) 负载平衡器。

重要提示:请勿尝试将代理专用子网中的地址分配给负载平衡器的转发规则或后端。您可以从一个或多个其他子网范围中分配转发规则的 IP 地址和后端实例的 IP 地址。Google Cloud 会为 Google Cloud 管理的代理预留此子网范围。

使用 gcloud compute networks subnets create 命令创建代理专用子网。

    gcloud compute networks subnets create proxy-only-subnet \

    --purpose=INTERNAL_HTTPS_LOAD_BALANCER \

    --role=ACTIVE \

    --region=us-central1 \

    --network=lb-network \

    --range=10.129.0.0/23


配置防火墙规则

此示例使用以下防火墙规则:

  • fw-allow-ssh。适用于负载平衡实例的入站流量规则,该规则允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记 allow-ssh。
  • fw-allow-health-check。适用于负载平衡实例的入站流量规则,该规则允许来自 Google Cloud 运行状况检查系统(130.211.0.0/22 和 35.191.0.0/16)的所有 TCP 流量。此示例使用目标标记 load-balanced-backend。
  • fw-allow-proxies。适用于负载平衡实例的入站流量规则,该规则允许从内部 HTTP(S) 负载平衡器的代管式代理发送到端口 80、443 和 8080 的 TCP 流量。此示例使用目标标记 load-balanced-backend。

如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。

目标标记定义了后端实例。没有目标标记,防火墙规则将应用于 VPC 网络中的所有后端实例

创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 source-ranges,Google Cloud 会将规则解释为表示所有来源。

    gcloud compute firewall-rules create fw-allow-ssh \

    --network=lb-network \

    --action=allow \

    --direction=ingress \

    --target-tags=allow-ssh \

    --rules=tcp:22


创建 fw-allow-health-check 规则以允许 Google Cloud 运行状况检查。本示例允许来自运行状况检查探测工具的所有 TCP 流量;但是,您可以根据自己的需求配置较小范围的端口集。

    gcloud compute firewall-rules create fw-allow-health-check \

    --network=lb-network \

    --action=allow \

    --direction=ingress \

    --source-ranges=130.211.0.0/22,35.191.0.0/16 \

    --target-tags=load-balanced-backend \

    --rules=tcp


创建 fw-allow-proxies 规则以允许内部 HTTP(S) 负载平衡器的代理连接到您的后端。

    gcloud compute firewall-rules create fw-allow-proxies \

    --network=lb-network \

    --action=allow \

    --direction=ingress \

    --source-ranges=10.129.0.0/23 \

    --target-tags=load-balanced-backend \

    --rules=tcp:80,tcp:443,tcp:8080


第 2 步:创建GKE集群

在此步骤中,您将在启用了别名 IP 地址的快速发布版本中创建集群。

使用以下命令创建集群:

    gcloud beta container clusters create cluster-ingress-internal-lb \

    --release-channel=rapid \

    --enable-ip-alias \

    --zone=us-central1

    --network=lb-network \

    --subnetwork=backend-subnet

其中:

  • cluster-name 是您为集群选择的名称。
  • --enable-ip-alias 表示启用别名 IP 地址。使用适用于内部 HTTP(S) 负载平衡的 Ingress 的集群必须以“VPC 原生(别名 IP 地址)”模式运行。如需了解详情,请参阅创建 VPC 原生集群。
  • --release-channel=rapid 表示在"快速发布版本"中创建集群。内部HTTP(S)负载平衡的Ingress在GKE 1.16.5-gke.1和更高版本上可用。
  • us-central1表示在您选择的地区中创建集群。您所选择的地区必须与您在配置网络和子网时为内部 HTTP(S) 负载平衡器创建的代理子网位于同一区域。
  • lb-network 是您要在其中创建集群的网络的名称。此网络必须与代理子网位于同一 VPC 网络中。
  • backend-subnet 是您要在其中创建集群的子网的名称。该网络是lb-network的子网。


第 3 步:部署 Web 应用

在此步骤中,您将使用一个在端口 9376 上侦听 HTTPS 服务器的容器映像创建 Deployment。此 Deployment 将为您的应用管理 Pod。每个 Pod 运行一个具有 HTTPS 服务器的应用容器,该 HTTPS 服务器会将应用服务器的主机名作为响应返回。Pod 的默认主机名就是 Pod 的名称。该容器还会处理正常终止。

下面提供了一个示例 Deployment 文件 web-deployment.yaml。

    # web-deployment.yaml

      apiVersion: apps/v1

      kind: Deployment

      metadata:

      labels:

      app: hostname

      name: hostname-server

      spec:

      selector:

      matchLabels:

      app: hostname

      minReadySeconds: 60

      replicas: 3

      template:

      metadata:

      labels:

      app: hostname

      spec:

      containers:

    - image: k8s.gcr.io/serve_hostname:v1.4

      name: hostname-server

      ports:

    - containerPort: 9376

      protocol: TCP

      terminationGracePeriodSeconds: 90


创建 Deployment 后,您可以将该资源应用于集群。

使用以下命令应用该资源:

    kubectl apply -f web-deployment.yaml


第 4 步:将 Service 部署为网络端点组 (NEG)

在此步骤中,您将创建一项 Service 资源。该 Service 资源会根据后端容器的标签选择容器,以便 Ingress 控制器将这些容器编程为后端端点。如需使用适用于内部 HTTP(S) 负载平衡的 Ingress,您必须将 NEG 用作后端,而不能将实例组用作后端。由于需要使用 NEG 后端,因此在部署将通过 Ingress 公开的 Service 时应使用 NEG 注释:

    annotations:

      cloud.google.com/neg: '{"ingress": true}'


通过使用 NEG,Ingress 控制器可以执行容器原生负载平衡。流量负载会从 Ingress 代理直接平衡到 Pod IP 地址,而不是遍历节点 IP 地址或 kube-proxy 网络。此外,系统会实施 Pod 就绪性门控措施,以便从负载平衡器的角度(而不仅仅是从 Kubernetes 就绪性和活跃检查角度)确定 Pod 的运行状况。这样可以确保流量在 Pod 启动、Pod 丢失或节点丢失等生命周期事件期间不会被丢弃。

如果不使用 NEG 注释,您将收到一条关于 Ingress 对象的警告,阻止您配置内部 HTTP(S) 负载平衡器。如果发生这种情况,系统会在 Ingress 上生成一个 Kubernetes 事件。以下是该事件消息的示例:

    Message

    -------

    error while evaluating the ingress spec: could not find port "8080" in service "default/no-neg-svc"


在 Ingress 引用该 Service 之前,不会创建 NEG。只有在 Ingress 及其引用的 Service 都已经存在的情况下,NEG 才会出现在 Compute Engine 中。NEG 是一种地区级资源;对于多地区集群,每个地区的每项 Service 都将创建一个 NEG。

如需创建 Service,请使用 YAML 文件。下面提供了一个使用正确注释的示例文件

    web-service.yaml。

    # web-service.yaml

    apiVersion: v1

    kind: Service    

    metadata:

    name: hostname

    namespace: default

    annotations:

    cloud.google.com/neg: '{"ingress": true}'

    spec:

    ports:

    - name: host1

    port: 80

    protocol: TCP

    targetPort: 9376

    selector:

    app: hostname

    type: NodePort


创建 Service 后,您可以将该资源应用于集群。

    kubectl apply -f web-service.yaml


第 5 步:部署 Ingress

在此步骤中,您将创建一项 Ingress 资源,该资源通过 Ingress 控制器触发 Compute Engine 负载平衡的部署。Ingress 内部 HTTP(S) 负载平衡需要使用以下注释:

    annotations:

      kubernetes.io/ingress.class: "gce-internal"

警告:对于在 GKE 上部署的任何 Ingress 资源,如果不使用 kubernetes.io/ingress.class 注释,则该资源将被解释为外部 Ingress 资源,此类资源会为 Service 部署外部负载平衡器。

为了防止用户在无意中省略正确注释的情况下公开提供应用,建议实施一项 Cloud IAM 政策来对公共负载平衡器的创建施加限制。这样不但可以阻止公共负载平衡器被部署到整个集群范围,同时仍允许通过 Ingress 和 Service 资源创建内部负载平衡器。

如需部署 Ingress 资源,请复制并保存以下 internal-ingress.yaml 文件。

    # internal-ingress.yaml

    apiVersion: networking.k8s.io/v1beta1

      kind: Ingress

    metadata:

      name:

      namespace: default

      annotations:

        kubernetes.io/ingress.class: "gce-internal"

    spec:

      backend:

        serviceName: hostname

        servicePort: 80


复制该文件后,您可以将该资源应用于集群:

    kubectl apply -f internal-ingress.yaml


第 6 步:验证 Ingress 是否成功部署

Ingress 资源可能需要几分钟时间才能完成预配。在此期间,Ingress 控制器会创建诸如转发规则、后端服务、网址映射和 NEG 之类的项目。

如需检索 Ingress 资源的状态,请使用以下命令:

    kubectl get ingress ilb-demo-ingress

您将看到如下所示的输出:

    NAME               HOSTS    ADDRESS            PORTS     AGE

    ilb-demo-ingress   *        10.1.2.11        80        3m59s

ADDRESS 字段填充后,Ingress 即已准备就绪。在此字段中使用的 RFC 1918 地址表示 VPC 中的一个内部 IP 地址。由于内部 HTTP(S) 负载平衡器是区域级负载平衡器,因此只能从位于同一区域和 VPC 内的客户端访问 VIP 地址。检索负载平衡器 VIP 地址后,您可以使用 curl 等工具从 VPC 内部对 VIP 地址发起 HTTP GET 调用。

如需从 VPC 内部访问 Ingress VIP 地址,请在与集群相同的区域和网络中部署虚拟机。

使用以下命令部署此虚拟机:

    gcloud compute instances create l7-ilb-client-us-central1-a \

    --image-family=debian-9 \

    --image-project=debian-cloud \

    --network=lb-network \

    --subnet=backend-subnet \

    --zone=us-central1-a \

    --tags=allow-ssh


如需从测试虚拟机内部访问内部 VIP 地址,请使用 curl

    # SSH in to the VM

    gcloud compute ssh l7-ilb-client-us-central1-a  --zone=us-central1-a


    bruce_tian@l7-ilb-client-us-central1-a:~$ curl 10.1.2.11

    hostname-server-66569d76fb-77nqs


如果返回成功的 HTTP 响应和一个后端容器的主机名,则表示整个负载平衡路径运行正常。


WebEye 是中国大陆地区首家获得 Google Cloud MSP 资质的合作伙伴。点击了解:企业上云服务

WebEye 为全球企业提供⼀站式数字媒体营销解决方案、增长效率工具平台、云服务、安全合规、游戏发行服务。我们汇集全球优质的移动营销资源,用大数据精准决策,用AI管理创意素材,用智能化平台实现聚合广告投放。WebEye云计算服务与多云管理平台、安全合规服务助力企业全面数字化转型。子品牌ModooPlay为国内外游戏开发者提供全渠道、一站式的游戏发行服务。


返回全部