如何在GKE上为FastAPI接口配置HTTPS
结论:优先在GKE侧配置HTTPS
不推荐在FastAPI/uvicorn内部处理SSL,原因如下:
- 证书管理成本高:应用层配置需要手动申请、更新证书,还要将证书文件挂载到所有Pod,维护繁琐;GKE提供的托管方案能自动完成证书的签发、续期。
- 资源利用率低:每个Pod都处理SSL握手会消耗额外CPU资源,统一在集群入口层处理更高效。
- 架构更规范:Kubernetes生态中,流量入口的TLS终止是标准实践,应用只需处理HTTP请求,职责更清晰。
GKE侧实现HTTPS的两种常用方案
方案1:GKE托管Ingress + Google Managed SSL证书
这是GKE原生的方案,无需额外安装组件:
创建托管SSL证书:
编写ManagedCertificateYAML文件,指定你的域名,Google会自动通过Let's Encrypt申请证书并自动续期:apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: fastapi-managed-cert spec: domains: - your-domain.example.com执行命令创建:
kubectl apply -f managed-cert.yaml配置Ingress关联服务与证书:
编写Ingress YAML,关联你的FastAPI Service和上面创建的托管证书:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: fastapi-ingress annotations: networking.gke.io/managed-certificates: fastapi-managed-cert kubernetes.io/ingress.class: "gce" spec: rules: - host: your-domain.example.com http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: your-fastapi-service port: number: 80执行命令创建:
kubectl apply -f ingress.yaml配置DNS解析:
获取Ingress分配的外部IP(kubectl get ingress fastapi-ingress),将你的域名A记录指向该IP。
方案2:NGINX Ingress Controller + Cert-Manager
如果需要更灵活的Ingress配置(比如路径重写、自定义规则),可以用这套组合:
安装NGINX Ingress Controller:
按照官方指引将NGINX Ingress Controller部署到GKE集群。安装Cert-Manager:
部署Cert-Manager到集群,用于自动管理Let's Encrypt证书。配置ClusterIssuer:
创建ClusterIssuer资源,对接Let's Encrypt:apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx执行命令创建:
kubectl apply -f cluster-issuer.yaml配置Ingress并启用TLS:
编写Ingress YAML,指定TLS配置并关联Cert-Manager的ClusterIssuer:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: fastapi-nginx-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - your-domain.example.com secretName: fastapi-tls-secret rules: - host: your-domain.example.com http: paths: - path: / pathType: Prefix backend: service: name: your-fastapi-service port: number: 80执行命令创建:
kubectl apply -f nginx-ingress.yaml
不推荐的方案:FastAPI/uvicorn内部配置SSL
如果非要在应用层处理,可通过uvicorn启动时指定证书:
uvicorn main:app --host 0.0.0.0 --port 443 --ssl-keyfile=./private-key.pem --ssl-certfile=./certificate.pem
但需要将证书文件挂载到Pod中,且需手动处理证书更新,仅适合测试场景,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者Regalia

