设置具有虚拟机实例组后端的传统代理网络负载均衡器(SSL 代理)

本文档介绍如何设置具有目标 SSL 代理和虚拟机实例后端的传统代理网络负载均衡器。在开始之前,请先阅读外部代理网络负载均衡器概览,了解这些负载均衡器的工作原理。

设置概览

此示例演示了如何为存在于两个区域(区域 A 和区域 B)中的服务设置外部代理网络负载均衡器。您将配置以下内容:

  1. 分布在两个区域中的四个实例
  2. 用于保存实例的实例组
  3. 包括以下内容的后端组件:
    • 健康检查 - 用于监控实例的健康状况
    • 后端服务 - 监控实例组并防止它们超出配置的使用量
    • 后端 - 用于容纳实例组
  4. 包括以下内容的前端组件:
    • SSL 证书资源。 您可以使用自行管理的证书(由您提供自己的 SSL 证书),也可以使用 Google 管理的证书(由 Google 为您的所有网域颁发的有效证书)。如需了解详情,请参阅 SSL 证书类型
    • SSL 代理及其 SSL 证书
    • 一个外部静态 IPv4 地址和一条将用户流量发送到代理的转发规则
    • 一个外部静态 IPv6 地址和一条将用户流量发送到代理的转发规则
  5. 允许流量从负载均衡器和健康检查器传输到实例的防火墙规则。
  6. (可选)SSL 政策,用于控制 SSL 代理负载均衡器与客户端协商的 SSL 功能。

之后,您将测试自己的配置。

权限

若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须具有项目的 Owner 或 Editor 角色,或者必须拥有以下所有 Compute Engine IAM 角色

任务 所需角色
创建网络、子网和负载均衡器组件 Network Admin
添加和移除防火墙规则 Security Admin
创建实例 Compute Instance Admin

如需了解详情,请参阅以下指南:

配置网络和子网

如需创建示例网络和子网,请按照以下步骤操作。

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 输入网络的名称

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

  5. 新子网部分,为子网指定以下配置参数:

    1. 名称字段中,提供子网的名称。
    2. 区域字段中,输入区域名称。
    3. IP 栈类型字段中,选择 IPv4(单栈)
    4. IP 地址范围字段中,输入 IP 地址范围。这是子网的主要 IPv4 地址范围
  6. 点击完成

  7. 如需在其他区域中添加子网,请点击添加子网,然后重复上述步骤。

  8. 点击创建

gcloud

gcloud compute networks subnets update SUBNET \
    --network=NETWORK \
    --stack-type=IPV4_ONLY \
    --range=10.1.2.0/24 \
    --region=REGION_A

替换以下内容:

  • NETWORK:VPC 网络的名称

  • SUBNET:子网的名称

  • REGION_A:区域的名称

配置实例和实例组

本部分介绍了如何创建实例和实例组并将实例添加到实例组中。 生产系统通常会使用基于实例模板托管实例组,但这种设置对于初始测试来说会更快。

创建实例

使用防火墙规则稍后将用到的 ssl-lb 标记创建这些实例。

控制台

