设置 SSL 代理负载平衡

本文档介绍如何设置 SSL 代理负载平衡。 开始前,请先阅读 SSL 代理负载平衡概览,了解 SSL 代理负载平衡的工作原理。

设置 SSL 代理负载平衡

本示例演示了如何为存在于两个地区(us-central1us-east1)中的一项简单服务设置全球 SSL 代理负载平衡。您将配置以下内容:

  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

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

配置实例和实例组

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

创建实例

如需进行测试,请在四个实例(分别位于两个实例组中,每个实例组中有两个实例)上安装 Apache。通常,您不会使用 SSL 代理负载平衡来处理 HTTP 流量,但 Apache 是一种常用软件,只需简单设置即可用于测试。

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

控制台

创建实例

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例

  3. 名称设置为 ig-us-central1-1

  4. 区域设置为 us-central1-b

  5. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。

  6. 管理下,使用 ssl-lb 填充标记字段。

  7. 启动脚本设置为如下内容:

    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>ig-us-central1-1</h1></body></html>' | sudo tee /var/www/html/index.html

  8. 其余字段保留默认值。

  9. 点击创建

  10. 使用相同的设置创建 ig-us-central1-2,但需要将启动脚本设置为以下内容:

    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>ig-us-central1-2</h1></body></html>' | sudo tee /var/www/html/index.html

  11. 使用相同的设置创建 ig-us-east1-1,但需要将区域设置为 us-east1-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>ig-us-east1-1</h1></body></html>' | sudo tee /var/www/html/index.html

  12. 使用相同的设置创建 ig-us-east1-2,但需要将区域设置为 us-east1-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>ig-us-east1-2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud

  1. us-central1-b 地区中创建 ig-us-central1-1

    gcloud compute instances create ig-us-central1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-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>SSL load balanced instance - US central 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-1].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b n1-standard-1             10.240.0.8  23.251.150.133 RUNNING
  2. us-central1-b 地区中创建 ig-us-central1-2

    gcloud compute instances create ig-us-central1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-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>SSL load balanced instance - US central 2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-2].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-2 us-central1-b n1-standard-1             10.240.0.11 23.251.148.160 RUNNING
  3. us-east1-b 地区中创建 ig-us-east1-1

    gcloud compute instances create ig-us-east1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-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>SSL load balanced instance - US east 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-1].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-1 us-east1-b n1-standard-1             10.240.0.12 104.196.31.214 RUNNING
  4. us-east1-b 地区中创建 ig-us-east1-2

    gcloud compute instances create ig-us-east1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-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>SSL load balanced instance - US east 2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-2].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-2 us-east1-b n1-standard-1             10.240.0.13 104.196.25.101 RUNNING

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

控制台

  1. 转到 Google Cloud Console 中的“实例组”页面。

    转到“实例组”页面

  2. 点击创建实例组

  3. 名称设置为 us-ig1

  4. 地区设置为 us-central1-b

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

    1. 端口名称映射下,点击添加一项
    2. 输入端口名称 ssl-lb端口号 443
  6. 实例定义下,点击选择现有实例

  7. 虚拟机实例中,选择 ig-us-central1-1ig-us-central1-2

  8. 其他设置保持不变。

  9. 点击创建

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

    • 名称us-ig2
    • 地区us-east1-b
    • 端口名称 ssl-lb端口号 443
    • 实例ig-us-east1-1ig-us-east1-2
  11. 确认您现有两个实例组,每个实例组有两个实例。

