创建负载均衡服务

本教程展示了作为服务提供方的您如何创建使用内部直通式网络负载平衡器的简单服务。默认情况下,内部直通式网络负载平衡器只能从托管它的 VPC 网络内部访问。

本教程面向云架构师、网络架构师、网络管理员和 IT 管理员。

目标

  • 为服务提供方资源配置网络
  • 为负载均衡器后端创建虚拟机资源
  • 配置负载均衡器组件
  • 测试对负载均衡器的访问

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

如需根据您的预计使用量来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 创建或选择一个项目,以用于服务提供方资源。 在后续教程中,此项目称为 PRODUCER_PROJECT
    1. In the Google Cloud console, go to the project selector page.

      Go to project selector

    2. Select or create a Google Cloud project.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
  2. Enable the Compute Engine API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  3. Make sure that you have the following role or roles on the project: Compute Engine > Compute Network Admin, Compute Engine > Compute Security Admin, Compute Engine > Compute Instance Admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      前往 IAM
    2. 选择项目。
    3. 点击 授予访问权限
    4. 新的主账号字段中,输入您的用户标识符。 这通常是 Google 账号的电子邮件地址。

    5. 点击选择角色,然后搜索相应角色。
    6. 如需授予其他角色,请点击 添加其他角色,然后添加其他各个角色。
    7. 点击 Save(保存)。

配置网络

以下部分介绍了如何为服务创建网络、子网和防火墙规则。

配置网络和子网

如需为负载均衡器创建服务网络和子网,请完成以下部分中的步骤。

控制台

  1. 在 Google Cloud 控制台中,前往 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 service-network

  4. 对于子网创建模式,选择自定义

  5. 新子网部分中,输入以下信息。

    1. 对于名称,输入 service-subnet
    2. 对于区域,选择您要使用的区域。
    3. IP 栈类型字段中,选择 IPv4(单栈)
    4. 对于 IPv4 范围,输入 10.10.10.0/24
    5. 点击完成
  6. 点击创建

gcloud

  1. 创建一个自定义模式 VPC 网络:

    gcloud compute networks create service-network --subnet-mode=custom
    
  2. service-network 网络中,创建一个子网。

    gcloud compute networks subnets create service-subnet \
        --network=service-network \
        --range=10.10.10.0/24 \
        --region=REGION
    

    REGION 替换为您要使用的区域。

配置防火墙规则

创建防火墙规则以允许以下流量:

  • fw-allow-subnet:允许来自 10.10.10.0/24 的流量到达 10.10.10.0/24 中的其他资源。
  • fw-allow-ssh:允许来自 0.0.0.0/0 的 SSH 流量到达具有 allow-ssh 网络标记的虚拟机。
  • fw-allow-healthcheck:允许来自 Google Cloud健康检查系统的流量到达具有allow-healthcheck网络标记的虚拟机。

控制台

  1. 在 Google Cloud 控制台中,前往防火墙政策页面。

    前往“防火墙政策”

  2. 如需允许子网流量,请点击创建防火墙规则,然后使用以下设置:

    • 对于名称,输入 fw-allow-subnet
    • 对于网络,请选择 service-network
    • 优先级字段中,输入 1000
    • 对于流量方向,选择入站
    • 对于对匹配项执行的操作,选择允许
    • 对于目标,选择网络中的所有实例
    • 对于来源过滤条件,选择 IPv4 范围
    • 对于来源 IPv4 范围,输入 10.10.10.0/24
    • 对于协议和端口,选择全部允许
  3. 点击创建

  4. 如需允许传入 SSH 连接,请点击创建防火墙规则,然后使用以下设置:

    • 对于名称,输入 fw-allow-ssh
    • 对于网络,请选择 service-network
    • 优先级字段中,输入 1000
    • 对于流量方向,选择入站
    • 对于对匹配项执行的操作,选择允许
    • 对于目标,选择 Specified target tags
    • 对于目标标记,请输入 allow-ssh
    • 对于来源过滤条件,选择 IPv4 范围
    • 对于来源 IPv4 范围,输入 0.0.0.0/0
    • 协议和端口部分,选择指定的协议和端口,然后选中 TCP 复选框。对于端口,输入 22
  5. 点击创建

  6. 如需允许 Google Cloud 健康检查,请点击创建防火墙规则,然后使用以下设置:

    • 对于名称,输入 fw-allow-healthcheck
    • 对于网络,请选择 service-network
    • 优先级字段中,输入 1000
    • 对于流量方向,选择入站
    • 对于对匹配项执行的操作,选择允许
    • 对于目标,选择 Specified target tags
    • 对于目标标记,请输入 allow-healthcheck
    • 对于来源过滤条件,选择 IPv4 范围
    • 对于来源 IPv4 范围,输入 130.211.0.0/2235.191.0.0/16
    • 对于协议和端口,选择全部允许
  7. 点击创建

