🔒 填坑记:ACK (K8s) + SLB 全链路 HTTPS 部署实战与跨地域证书同步指南
通过Annotation配置传统型负载均衡CLB(https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/add-annotations-to-the-yaml-file-of-a-service-to-configure-clb-instances?spm=5176.28197681.console-base_help.dexternal.596c7182srTVxo)
在云原生架构中,“前端 OSS 静态托管 + 后端 ACK 微服务” 是黄金组合。但当我们要给这个组合穿上 SSL (HTTPS) 的防弹衣时,却踩中了一个极其隐蔽的坑——阿里云证书的“地域隔离”。
今天复盘这次实战经历,教你如何优雅解决 Mixed Content 报错 以及 ACK 找不到证书 ID 的问题。🚀
🛑 第一关:浏览器的红牌警告 (Mixed Content)
💥 案发现场
我们将前端部署到 OSS 并配置了 HTTPS (https://mdt.center),但后端网关依然是 HTTP IP (http://47.108.xx.xx)。
当我们在 HTTPS 页面发起登录请求时,浏览器直接拦截并报错:
Mixed Content: The page at ‘https://…’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://…’. This request has been blocked. 🚫
🧐 原因解析
这是浏览器的安全底线:HTTPS 网页里绝对不允许调用不安全的 HTTP 接口。
解决方案: 必须把后端接口也升级为 HTTPS (https://api.mdt.center)。
🚧 第二关:ACK 的迷惑报错 (CertificateId not found)
💥 案发现场
我在阿里云“数字证书管理服务”申请了免费证书,拿到了 ID 1512xxx。
然后我在 ACK 的 Service YAML 里配置:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "1512xxx"
结果 K8s 事件疯狂报错:The specified ServerCertificateId does not exist (证书不存在)。🤯
🧐 原因解析 (核心知识点!)
- 证书中心:默认在 华东1(杭州)。
- 业务集群:我的 ACK 和 SLB 在 西南1(成都)。
- 隔离机制:成都的 SLB 无法直接读取 杭州证书中心的 ID。必须先把证书“同步”或者“搬运”到成都地域的 SLB 证书库中,生成一个本地 ID。
✅ 终极解决方案:三步通关法
1️⃣ 第一步:在 CLB 控制台同步证书 (关键操作)
我们不需要下载证书文件再上传,阿里云提供了更丝滑的同步方式:
- 登录阿里云控制台,进入 传统型负载均衡 CLB。
- 切换地域:务必切换到 ACK 集群所在的地域(例如 西南1-成都)。
- 点击左侧菜单 “证书管理” -> “创建证书”。
- 选择证书来源:
- 🔘 阿里云签发证书 (推荐!✨)
- (这里会自动列出你在 SSL 中心申请的所有证书)
- 选择证书:在下拉框中选中绑定了
api.mdt.center的那张证书。 - 点击 “创建”。
🎉 此时,你会在列表中得到一个新的证书 ID(通常很长)。这就是成都 SLB 能识别的“本地 ID”!
2️⃣ 第二步:配置 ACK Service YAML
拿到“真·证书ID”后,回到 ACK 控制台,修改网关服务 (hx-gateway-svc) 的 YAML。
完整配置如下:
apiVersion: v1
kind: Service
metadata:
name: hx-gateway-svc
namespace: default
annotations:
# 👇【关键】填入刚才在 CLB 证书管理里生成的“本地 ID”
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "19741603225..._19aab6f..."
# 👇 开启 HTTPS 443 监听
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
# 👇 强制 HTTP(80) 跳转 HTTPS(443)
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-forward-port: "80:443"
spec:
ports:
- name: https
port: 443 # 对外暴露 443
protocol: TCP
targetPort: 8000 # 容器内部端口
selector:
app: hx-gateway
type: LoadBalancer
点击更新,查看事件:EnsuredLoadBalancer —— 成功! ✅
3️⃣ 第三步:更新前端调用地址
最后,别忘了修改前端构建脚本,把 API 地址指向新的 HTTPS 域名。
# deploy-web.sh
# ❌ 旧地址
# BACKEND_API="http://47.108.xx.xx"
# ✅ 新地址 (HTTPS + 域名)
BACKEND_API="https://api.mdt.center"
重新打包上传前端。
🎉 最终效果
打开浏览器访问 https://mdt.center:
- 地址栏出现 安全锁 🔒。
- Network 请求全部走 HTTPS。
- Mixed Content 报错消失,登录、验证码功能完美运行!
💡 经验总结
- SSL 是全链路的:前端 HTTPS,后端也必须 HTTPS,否则浏览器不答应。
- 注意地域隔离:阿里云的云产品(ACK/SLB/OSS)对地域非常敏感。杭州的证书 ID 不能直接在成都用,必须先在成都 CLB 控制台“创建/同步”一次。
- YAML 注解大法:在 K8s 里控制阿里云 SLB,
Annotation是核心。配对了 ID,一切自动化;配错了 ID,排查一下午。
希望这篇避坑指南能帮到同样在做云原生部署的你! Happy Coding! 💻☕️


155

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