创建实例

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-a1

  4. 可用区设置为 ZONE_A

  5. 点击高级选项

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

    • 网络标记字段中,输入 ssl-lballow-health-check-ipv6
  7. 网络接口部分中,点击修改并进行以下更改:

    • 选择网络。
    • 选择子网。

    • 点击完成

  8. 点击管理。将以下脚本输入启动脚本字段。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo tee /var/www/html/index.html
  9. 其余字段保留默认值。

  10. 点击创建

  11. 使用相同的设置创建 vm-a2,但需要将启动脚本设置为以下内容:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html
  12. 使用相同的设置创建 vm-b1,但需要将可用区设置为 ZONE_B,并将启动脚本设置为以下内容:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html
  13. 使用相同的设置创建 vm-b2,但需要将可用区设置为 ZONE_B,并将启动脚本设置为以下内容:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud

  1. ZONE_A 可用区中创建 vm-a1

    gcloud compute instances create vm-a1 \
       --image-family debian-12 \
       --image-project debian-cloud \
       --tags ssl-lb \
       --zone ZONE_A \
       --metadata startup-script="#! /bin/bash
         sudo apt-get update
         sudo apt-get install apache2 -y
         sudo a2ensite default-ssl
         sudo a2enmod ssl
         sudo service apache2 restart
         echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo tee /var/www/html/index.html
         EOF"
    
  2. ZONE_A 可用区中创建 vm-a2

    gcloud compute instances create vm-a2 \
      --image-family=debian-12 \
      --image-project=debian-cloud \
      --tags=ssl-lb \
      --zone=ZONE_A \
      --metadata=startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html
         EOF"
    
  3. ZONE_B 可用区中创建 vm-b1

    gcloud compute instances create vm-b1 \
      --image-family=debian-12 \
      --image-project=debian-cloud \
      --tags=ssl-lb \
      --zone=ZONE_B \
      --metadata=startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html
        EOF"
    
  4. ZONE_B 可用区中创建 vm-b2

    gcloud compute instances create vm-b2 \
      --image-family=debian-12 \
      --image-project=debian-cloud \
      --tags=ssl-lb \
      --zone=ZONE_B \
      --metadata=startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html
        EOF"
    

为每个地区创建实例组并添加实例

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    进入“实例组”

  2. 点击创建实例组

  3. 名称设置为 instance-group-a

  4. 可用区设置为 ZONE_A

  5. 端口映射下,点击添加端口。负载均衡器通过一个指定的端口将流量发送到实例组。创建一个已命名端口来将传入流量映射到特定的端口号。

    1. 输入端口名称 ssl-lb端口号 443
  6. 实例定义下,点击选择现有实例

  7. 虚拟机实例中,选择 vm-a1vm-a2

  8. 其他设置保持不变。

  9. 点击创建

  10. 重复上述步骤,但设置以下内容:

    • 名称instance-group-b
    • 可用区ZONE_B
    • 端口名称 ssl-lb端口号 443
    • 实例vm-b1vm-b2
  11. 确认您现有两个实例组,每个实例组有两个实例。

gcloud

  1. 创建 instance-group-a 实例组。

    gcloud compute instance-groups unmanaged create instance-group-a --zone ZONE_A
    
  2. 为实例组设置一个命名端口。

    gcloud compute instance-groups set-named-ports instance-group-a \
        --named-ports=ssl-lb:443 \
        --zone=ZONE_A
    
  3. vm-a1vm-a2 添加到 instance-group-a

    gcloud compute instance-groups unmanaged add-instances instance-group-a \
        --instances=vm-a1,vm-a2 \
        --zone=ZONE_A
    
  4. 创建 instance-group-b 实例组。

    gcloud compute instance-groups unmanaged create instance-group-b --zone ZONE_B
    
  5. 为实例组设置一个命名端口。

    gcloud compute instance-groups set-named-ports instance-group-b \
        --named-ports=ssl-lb:443 \
        --zone=ZONE_B
    
  6. vm-b1vm-b2 添加到 instance-group-b

    gcloud compute instance-groups unmanaged add-instances instance-group-b \
        --instances=vm-b1,vm-b2 \
        --zone=ZONE_B
    

您现在具有两个地区,每个地区中具有一个实例组,而每个实例组具有两个实例。

为 SSL 负载均衡器创建防火墙规则

将防火墙配置为允许来自负载均衡器和健康检查程序的流量发送到实例。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 点击创建防火墙规则

  3. 名称字段中,输入 allow-ssl-lb-and-health

  4. 选择网络。

  5. 目标下,选择指定的目标标记

  6. 目标标记设置为 ssl-lb

  7. 来源过滤条件设置为 IPv4 范围

  8. 来源 IPv4 范围设置为 130.211.0.0/2235.191.0.0/16

  9. 协议和端口下,将指定的协议和端口设置为 tcp:443

  10. 点击创建

gcloud

gcloud compute firewall-rules create allow-ssl-lb-and-health \
  --source-ranges=130.211.0.0/22,35.191.0.0/16 \
  --target-tags=ssl-lb \
  --allow=tcp:443

如果您要使用 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态

gcloud compute ssl-certificates list

配置负载均衡器

控制台