gcloud

  1. 创建 us-ig1 实例组。

    gcloud compute instance-groups unmanaged create us-ig1 --zone us-central1-b
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
    NAME   ZONE          NETWORK MANAGED INSTANCES
    us-ig1 us-central1-b                 0
  2. 为实例组设置一个命名端口。

    gcloud compute instance-groups set-named-ports us-ig1 \
        --named-ports ssl-lb:443 \
        --zone us-central1-b
    
  3. ig-us-central1-1ig-us-central1-2 添加到 us-ig1

    gcloud compute instance-groups unmanaged add-instances us-ig1 \
        --instances ig-us-central1-1,ig-us-central1-2 \
        --zone us-central1-b
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
  4. 创建 us-ig2 实例组。

    gcloud compute instance-groups unmanaged create us-ig2 --zone us-east1-b
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].
    NAME   ZONE       NETWORK MANAGED INSTANCES
    us-ig2 us-east1-b                 0
  5. 为实例组设置一个命名端口。

    gcloud compute instance-groups set-named-ports us-ig2 \
        --named-ports ssl-lb:443 \
        --zone us-east1-b
    
  6. ig-us-east1-1ig-us-east1-2 添加到 us-ig2

    gcloud compute instance-groups unmanaged add-instances us-ig2 \
         --instances ig-us-east1-1,ig-us-east1-2 \
         --zone us-east1-b
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

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

配置负载平衡器

控制台

创建负载平衡器并配置后端服务

  1. 转到 Google Cloud Console 中的“负载平衡”页面。

    转到“负载平衡”页面

  2. 点击创建负载平衡器

  3. TCP 负载平衡下,点击开始配置

  4. 面向互联网或仅限内部下,选择从互联网到我的虚拟机

  5. 多地区或单地区下,选择多个地区(或尚不确定)

  6. 将负载平衡器的名称设置为 my-ssl-lb

  7. 点击后端配置

  8. 协议设置为 TCP 或者根据情况选择“*SSL”

  9. 接受已命名的端口超时的默认值。

  10. 后端类型设置为实例组

  11. 新后端下,选择实例组 us-ig1

  12. 端口号设置为 443

  13. 其他设置保持不变。

  14. 新后端下,选择实例组 us-ig2

  15. 端口号设置为 443

  16. 其他设置保持不变。

  17. 点击完成

  18. 运行状况检查中,选择创建运行状况检查

    1. 将运行状况检查的名称设置为 my-ssl-health-check
    2. 协议设置为 SSL
    3. 其他设置保持不变。
    4. 点击保存并继续
  19. 在 Google Cloud Console 中,验证后端配置旁边显示了绿色对勾标记。如果没有,请仔细检查您是否完成了上述所有步骤。

配置前端服务

  1. 点击前端配置
  2. 新建前端 IP 和端口下的名称部分中输入 my-ssl-lb-forwarding-rule
  3. 协议设置为 SSL
  4. IP 地址下,选择创建 IP 地址
    1. 输入 ssl-lb-static-ip 作为名称
    2. 点击预留
  5. 证书下,选择创建新证书
  6. 输入 my-ssl-cert 作为名称
  7. 如果您选择上传我的证书,请完成以下步骤:
    1. 在相应的字段中上传您的以下文件:
      • 公钥证书(.crt 文件)
      • 证书链(.csr 文件)
      • 私钥(.key 文件)。
    2. 如需添加其他 SSL 证书,请点击添加证书,然后从证书下拉菜单中选择该证书,或选择创建新证书并按照上述说明操作。
    3. 如果需要,开启代理协议
    4. 点击创建
  8. 如果您选择创建 Google 托管的证书,请输入网域。 每次您按 Enter 时,系统都会显示其他空白字段。您可以在这些字段中输入其他网域。
  9. 点击完成
  10. 点击添加前端 IP 和端口
  11. 输入 my-ssl-lb-ipv6-forwarding-rule 作为名称
  12. IP 版本设置为 IPv6
  13. IP 地址下,选择创建 IP 地址
    1. 输入 ssl-lb-static-ipv6 作为名称
    2. 点击预留
  14. 证书下,选择 my-ssl-cert
  15. 点击完成
  16. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  17. 点击完成
  18. (可选)如需创建一项 SSL 政策,请执行以下操作:
    1. SSL 政策下,选择创建政策
    2. 输入 my-ssl-policy 作为名称
    3. 最低的 TLS 版本选择 TLS 1.0
    4. 配置文件选择新型。您将看到已启用的功能已停用的功能
    5. 点击创建
  19. 在 Google Cloud Console 中,验证前端配置旁边显示了绿色对勾标记。如果没有,请仔细检查您是否完成了上述所有步骤。

