填坑记:ACK (K8s) + SLB 全链路 HTTPS 部署实战与跨地域证书同步指南

🔒 填坑记: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 控制台同步证书 (关键操作)

我们不需要下载证书文件再上传,阿里云提供了更丝滑的同步方式:

  1. 登录阿里云控制台,进入 传统型负载均衡 CLB
  2. 切换地域:务必切换到 ACK 集群所在的地域(例如 西南1-成都)。
  3. 点击左侧菜单 “证书管理” -> “创建证书”
  4. 选择证书来源
    • 🔘 阿里云签发证书 (推荐!✨)
    • (这里会自动列出你在 SSL 中心申请的所有证书)
  5. 选择证书:在下拉框中选中绑定了 api.mdt.center 的那张证书。
  6. 点击 “创建”

🎉 此时,你会在列表中得到一个新的证书 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

  1. 地址栏出现 安全锁 🔒
  2. Network 请求全部走 HTTPS
  3. Mixed Content 报错消失,登录、验证码功能完美运行!

💡 经验总结

  1. SSL 是全链路的:前端 HTTPS,后端也必须 HTTPS,否则浏览器不答应。
  2. 注意地域隔离:阿里云的云产品(ACK/SLB/OSS)对地域非常敏感。杭州的证书 ID 不能直接在成都用,必须先在成都 CLB 控制台“创建/同步”一次
  3. YAML 注解大法:在 K8s 里控制阿里云 SLB,Annotation 是核心。配对了 ID,一切自动化;配错了 ID,排查一下午。

希望这篇避坑指南能帮到同样在做云原生部署的你! Happy Coding! 💻☕️

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值