开始配置

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

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步
  4. 对于代理或直通,选择代理负载均衡器,然后点击下一步
  5. 公共或内部字段中,选择公共(外部),然后点击下一步
  6. 全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步
  7. 对于负载均衡器生成,选择传统代理网络负载均衡器,然后点击下一步
  8. 点击配置

基本配置

名称设置为 my-ssl-lb

后端配置

  1. 点击后端配置
  2. 后端类型下,选择实例组
  3. 协议设置为 SSL
  4. 对于已命名端口,输入 ssl-lb
  5. 接受超时的默认值。
  6. 后端类型设置为实例组
  7. 配置第一个后端:
    1. 新后端下,选择实例组 instance-group-a
    2. 端口号设置为 443
    3. 保留其余的默认值。
  8. 配置第二个后端:
    1. 点击添加后端
    2. 选择实例组 instance-group-b
    3. 端口号设置为 443
    4. 点击完成
  9. 配置健康检查:
    1. 健康检查中,选择创建健康检查
    2. 将健康检查的名称设置为 my-ssl-health-check
    3. 协议下,选择 SSL
    4. 保留其余的默认值。
    5. 点击保存并继续
  10. 在 Google Cloud 控制台中,验证后端配置旁边是否有对勾标记。如果没有对勾标记,请仔细检查您是否完成了所有步骤。

前端配置

  1. 点击前端配置
    1. 添加第一条转发规则:
    2. 输入 my-ssl-lb-forwarding-rule 作为名称
    3. 协议下,选择 SSL
    4. IP 地址下,选择创建 IP 地址
      1. 输入 ssl-lb-static-ipv4 作为名称
      2. 点击预留
    5. 证书下,选择创建新证书
    6. 输入 my-ssl-cert 作为名称
    7. 如果您选择上传我的证书,请完成以下步骤:
      1. 粘贴您的证书,或点击上传以找到您的证书文件。
      2. 粘贴您的私钥,或点击上传以找到您的私钥文件。
    8. 如果您选择创建 Google 管理的证书,请输入网域
      1. 要输入其他网域,请点击添加网域
      2. 点击创建
    9. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请点击其他证书。然后从证书菜单中选择另一个证书,或点击创建新证书并按照上述说明操作。
      1. (可选)如需创建 SSL 政策,请执行以下操作:
      2. SSL 政策下,选择创建政策
      3. 输入 my-ssl-policy 作为名称
      4. 对于最低的 TLS 版本,请选择 TLS 1.0
      5. 对于配置文件,请选择新型。系统会显示已启用的功能已停用的功能
      6. 点击保存
    10. 可选:开启代理协议
    11. 点击完成
      添加第二条转发规则:
    1. 点击添加前端 IP 和端口
    2. 输入 my-ssl-lb-ipv6-forwarding-rule 作为名称
    3. IP 版本设置为 IPv6
    4. IP 地址下,点击创建 IP 地址
      1. 输入 ssl-lb-static-ipv6 作为名称。
      2. 点击预留
    5. 证书下,选择 my-ssl-cert
    6. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请从证书列表中选择一个证书,或点击创建新证书
    7. 可选:使用 SSL 政策或开启代理协议
    8. 点击完成
    9. 在 Google Cloud 控制台中,验证前端配置旁边是否有绿色对勾标记。如果没有对勾标记,请仔细检查您是否完成了上述所有步骤。
    10. 点击完成

检查并最终确定

  1. 点击检查并最终确定
  2. 查看负载均衡器配置设置。
  3. 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
  4. 点击创建