检查并最终确定

  1. 点击检查并最终确认
  2. 仔细检查您的设置。
  3. 点击创建

gcloud

创建运行状况检查

gcloud compute health-checks create ssl my-ssl-health-check --port 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks/my-ssl-health-check].
NAME                PROTOCOL
my-ssl-health-check SSL

创建后端服务

gcloud compute backend-services create my-ssl-lb \
    --global-health-checks \
    --protocol SSL \
    --health-checks my-ssl-health-check \
    --timeout 5m \
    --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
NAME      BACKENDS PROTOCOL
my-ssl-lb          SSL

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

将实例组添加到后端服务

gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig1 \
    --instance-group-zone us-central1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig2 \
    --instance-group-zone us-east1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].

配置 SSL 证书资源

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

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

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

gcloud compute ssl-certificates create my-ssl-cert \
    --certificate [CRT_FILE_PATH] \
    --private-key [KEY_FILE_PATH]
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/my-ssl-cert].
NAME      CREATION_TIMESTAMP
my-ssl-cert 2016-02-20T20:53:33.584-08:00

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

    gcloud beta compute ssl-certificates create www-ssl-cert \
      --domains [DOMAIN_1],[DOMAIN_2]

配置目标 SSL 代理

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
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb my-ssl-cert

预留全局静态 IP 地址

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

gcloud compute addresses create ssl-lb-static-ipv4 \
        --ip-version=IPV4 \
        --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ip].
NAME                 REGION ADDRESS               STATUS
ssl-lb-static-ip            [LB_STATIC_IP]        RESERVED
gcloud compute addresses create ssl-lb-static-ipv6 \
        --ip-version=IPV6 \
        --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ipv6].
NAME                 REGION ADDRESS                 STATUS
ssl-lb-static-ipv6          [LB_STATIC_IPV6]        RESERVED

配置全局转发规则

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

gcloud compute forwarding-rules create my-ssl-lb-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IP] \
    --ports 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].
NAME                         REGION IP_ADDRESS     IP_PROTOCOL TARGET
my-ssl-lb-forwarding-rule           [LB_STATIC_IP] SSL         my-ssl-lb-target-proxy
gcloud compute forwarding-rules create my-ssl-lb-ipv6-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IPV6] \
    --ports 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-ipv6-forwarding-rule].
NAME                           REGION    IP_ADDRESS       IP_PROTOCOL TARGET
my-ssl-lb-ipv6-forwarding-rule           [LB_STATIC_IPV6] SSL         my-ssl-lb-target-proxy

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

将防火墙配置为允许来自负载平衡器和运行状况检查程序的流量发送到实例。

控制台


  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则
  3. 输入 allow-ssl-lb-and-health 作为名称
  4. 网络下,选择 default
  5. 目标下,选择指定的目标标记
  6. 目标标记设置为 ssl-lb
  7. 来源过滤条件设置为 IP ranges
  8. 来源 IP 地址范围设置为 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
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health].
NAME                     NETWORK SRC_RANGES                  RULES   SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health default 130.211.0.0/22,35.191.0.0/16 tcp:443          ssl-lb

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

gcloud beta compute ssl-certificates list

测试负载平衡器

在网络浏览器中,使用 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]

其他 SSL 代理命令

列出目标 SSL 代理

控制台

转到 Google Cloud Console 中的“目标代理”列表页面。

转到“目标代理”列表页面

gcloud

gcloud compute target-ssl-proxies list
NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb my-ssl-cert

描述目标 SSL 代理

控制台

  1. 转到 Google Cloud Console 中的“目标代理”列表页面。

    转到“目标代理”列表页面

  2. 点击您的目标 SSL 代理的名称。

gcloud

gcloud compute target-ssl-proxies describe [PROXY_NAME]
creationTimestamp: '2016-02-20T20:55:17.633-08:00'
id: '9208913598676794842'
kind: compute#targetSslProxy
name: my-ssl-lb-target-proxy
proxyHeader: NONE
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy
service: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb
sslCertificates:
– https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/my-ssl-cert

删除目标 SSL 代理

