如何使用 gcloud 命令为 GCP 负载均衡器设置免费 SSL 证书

大家好,
我是Mandai,Wild团队负责开发工作的成员。
正如标题所示,今天我想试用一下最近新增的完全托管且免费的SSL证书,该证书现在可以应用于负载均衡器。
如今SSL已成为必需品,而且SSL证书的成本也不容忽视,我认为这对很多人来说都是个好消息。
GCP何时开始为负载均衡器提供免费SSL证书?
您知道现在可以将免费的 SSL 证书应用于 GCP 的 ELB 吗?
这项功能于 2018 年 10 月推出,我很惭愧地承认,我自己竟然没有注意到。
AWS Certificate Manager 功能于 2016 年 1 月添加到 AWS 中,至今已有相当长一段时间,因此时间上存在很大的差异,但我个人很喜欢它,因为它功能简单,符合全球标准。
GCP的免费SSL证书包含哪些内容?
您可以通过查看 GCP 控制台轻松看到 GCP 的 SSL 证书是通过 Let's Encrypt 颁发的。
使用 Let's Encrypt 时,证书续期周期很短,只有三个月,因此标准做法是在服务器上嵌入续期脚本并定期运行。
事情本来就是这样,但当涉及到公有云上的负载均衡器时,情况就变得复杂起来。
GCP 在负载均衡器端提供了与此更新过程相关的所有功能,从而提供了一个可以轻松舒适地使用 SSL 的环境。
此外,为了颁发证书,应用 SSL 证书的域名的 DNS 必须指向负载均衡器上配置的 IP 地址,该负载均衡器正是 SSL 证书的部署位置。
由于此限制,即使网站可以公开访问,SSL 在应用证书后的一小段时间内也无法正常工作。
使用 gcloud 命令进行设置
可以使用 gcloud 命令在负载均衡器上放置 SSL 证书。
首先,我们来更新一下 gcloud 命令本身。
根据我的研究,220.0.0 及更高版本应该就可以了,但为了安全起见,我们还是更新到最新版本吧。
gcloud 组件更新
gcloud 命令经常更新,所以我认为应该会有一些更新。
更新完成后,我们来尝试使用命令行创建 SSL 证书。
这次,我们将 SSL 证书命名为 test-example-ssl,并为域名 test.example.com 创建该证书。
gcloud beta compute ssl-certificates create test-example-ssl \ --domains test.example.com 已创建 [https://www.googleapis.com/compute/beta/projects/hogehoge-xxxxxx/global/sslCertificates/test-example-ssl]。 NAME TYPE CREATION_TIMESTAMP EXPIRE_TIME MANAGED_STATUS test-example-ssl MANAGED 2019-04-01T03:12:53.962-07:00 PROVISIONING test.example.com: PROVISIONING
要查看当前情况,请使用“gcloud beta compute ssl-certificates list”命令。
gcloud beta compute ssl-certificates list NAME TYPE CREATION_TIMESTAMP EXPIRE_TIME MANAGED_STATUS www-example-ssl MANAGED 2019-03-01T23:33:53.360-08:00 2019-05-30T23:41:52.000-07:00 ACTIVE www.example.com: ACTIVE test-example-ssl MANAGED 2019-04-01T03:12:53.962-07:00 PROVISIONING test.example.com: PROVISIONING
www-example-ssl 已创建一段时间并已启用。
至于 test-example-ssl,它显示为已配置,但如果不进行任何配置,最终会导致错误。这
是因为 test.example.com 的 A 记录中写入的 IP 地址并未指向即将创建的负载均衡器。
配置完成后,MANAGED_STATUS 将变为 ACTIVE。
将 SSL 证书应用于负载均衡器
现在,我们将把已配置的 SSL 证书应用到负载均衡器上,但由于我们还没有负载均衡器,所以我们先来创建一个。
步骤不少,但我们不要放弃!
创建实例组
我们将创建一个实例组。
在这里,我们将创建一个容器来容纳这些实例。
gcloud compute instance-groups unmanaged create example-instance-group \ --zone=us-east1-b 已创建 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/zones/us-east1-b/instanceGroups/example-instance-group]。名称 位置 范围 网络 托管实例 example-instance-group us-east1-b zone 0
,可以轻松使用自动伸缩和实例模板等功能托管实例组不具备这些功能非托管实例组,有两种类型
这次我们不需要这样的功能,所以我们会把它创建为一个非托管实例组。
查看所有已创建实例组的命令如下:
gcloud compute instance-groups list NAME LOCATION SCOPE NETWORK MAGENED INSTANCES default-group asia-northeast1-b zone default No 1 example-instance-group us-east1-b zone default No 1
将实例添加到实例组
现在我们将向已创建的实例组中添加实例。
这次,我们将在 us-east1 区域的 B 区创建实例,example-web01 实例就位于该区域。
gcloud compute instance-groups unmanaged add-instances example-instance-group \ --instances example-web01 \ --zone us-east1-b 已更新 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/zones/us-east1-b/instanceGroups/example-instance-group]。.
要查看哪些实例已添加到实例组,请使用以下命令:
gcloud compute instance-groups describe example-instance-group --zone [region-zone] creationTimestamp: '2019-04-05T00:13:10.372-07:00' description: '' fingerprint: hogehoge id: 'xxxxxxxxxxxxxxxx' kind: compute#instanceGroup name: example-instance-group namedPorts: - name: http port: 80 network: https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/networks/default selfLink: https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/zones/us-east1-b/instanceGroups/example-instance-group size: 1 subnetwork: https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/regions/us-east1/subnetworks/default zone: https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/zones/us-east1-b
为实例组配置端口映射
配置实例组的监听端口。
这里,我们将打开 HTTP 端口 80。
gcloud compute instance-groups unmanaged set-named-ports example-instance-group \ --named-ports http:80 \ --zone us-east1-b 已更新 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/zones/us-east1-b/instanceGroups/example-instance-group]。.
你可以设置多个 --named-ports 选项,用逗号分隔即可。
创建健康检查
健康检查是一种监控功能,用于检查指定 URL 的可用性。
此功能与稍后配置的后端服务相关联,如果返回 200 状态码,则表示该服务运行正常。
在这里,我们将为端口 80 创建健康检查。
gcloud compute health-checks create http example-check \ --port 80 已创建 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/healthChecks/http-basic-check]。 名称 协议 example-check HTTP
关于健康检查,即使负载均衡器像本例中一样具有 SSL 证书,健康检查通信也是从负载均衡器到实例,因此 HTTP 健康检查应该足够了。
创建后端服务
后端服务负责将多个实例组组合在一起。
实例组也用于对实例进行分组,但后端服务才是根据 URL 映射中的 URL 模式更改重定向目标的执行单元,这一点稍后会讨论。
健康检查指定后端服务中的实例组监听的端口的健康检查。
gcloud compute backend-services create example-backend \ --protocol HTTP \ --health-checks example-check \ --global 已创建 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/backendServices/example-backend]。名称:后端;协议:example-backend;HTTPS
将实例组与后端服务关联
现在,我们将向之前创建的后端服务添加一个实例组。
后端服务可以注册为实例组,实例组是其最小单元。
gcloud compute backend-services add-backend example-backend \ --balancing-mode UTILIZATION \ --max-utilization 0.8 \ --capacity-scaler 1 \ --instance-group example-instance-group \ --instance-group-zone us-east1-b \ --global Updated [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/backendServices/example-backend].
为了在后端服务内的实例组之间实现负载均衡,GCP 提供了两种负载均衡模式:
利用
此模式根据 CPU 使用率分配负载。如果您希望高效利用机器资源,建议使用此模式。
此外,当 CPU 使用率超过 `--max-utilization` 值时,将触发自动扩缩容;例如,值为 0.8 表示当 CPU 使用率超过 80% 时将进行自动扩缩容。
速度
此模式以每秒请求数 (RPS) 作为负载均衡的基础。如果您希望稳定服务响应,建议使用此模式
。当请求数超过 `--target-load-balancing-utilization` 指定的百分比时,将触发自动扩缩容。
在这两种模式下,您都可以使用 --max-num-replicas 选项指定自动扩展将启动的最大实例数。
创建 URL 映射
GCP 有两种负载均衡机制:基于 TCP 的负载均衡和基于内容的负载均衡。
GCP 文档还提到了跨区域负载均衡的,但其配置被描述为基于内容的负载均衡的高级版本(我将省略细节)。
在基于内容的情况下,此 URL 映射将显示为 GCP 控制台负载均衡页面上的负载均衡器。
顾名思义,URL映射功能可以根据URL模式将请求路由到多个后端服务。
此功能允许您通过细化整个Web服务的功能粒度来实现微服务架构。
gcloud compute url-maps create example-url-map \ --default-service example-backend 已创建 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/urlMaps/example-url-map]. NAME DEFAULT_SERVICE example-url-map backendServices/example-backend
在这种情况下,URL映射只有一个后端服务,因此没有路由描述。
要在URL映射中进行路由,需要创建一个路径匹配器(即与路径对应的路由方法),然后创建一个对象并将其添加到URL映射中。
路径匹配器超出了本文的讨论范围,因此我们在此不做赘述。
如果您感兴趣,官方文档请参阅
创建目标代理
目标代理负责将 URL 映射与 SSL 证书关联起来。
gcloud compute target-https-proxies create example-https-proxy \ --url-map example-url-map \ --ssl-certificates test-example-ssl 已创建 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/targetHttpsProxies/example-https-proxy]。名称 SSL 证书 URL 映射 example-https-proxy test-example-ssl example-url-map
创建IP地址
接下来,创建一个用于负载均衡器的 IP 地址。
gcloud compute addresses create example-ip --ip-version=IPV4 --global 创建了 [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/addresses/example-ip]。.
要查找您当前使用的 IP 地址,请使用以下命令:
gcloud 计算地址列表 名称 地址/范围 类型 用途 网络 区域 子网 状态 default-web01 xxx.xxx.xxx.xxx asia-northeast1 使用中 example-ip xxx.xxx.xxx.xxx 保留
添加前端服务
最后,创建一个前端服务,将外部世界与 URL 映射连接起来。
gcloud compute forwarding-rules create example-frontend \ --address xxx.xxx.xxx.xxx \ --global \ --target-https-proxy example-https-proxy \ --ports 443 Created [https://www.googleapis.com/compute/v1/projects/hogehoge-xxxxxx/global/forwardingRules/example-frontend].
前端服务关联全局 IP、端口和目标代理。
您已成功将免费 SSL 证书应用到负载均衡器。
概括
我原本想写一篇关于如何给负载均衡器应用 SSL 证书的文章,但遗憾的是,最后文章主要讲的是如何创建负载均衡器。换句话说,我认为给一个已经创建的负载均衡器应用 SSL 证书非常容易。
设置负载均衡器的步骤出乎意料地多,一开始可能很难知道创建它们的顺序,所以让我们再次整理一下顺序。
- 创建实例组
- 向实例组添加端口
- 创建健康检查
- 创建后端服务
- 将实例组添加到后端服务
- 创建 URL 映射
- 创建目标代理
- 创建 IP 地址
- 创建前端服务
我们会添加一个创建 SSL 证书的步骤,但似乎在创建目标代理之前执行此操作也可以。
此外,SSL 证书创建后并不能立即使用;配置需要一些时间,因此最好预留充足的时间。
就这样。
1
