一、 核心目标
我们的目标是为域名 gateway.jpgcp.cloud 和 jpgcp.shop 启用安全的 HTTPS 访问,并使用由 Google 自动管理和续订的免费 SSL 证书。

二、 技术选型:Google 托管证书
我们采用的是 GKE Gateway 推荐的、最现代化的方法:使用 Google 托管证书。
优点
- 完全免费: 您无需为 SSL 证书本身支付任何费用。
- 全自动管理: Google 会自动处理证书的申请、颁发、安装和最重要的——自动续订。您再也无需担心证书过期问题。
- 高度可信: 证书由公共 CA(如 Google Trust Services 或 Let’s Encrypt)颁发,受所有现代浏览器信任。
限制
- 不支持通配符域名: 您不能为
*.jpgcp.cloud这样的通配符域名申请证书,必须明确列出所有域名(如gateway.jpgcp.cloud)。 - 域名数量限制: 每个证书资源最多支持 100 个域名。
- 域名长度限制: 每个域名长度不能超过 63 个字符。
对于我们的项目来说,这些限制完全不构成问题,因此使用 Google 托管证书是最佳选择。
三、 实现步骤详解
整个过程分为两步:创建证书和使用证书。
第一步:使用 gcloud 创建证书资源
我们没有在 k8s 目录中创建 YAML 文件,而是直接通过 gcloud 命令,向 Google Cloud 的计算引擎 API 申请了一个全球 SSL 证书。
执行的命令:
gcloud compute ssl-certificates create gke-gateway-ssl-cert \
--domains=gateway.jpgcp.cloud,jpgcp.shop \
--global
create gke-gateway-ssl-cert: 创建一个名为gke-gateway-ssl-cert的新证书。--domains: 明确指定这个证书要保护的所有域名。--global: 因为我们的 GKE Gateway 是全球性的,所以证书也必须是全球性的。
执行此命令后,Google Cloud 会开始在后台自动进行域名所有权验证并颁发证书。
第二步:修改 gateway.yaml 以使用证书
在证书创建请求发出后,我们更新了 k8s/gateway.yaml 文件,来告诉 Gateway 如何使用这个证书。
最终的 Gateway 资源配置 (k8s/gateway.yaml):
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: py-api-gateway
spec:
gatewayClassName: gke-l7-global-external-managed
listeners:
# ... http listener ...
- name: https
protocol: HTTPS
port: 443
allowedRoutes:
namespaces:
from: Same
tls:
mode: Terminate
options:
networking.gke.io/pre-shared-certs: gke-gateway-ssl-cert
第三步:深入理解 tls.mode: Terminate
您可能会问:“我们不是要启用 TLS 吗?为什么这里要‘终止’(Terminate)它?”
这是一个非常好的问题。mode: Terminate 是一种被称为 “TLS 终止” 的标准网络架构模式。它描述了加密流量如何被处理。
流量路径如下:
用户浏览器 <-- HTTPS (加密) --> GKE Gateway (负载均衡器) <-- HTTP (未加密) --> 您的应用 Pod (Nginx)
- 加密的外部连接:从用户的浏览器到 GKE Gateway 这一段,流量是完全加密的,保证了数据在公共互联网上传输的安全性。
- 在 Gateway 终止 TLS:
mode: Terminate的含义是,GKE Gateway 作为加密的终点。它会使用我们配置的 SSL 证书来解密收到的 HTTPS 流量。 - 未加密的内部连接:在解密之后,Gateway 会将请求变为普通的、未加密的 HTTP 流量,然后通过 Google 安全的内部网络,将其转发给后端的应用 Pod。
为什么这么做?
这种模式极大地简化了后端应用的复杂性。我们的 Nginx 应用容器本身不需要配置和管理任何 SSL 证书,也无需处理 HTTPS 的加解密开销。它只需要处理最简单的 HTTP 请求即可。所有关于 TLS 的复杂工作,都由 Google 托管的、高性能的 Gateway/负载均衡器来完成了。
所以,Terminate 终止的不是“安全”,而是“加密层”。它将加密层从应用本身剥离,并前置到了网络边缘的网关上,这是一种非常高效和常见的最佳实践。

1545

被折叠的 条评论
为什么被折叠?