如需删除目标代理,必须先删除引用该代理的所有全局转发规则。

控制台

  1. 转到 Google Cloud Console 中的“全局转发规则”列表页面。

    转到“全局转发规则”列表页面

  2. 选中您的全局转发规则旁边的复选框。

  3. 点击删除

  4. 转到 Google Cloud Console 中的“目标代理”列表页面。

    转到“目标代理”列表页面

  5. 选中您的目标 SSL 代理旁边的复选框。

  6. 点击删除

或者,您可以通过执行以下操作,删除所有负载平衡器组件:

  1. 转到 Google Cloud Console 中的“负载平衡”页面。

    转到“负载平衡”页面

  2. 点击所需行右侧的垃圾桶图标。

  3. 点击删除负载平衡器以确认删除。

gcloud

  1. 删除全局转发规则。

    gcloud compute forwarding-rules delete my-ssl-lb-forwarding-rule \
        --global
    
    The following global forwarding rules will be deleted:
     – [my-ssl-lb-forwarding-rule]
    
    Do you want to continue (Y/n)?  y
    
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].
    
  2. 删除 SSL 代理。

    gcloud compute target-ssl-proxies delete my-ssl-lb-target-proxy
    
    The following target ssl proxies will be deleted:
     – [my-ssl-lb-target-proxy]
    
    Do you want to continue (Y/n)?  y
    
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
    

更新目标 SSL 代理的后端服务

您可以使用 update 命令将 SSL 代理指向其他后端服务。在此示例中,您将创建一个新的后端服务,并将代理指向该服务。然后,您将进行更新并将代理重新指向原始后端服务。

控制台

请使用 gcloud 命令行工具完成此步骤。

gcloud

  1. 使用相同的运行状况检查创建第二个后端服务。

    gcloud compute backend-services create my-other-backend-service \
        --protocol SSL \
        --health-checks my-ssl-health-check \
        --global
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-other-backend-service].
    NAME                     BACKENDS PROTOCOL
    my-other-backend-service          SSL
  2. 将 SSL 代理指向新的后端。

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-other-backend-service
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
    
  3. 此后端服务没有实例,因此如果您现在尝试使用代理,则无法获取您的网页。要继续测试原始配置,请将 SSL 代理重新指向第一个后端服务。

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-ssl-lb
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
    

更新目标 SSL 代理的 SSL 证书资源

使用此命令来替换 SSL 代理上的 SSL 证书。您必须已经创建了所需的其他所有 SSL 证书资源。

控制台

  1. 转到 Google Cloud Console 中的“负载平衡”页面。

    转到“负载平衡”页面

  2. 点击您的负载平衡器旁边的修改

  3. 点击前端配置

  4. 证书下拉菜单中,选择新的证书。

  5. 如果您需要添加更多证书,请点击 Add certificate

  6. 点击完成

gcloud

您可以为每个目标 SSL 代理配置规定数量的 SSL 证书。

gcloud compute target-ssl-proxies set-ssl-certificates [PROXY_NAME] \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...]
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

其他配置选项

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

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

使用 SSL 代理的 Google Cloud Load Balancing 会终止来自客户端的 SSL 连接并创建与实例的新连接。因此在默认情况下,系统不会保留原始客户端 IP 地址和端口信息。

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

您还可以为 TCP 和 SSL 运行状况检查设置 PROXY 协议。

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

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

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

在以下示例中,客户端 IP 地址是 192.0.2.1,负载平衡 IP 地址是 198.51.100.1,客户端端口是 15221,目标端口是 443

PROXY TCP4 192.0.2.1 198.51.100.1 15221 443\r\n

当客户端 IP 地址未知时,负载平衡器会按以下格式生成 PROXY 协议标头:

PROXY UNKNOWN\r\n

更新代理的 PROXY 协议标头

使用以下命令更改某个现有目标 SSL 代理的 PROXY 协议标头。

控制台

  1. 转到 Google Cloud Console 中的“负载平衡”页面。

    转到“负载平衡”页面

  2. 点击您的负载平衡器对应的修改

  3. 点击前端配置

  4. 更改代理协议字段的值。

  5. 点击更新以保存更改。