gcloud

  1. 创建 fw-allow-subnet 防火墙规则以允许在子网内进行通信:

    gcloud compute firewall-rules create fw-allow-subnet \
        --network=service-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.10.10.0/24 \
        --rules=tcp,udp,icmp
    

  1. 创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=service-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=0.0.0.0/0 \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

  1. 创建 fw-allow-healthcheck 规则以允许 Google Cloud健康检查。

    gcloud compute firewall-rules create fw-allow-healthcheck \
        --network=service-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-healthcheck \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp,udp,icmp
    

为负载均衡器后端创建虚拟机资源

创建虚拟机和实例组以用于负载均衡器。

创建后端虚拟机

您要创建的服务在两个虚拟机上运行,以实现更高的可用性:vm-1vm-2。这些虚拟机位于同一可用区,但在生产环境中,我们建议使用多个可用区。

除了创建虚拟机之外,按照以下步骤操作还可以实现以下目的:

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例

  3. 对于名称,输入 vm-1

  4. 区域可用区部分,选择一个区域以及该区域内的一个可用区。

  5. 在导航菜单中,前往操作系统和存储空间

  6. 操作系统和存储空间窗格中,确保为启动磁盘选择了 Debian GNU/Linux 12 (bookworm)。如果您需要选择其他图片,请点击更改

  7. 在导航菜单中,前往网络

  8. 网络标记字段中,输入 allow-sshallow-healthcheckallow-nat

  9. 对于网络接口,请选择以下内容:

    • 对于网络,请选择 service-network
    • 对于子网,请选择 service-subnet
    • IP 栈类型字段中,选择 IPv4(单栈)
    • 主要内部 IPv4 地址字段中,选择临时(自动)
    • 对于外部 IPv4 地址,选择临时
  10. 在导航菜单中,前往高级

  11. 自动化部分的启动脚本字段中,输入以下脚本。

    
    #! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed
    

  12. 点击创建

  13. 重复上述步骤,在与 vm-1 相同的区域和可用区中创建另一个名为 vm-2 的虚拟机。

gcloud

  1. 运行以下命令,创建两个虚拟机:

    gcloud compute instances create vm-1 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-healthcheck,allow-nat \
        --subnet=service-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    
    gcloud compute instances create vm-2 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-healthcheck,allow-nati \
        --subnet=service-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

    ZONE 替换为您要使用的可用区。

创建实例组

如需使用负载均衡器后端中的虚拟机,您必须将这些虚拟机添加到实例组。

控制台

  1. 在 Google Cloud 控制台中,前往实例群组页面。

    进入“实例组”

  2. 点击创建实例组

  3. 在导航窗格中,点击新建非托管式实例组

  4. 对于名称,输入 ig-1

  5. 位置部分,选择与虚拟机相同的区域和可用区。

  6. 对于网络,请选择 service-network

  7. 对于子网,选择 service-subnet

  8. 虚拟机实例部分中,将 vm-1vm-2 添加到实例组。

  9. 点击创建

gcloud

  1. 创建非托管实例组:

    gcloud compute instance-groups unmanaged create ig-1 \
        --zone=ZONE
    

    ZONE 替换为包含虚拟机的可用区。

  2. 将虚拟机添加到实例组:

    gcloud compute instance-groups unmanaged add-instances ig-1 \
        --zone=ZONE \
        --instances=vm-1,vm-2
    

配置负载均衡器组件

配置所有内部直通式网络负载平衡器组件,先配置健康检查和后端服务,然后再配置前端组件:

  • 健康检查。您使用检查 HTTP 200 OK 状态代码的 HTTP 健康检查。

  • 后端服务。由于您需要通过内部负载均衡器传递 HTTP 流量,因此需要使用 TCP,而不是 UDP。

  • 转发规则。您创建了一个内部转发规则,即 service-rule

  • 内部 IP 地址。您可以在创建转发规则时指定内部 IP 地址 10.10.10.99

控制台

开始配置

  1. 在 Google Cloud 控制台中,前往负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步
  4. 对于代理或直通,选择直通式负载均衡器,然后点击下一步
  5. 公共或内部字段中,选择内部,然后点击下一步
  6. 点击配置