gcloud

  1. 创建健康检查。
       gcloud compute health-checks create ssl my-ssl-health-check --port=443
       
  2. 创建后端服务。
       gcloud compute backend-services create my-ssl-lb \
           --load-balancing-scheme EXTERNAL \
           --global-health-checks \
           --protocol=SSL \
           --port-name=ssl-lb \
           --health-checks=my-ssl-health-check \
           --timeout=5m \
           --global
       

    或者,您可以使用 --protocol=TCP 配置从负载均衡器到实例的未加密通信。

  3. 将实例组添加到后端服务。
       gcloud compute backend-services add-backend my-ssl-lb \
           --instance-group=instance-group-a \
           --instance-group-zone=ZONE_A \
           --balancing-mode=UTILIZATION \
           --max-utilization=0.8 \
           --global
       
       gcloud compute backend-services add-backend my-ssl-lb \
           --instance-group=instance-group-b \
           --instance-group-zone=ZONE_B \
           --balancing-mode=UTILIZATION \
           --max-utilization=0.8 \
           --global
       
  4. 配置 SSL 证书资源。

    如果您要使用自行管理的证书,则必须至少已有一个可上传的 SSL 证书。如果您没有相应证书,请参阅 SSL 证书概览。如果您使用多个 SSL 证书,则必须一次创建一个证书。

    如果您要使用自行管理的 SSL 证书,并且没有私钥和签名证书,则可以创建并使用自签名证书进行测试。

    如需创建自行管理的 SSL 证书资源,请运行以下命令:

       gcloud compute ssl-certificates create my-ssl-cert \
           --certificate=CRT_FILE_PATH \
           --private-key=KEY_FILE_PATH
       

    如需创建 Google 管理的 SSL 证书资源,请运行以下命令:

       gcloud compute ssl-certificates create www-ssl-cert \
           --domains=DOMAIN_1,DOMAIN_2
       
  5. 配置目标 SSL 代理。

    外部代理网络负载均衡器支持创建具有 1 到 15 个 SSL 证书的目标 SSL 代理。在运行此命令之前,您必须为每个证书创建一个 SSL 证书资源。

    如果您要开启代理标头,请将其设置为 PROXY_V1,而不是 none。您可以视情况选择将某项 SSL 政策附加到目标代理。首先,请创建政策。

       gcloud compute ssl-policies create my-ssl-policy \
           --profile=MODERN \
           --min-tls-version=1.0
       

    然后将该政策附加到目标代理。

       gcloud compute target-ssl-proxies create my-ssl-lb-target-proxy \
           --backend-service=my-ssl-lb \
           --ssl-certificates=[SSL_CERT_1][,[SSL_CERT_2],...] \
           --ssl-policy=my-ssl-policy \
           --proxy-header=NONE
       
  6. 预留全局静态 IP 地址。

    您的客户会使用这些 IP 地址来访问已进行负载均衡的服务。

       gcloud compute addresses create ssl-lb-static-ipv4 \
           --ip-version=IPV4 \
           --global
       
       gcloud compute addresses create ssl-lb-static-ipv6 \
           --ip-version=IPV6 \
           --global
       
  7. 配置全局转发规则。

    创建与目标代理相关联的全局转发规则。 将 LB_STATIC_IPLB_STATIC_IPV6 替换为您在预留全球静态 IP 地址中生成的 IP 地址。

       gcloud compute forwarding-rules create my-ssl-lb-forwarding-rule \
           --load-balancing-scheme EXTERNAL \
           --global \
           --target-ssl-proxy=my-ssl-lb-target-proxy \
           --address=LB_STATIC_IP \
           --ports=443
       
       gcloud compute forwarding-rules create my-ssl-lb-ipv6-forwarding-rule \
           --load-balancing-scheme EXTERNAL \
           --global \
           --target-ssl-proxy=my-ssl-lb-target-proxy \
           --address=LB_STATIC_IPV6 \
           --ports=443
       

将您的网域连接到负载均衡器

创建负载均衡器后,请记好与负载均衡器关联的 IP 地址,例如 30.90.80.100。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A 记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A 记录,所有网域均指向负载均衡器的 IP 地址。例如,如需为 www.example.comexample.com 创建 A 记录,请使用以下命令:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用 Cloud DNS 作为 DNS 提供商,请参阅添加、修改和删除记录

测试负载均衡器

在网络浏览器中,使用 HTTPS 连接到您的静态 IP 地址。在此测试设置中,实例使用的是自签名证书。因此,在您第一次访问页面时,您会在浏览器中看到一条警告。点击该警告即可查看实际页面。将 IP_ADDRESS 替换为您之前创建的 IPv4 或 IPv6 地址。

https://IP_ADDRESS

您应该会看到离您最近的地区中的一台主机。重新加载此页面,直到您看到该区域中的其他实例。如需查看其他地区中的实例,请停止离您最近的区域中的实例。