gcloud

gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
    --proxy-header [NONE | PROXY_V1]

启用连接排空

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

启用会话亲和性

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

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

控制台

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

  1. 转到 Google Cloud Console 中的“负载平衡”页面。

    转到“负载平衡”页面

  2. 点击后端

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

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

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

  6. 点击更新

gcloud

使用以下 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"
}

负载平衡器组件

运行状况检查

运行状况检查可确定哪些实例能接收新连接。 您可以配置 TCP、SSL、HTTP 或 HTTPS 运行状况检查以确定实例的运行状况。

  • 如果在您的后端实例上运行的服务是基于 HTTP,请使用 HTTP 运行状况检查。
  • 如果在您后端实例上运行的服务是基于 HTTPS 的,请使用 HTTPS 运行状况检查。
  • 如果在您后端实例上运行的服务使用的是 SSL,请使用 SSL 运行状况检查。
  • 除非您有明确的理由使用其他种类的运行状况检查,否则请使用 TCP 运行状况检查。

运行状况检查防火墙规则

对您的实例的运行状况检查探测来自范围 130.211.0.0/2235.191.0.0/16 中的地址。您的防火墙规则必须在相关端口上允许这些连接。如需了解相关说明,请参阅为 SSL 负载平衡器创建防火墙规则

如需详细了解运行状况检查,请参阅运行状况检查

后端服务

后端服务资源会向负载平衡器提供配置信息,包括以下信息。

  • 后端服务将传入流量定向到一个或多个连接的后端(取决于负载平衡模式,稍后讨论)。每个后端都包含一个实例组和其他配置,以平衡实例组中实例之间的流量。每个实例组由一个或多个实例组成。
  • 每个后端服务还会指定对添加到后端服务的实例组中的实例执行哪些运行状况检查。
  • 通过负载平衡器的空闲 SSL 代理连接的持续时间会受到后端服务超时的限制。

配置后端服务时,您必须添加实例并指定负载平衡器可向实例发送多少流量的平衡模式。达到上限后,系统会向最接近用户的实例(如果该实例具有容量)发送其他请求。

SSL 代理支持以下平衡模式:

  • UTILIZATION(默认值):如果实例组的后端利用率低于指定值,则实例可以接受流量。如需设置此值,请使用 --max-utilization 参数并传递一个介于 0.0 (0%) 和 1.0 (100%) 之间的值。默认值为 0.8 (80%)。
  • CONNECTION:如果连接数低于指定值,则实例可以接受流量。此值可以为以下项之一:
    • --max-connections:实例组中所有后端实例的最大连接数。
    • --max-connections-per-instance:单个实例可处理的最大连接数。如果该组的平均值不超过此数字,则系统会转发请求。

即使您将平衡模式设置为 UTILIZATION,您也可以指定 --max-connections--max-connections-per-instance。如果同时指定了 --max-utilization 和连接参数,则当达到任一上限时,系统就会认为该组已达到最大利用率。

如需详细了解后端服务资源,请参阅后端服务概览

SSL 证书

如需使用 SSL 代理负载平衡,您必须创建至少一个可供目标代理用于负载平衡器的 SSL 证书。目标代理上最多可配置 15 个 SSL 证书。

这些证书可以由您自行管理或者由 Google 管理

如果您要使用自行管理的 SSL 证书,并且没有私钥和经过签名的证书,则可以创建并使用自签名证书进行测试。如需了解详情,请参阅创建私钥和证书。请勿在生产环境中使用自签名证书。如果您要使用多个 SSL 证书,则必须为每个证书创建一个 SSL 证书资源。

转发规则

创建转发规则,将特定 IP 地址和端口转发到目标 SSL 代理。当客户流量到达您的外部 IP 地址时,此转发规则会告知网络将该流量发送到您的 SSL 代理。

如需了解详情,请参阅转发规则

建议

  • 如果您需要保留客户端连接信息,则应将负载平衡器配置为在开头添加 PROXY 协议版本 1 标头。
  • 对于 HTTPS 流量,应使用 HTTPS 负载平衡,而不是 SSL 代理负载平衡。