基本配置

创建内部直通网络负载均衡器页面上,输入以下信息:

  • 负载均衡器名称字段中,输入 service-lb
  • 对于区域,选择与您的虚拟机相同的区域。
  • 对于网络,请选择 service-network

配置后端

  1. 点击后端配置
  2. 健康检查列表中,点击创建健康检查,然后输入以下信息:
    • 对于名称,输入 hc-http-80
    • 对于协议:,请选择 HTTP
    • 对于端口:,请输入 80
    • 对于代理协议:,请选择 NONE
    • 对于请求路径:,请输入 /
  3. 点击创建
  4. 后端新建后端部分,选择 IPv4(单栈)
  5. 实例组中,选择 ig-1 实例组,然后点击完成
  6. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。

配置前端

  1. 点击前端配置
  2. 新建前端 IP 和端口部分,执行以下操作:
    1. 对于名称,输入 service-rule
    2. 对于子网,选择 service-subnet
    3. 内部 IP 用途部分的 IP 地址列表中,选择创建 IP 地址,输入以下信息:
      • 对于名称,输入 service-rule-ip
      • 对于 IP 版本,请选择 IPv4
      • 对于静态 IP 地址,选择让我选择
      • 对于自定义 IP 地址,输入 10.10.10.99
    4. 点击保留
    5. 对于端口,选择单个,然后在端口号中输入 80
    6. 点击完成
    7. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。

检查配置

  1. 点击检查并最终确定
  2. 查看负载均衡器配置设置。
  3. 点击创建

gcloud

  1. 创建一个新的区域性 HTTP 健康检查,以测试端口 80 上的虚拟机的 HTTP 连接。

    gcloud compute health-checks create http hc-http-80 \
        --region=REGION \
        --port=80
    

    REGION 替换为与后端虚拟机相同的区域。

  2. 为 HTTP 流量创建后端服务:

    gcloud compute backend-services create service-lb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=REGION \
        --health-checks=hc-http-80 \
        --health-checks-region=REGION
    

    REGION 替换为与后端虚拟机相同的区域。

  3. 将实例组添加到后端服务:

    gcloud compute backend-services add-backend service-lb \
        --region=REGION \
        --instance-group=ig-1 \
        --instance-group-zone=ZONE
    

    替换以下内容:

    • REGION:与后端虚拟机相同的区域。
    • ZONE:与后端虚拟机相同的可用区。
  4. 为后端服务创建转发规则:

    gcloud compute forwarding-rules create service-rule \
        --region=REGION \
        --load-balancing-scheme=internal \
        --network=service-network \
        --subnet=service-subnet \
        --address=10.10.10.99 \
        --ip-protocol=TCP \
        --ports=80 \
        --backend-service=service-lb \
        --backend-service-region=REGION
    

    REGION 替换为与后端虚拟机相同的区域。

测试对负载均衡器的访问

如需测试负载均衡器是否正常运行,请创建测试虚拟机并从该虚拟机向负载均衡器发送请求。

创建客户端虚拟机以进行测试

在后端(服务器)虚拟机所在的同一区域中创建客户端虚拟机。

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例

  3. 对于名称,输入 producer-test

  4. 对于区域,选择与后端虚拟机相同的区域。

  5. 地区部分,选择该区域内的一个地区。

  6. 点击网络并配置以下字段:

    1. 对于网络标记,请输入 allow-ssh
    2. 对于网络接口,请选择以下内容:
      • 对于网络,请选择 service-network
      • 对于子网,请选择 service-subnet
  7. 点击创建

gcloud

gcloud compute instances create producer-test \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=service-subnet

ZONE 替换为与后端虚拟机位于同一区域的可用区。

测试连接性

此测试通过客户端虚拟机连接负载均衡器。预期行为是流量分布在负载均衡器的后端虚拟机中。

  1. 连接到客户端虚拟机实例。
    gcloud compute ssh producer-test --zone=ZONE
    
    ZONE 替换为客户端虚拟机的可用区。
  2. 使用 curl 连接负载均衡器的 IP 地址,通过这种方式向负载均衡器发送 Web 请求。重复该请求,您可以看到响应来自不同的后端虚拟机。根据每个后端虚拟机上 /var/www/html/index.html 的内容,生成响应的虚拟机的名称会显示在 HTML 响应的文本中。例如,预期响应如 Page served from: vm-1Page served from: vm-2 所示。
    curl -s http://10.10.10.99
    

后续步骤