Go应用部署前必须确认的三个TLS前提是:ingress-controller已安装并运行、Service类型为NodePort或LoadBalancer、域名已解析至Ingress控制器所在节点。

Go应用部署前必须确认的三个TLS前提
直接上手配 TLS 却发现 Ingress 不生效?大概率是卡在这三件事上:ingress-controller 没装、Service 类型不是 NodePort 或 LoadBalancer、域名没解析到 Ingress 控制器所在节点。Kubernetes 本身不处理 TLS 终止,全靠 ingress-controller(比如 nginx-ingress-controller 或 traefik)读取 Secret 并加载证书。
- 先用
kubectl get pods -n ingress-nginx(或对应命名空间)确认控制器 Pod 处于Running状态 -
Service类型必须能让外部流量抵达控制器——ClusterIP不行,它只在集群内通 - 自签名证书测试时,浏览器会报错;Let’s Encrypt 要求域名可公网解析且能响应 HTTP-01 挑战
创建 TLS Secret 的两种可靠方式
证书必须以 kubernetes.io/tls 类型存进 Secret,字段名固定为 tls.crt 和 tls.key,不能写成 certificate 或 privateKey —— 否则 Ingress 无法识别。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 命令行方式最稳:
kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key -n your-namespace,自动 base64 编码,不易出错 - 手动写 YAML 时,务必确认 base64 输出不含换行:
cat tls.crt | base64 -w 0(Linux/macOS),Windows 用户用base64 -i tls.crt -o encoded.crt后手动删空行 - 如果证书链包含中间 CA,必须把 leaf + intermediate 拼成一个
tls.crt文件,顺序是 leaf 在前、root 在最后;否则客户端可能校验失败
Ingress 中启用 TLS 的关键字段和陷阱
不是加了 tls 块就自动 HTTPS,Host 匹配、路径规则、注解协同缺一不可。
-
spec.tls.hosts必须和spec.rules.host完全一致,大小写敏感,通配符(如*.example.com)需对应 wildcard 证书 - 强制跳转 HTTPS 需加注解:
nginx.ingress.kubernetes.io/ssl-redirect: "true";Traefik 则用traefik.ingress.kubernetes.io/router.tls: "true" - 如果 Go 应用本身监听
8080但 Service 暴露的是80端口,Ingress 的backend.service.port.number必须填80,不是容器端口
Go服务代码里要不要处理 TLS?
绝大多数情况——不用。Ingress 层已做 TLS 终止,Go 应用收到的是明文 HTTP 请求。强行在 Go 里用 http.ListenAndServeTLS 反而会导致 502 或连接重置。
- 仅当需要端到端加密(e.g. mTLS、审计要求)才让 Go 自己持证,此时要挂载 Secret 到 Pod,并在代码中读取
/etc/tls/tls.crt和/etc/tls/tls.key - 注意:Ingress 终止后,原始协议信息丢失;如需感知 HTTPS,得依赖
X-Forwarded-Proto: https请求头(确保 Ingress controller 开启了该转发) - 本地开发调试时,可用
mkcert生成信任的本地证书,避免浏览器反复点“继续访问”

