监控

如需了解如何监控 SSL 代理负载平衡,请参阅 TCP/SSL 代理监控

问题排查

页面无法从负载平衡器 IP 加载

验证实例的运行状况

验证实例运行状况是否良好。

gcloud compute backend-services get-health my-ssl-lb
---
backend: https://www.googleapis.com/resourceviews/v1/projects/[PROJECT_ID]/zones/us-central1-b/resourceViews/us-ig1
status:
  kind: compute#backendServiceGroupHealth
---
backend: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2
status:
  kind: compute#backendServiceGroupHealth

确认您的防火墙规则是否正确

  • 运行状况检查程序和负载平衡器都需要以下 IP 地址才能允许流量通过防火墙:130.211.0.0/2235.191.0.0/16
  • 如果您在负载平衡器和实例之间使用的是 SSL,请使用 SSL 运行状况检查。确保防火墙规则允许来自来源 IP 地址范围 130.211.0.0/2235.191.0.0/16tcp:443
  • 如果您在负载平衡器和实例之间使用的是 TCP,请使用 TCP 运行状况检查。确保防火墙规则允许来自来源 IP 范围 130.211.0.0/2235.191.0.0/16tcp:80
  • 如果您使用的是实例标记,请确保标记列在防火墙规则的 TARGET_TAGS 下,并确保您的所有实例都具有该标记。在此示例中,实例具有 ssl-lb 标记。
gcloud compute firewall-rules list
NAME                      NETWORK SRC_RANGES                  RULES                        SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health  default 130.211.0.0/22,35.191.0.0/16 tcp:443                      ssl-lb

尝试访问单个实例

临时设置一条允许您逐个访问实例的防火墙规则,然后尝试从特定实例加载页面。

  1. 打开防火墙,以允许来自任何来源的流量发送到已标记的实例。为此,请创建一个来源过滤条件,以便对于流向具有 ssl-lb 标记的实例的 HTTPS 流量,将其来源 IP 范围设为 0.0.0.0/0

    gcloud compute firewall-rules create allow-ssl-0-0-0-0 \
        --source-ranges 0.0.0.0/0 \
        --target-tags ssl-lb \
        --allow tcp:443
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].
    NAME              NETWORK SRC_RANGES RULES   SRC_TAGS TARGET_TAGS
    allow-ssl-0-0-0-0 default 0.0.0.0/0  tcp:443          ssl-lb
  2. 查询其中一个实例的 EXTERNAL_IP 地址。

    gcloud compute instances list
    
    NAME             ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b  n1-standard-1             10.240.0.8  EXTERNAL_IP RUNNING
    ig-us-central1-2 us-central1-b  n1-standard-1             10.240.0.11 EXTERNAL_IP RUNNING
    ig-us-east1-1    us-east1-b     n1-standard-1             10.240.0.12 EXTERNAL_IP RUNNING
    ig-us-east1-2    us-east1-b     n1-standard-1             10.240.0.13 EXTERNAL_IP RUNNING
  3. 直接从浏览器访问您的一个或多个实例。

    https://[EXTERNAL_IP]
    
  4. 如果无法通过此方法访问您的实例,请确保软件运行正常。如果软件运行正常,请确保负载平衡器防火墙规则正确无误。

    gcloud compute firewall-rules describe allow-ssl-lb-and-health
    
    allowed:
      IPProtocol: tcp
      ports:
      '443'
    creationTimestamp: '2016-02-20T22:27:15.094-08:00'
    description: ''
    id: '5304629236729177644'
    kind: compute#firewall
    name: allow-130-211-0-0-22-ssl
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
    selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health
    sourceRanges:
      130.211.0.0/22,35.191.0.0/16
    targetTags:
      ssl-lb
  5. 确保实例运行正常后,请移除“从任何位置”防火墙规则。

    gcloud compute firewall-rules delete allow-ssl-0-0-0-0
    
    The following firewalls will be deleted:
       [allow-ssl-0-0-0-0]
    Do you want to continue (Y/n)?  y
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].
    

后续步骤