或者,您也可以在本地机器的命令行中使用 curl。 如果您在 SSL 代理上使用自签名证书,则还必须指定 -k。即使您拥有自签名证书或根本没有证书,都可选择 curl -k 选项来使 curl 发挥作用。如果您拥有一个普通证书,则可以移除该参数。您只能将 -k 参数用于测试您自己的网站。在正常情况下,有效证书是一项重要的安全措施,因此不应忽略证书警告。

IP_ADDRESS 替换为您之前创建的 IPv4 或 IPv6 地址。

curl -k https://IP_ADDRESS

如果您无法访问负载均衡器,请尝试排查设置问题下所述的步骤。

其他配置选项

本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

用于保留客户端连接信息的 PROXY 协议

代理网络负载均衡器会终结来自客户端的 TCP 连接,并创建与实例的新连接。默认情况下,系统不会保留原始客户端 IP 地址和端口信息。

如需保留原始连接信息并将其发送到实例,请启用 PROXY 协议版本 1。此协议将包含来源 IP 地址、目标 IP 地址和端口号的附加标头作为请求的一部分发送给实例。

请确保代理网络负载均衡器的后端实例运行的是支持 PROXY 协议标头的服务器。如果服务器未配置为支持 PROXY 协议标头,则后端实例将返回空响应。

如果您为用户流量设置了 PROXY 协议,则还可以为健康检查设置此协议。如果您检查健康状况并在同一端口上传送内容,请将健康检查的 --proxy-header 设置为与您的负载均衡器设置相匹配。

PROXY 协议标头通常是一行用户可读的文本,格式如下:

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

以下示例显示了 PROXY 协议:

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

在上面的示例中,客户端 IP 为 192.0.2.1,负载均衡 IP 为 198.51.100.1,客户端端口为 15221,目标端口为 110

如果客户端 IP 未知,则负载均衡器会生成如下格式的 PROXY 协议标头:

PROXY UNKNOWN\r\n

更新目标代理的 PROXY 协议标头

此页面上的负载均衡器设置示例介绍了如何在创建代理网络负载均衡器时启用 PROXY 协议标头。请按照以下步骤更改现有目标代理的 PROXY 协议标头。

控制台

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

    进入“负载均衡”

  2. 点击负载均衡器对应的 修改
  3. 点击前端配置
  4. 代理协议字段的值更改为开启
  5. 点击更新以保存更改。

gcloud

在以下命令中,修改 --proxy-header 字段并将其设置为 NONEPROXY_V1,具体取决于您的要求。

gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \
    --proxy-header=[NONE | PROXY_V1]

配置会话亲和性

以下过程介绍了如何更新示例 SSL 代理负载均衡器的后端服务,以使后端服务使用客户端 IP 亲和性。

启用客户端 IP 亲和性后,负载均衡器会根据使用客户端 IP 地址和负载均衡器 IP 地址(外部转发规则的外部 IP 地址)创建的哈希,将特定客户端的请求定向到同一后端虚拟机。

控制台

如需启用客户端 IP 地址会话亲和性,请执行以下操作:

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

    进入“负载均衡”

  2. 点击后端

  3. 点击 my-ssl-lb(您为此示例创建的后端服务的名称),然后点击修改

  4. 后端服务详情页面上,点击高级配置

  5. 会话亲和性下,从菜单中选择客户端 IP

  6. 点击更新

gcloud

使用以下命令更新 my-ssl-lb 后端服务,并指定客户端 IP 会话亲和性:

gcloud compute backend-services update my-ssl-lb \
    --global \
    --session-affinity=CLIENT_IP

API

如需设置客户端 IP 会话亲和性,请向 backendServices/patch 方法发出 PATCH 请求。

PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/us-west1/backendServices/my-ssl-lb
{
  "sessionAffinity": "CLIENT_IP"
}

启用连接排空

您可以在后端服务上启用连接排空,以确保在终止、手动移除或由自动扩缩器移除正在处理流量的实例时,对用户造成的干扰最小。如需详细了解连接排空,请参阅启用连接排空文档。

后续步骤