在 Kubernetes 集群中,要实现 Ingress Nginx 控制器将 HTTP 请求自动重定向到 HTTPS,最标准的方法是在 Ingress 资源的 metadata.annotations 中配置 ssl-redirect 注解,并确保 spec.tls 绑定了有效的证书 Secret。
核心结论:通过注解 nginx.ingress.kubernetes.io/ssl-redirect: "true" 开启重定向,粒度最细,适合按域名独立管理。
- 适用场景:单个或少数几个 Ingress 需要强制 HTTPS,不影响全局配置。
- 前置条件:必须先在相同命名空间创建好 TLS 类型的 Secret,否则 443 端口无法握手。
- 验收标准:curl 测试 HTTP 请求返回 308 状态码,且 Location 头指向 HTTPS。
1. 前置准备:创建 TLS Secret
在配置 Ingress 之前,必须确保证书文件(.crt 和 .key)已就绪,并在集群中创建 Secret。假设证书文件在当前目录:
kubectl create secret tls my-tls-secret \`--cert`=path/to/tls.crt \`--key`=path/to/tls.key \-n <your-namespace>创建完成后,使用以下命令确认 Secret 状态:
kubectl get secret my-tls-secret -n <your-namespace>2. 完整 Ingress YAML 配置模板
以下是一个包含 HTTPS 重定向配置的完整 Ingress 示例。注意 annotations 的缩进层级必须与 name 同级,且 spec.tls 中 secretName 需与上述创建的 Secret 一致。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-ingressnamespace: <your-namespace>annotations:# 开启 HTTPS 强制重定向nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:ingressClassName: nginxtls:- hosts:- example.comsecretName: my-tls-secretrules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80配置关键点说明:
- annotations:必须包含 nginx.ingress.kubernetes.io/ssl-redirect: "true"。
- spec.tls:必须配置,否则控制器不会监听 443 端口,重定向后用户无法访问。
- secretName:必须与第一步创建的 Secret 名称完全一致。
3. 应用配置与验证
保存上述 YAML 为 ingress.yaml,执行应用命令:
kubectl apply -f ingress.yaml检查 Ingress 状态是否为 READY:
kubectl get ingress my-ingress -n <your-namespace>验证重定向:在能解析域名的客户端执行 curl 命令,观察 HTTP 请求是否被重定向:
curl -I http://example.com预期结果:返回状态码应为 308 Permanent Redirect 或 301 Moved Permanently,且 Location 头以 https:// 开头。
4. 常见故障与排查
- 重定向后无法访问(握手失败):检查 spec.tls 是否配置,以及 secretName 对应的 Secret 是否存在且包含有效的 cert 和 key。
- 注解不生效:检查 Ingress Nginx 控制器的 ConfigMap 是否全局关闭了 ssl-redirect(use-ssl-redirect: "false"),全局配置优先级可能高于注解。
- 重定向循环:如果后端服务本身也强制跳转 HTTPS,而 Ingress 透传了 HTTP 请求给后端,可能导致循环。确保后端服务能处理 HTTP 请求或 Ingress 配置正确。
- 日志排查:查看控制器日志确认配置加载情况:
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx。
原文链接:https://www.zjcp.cc/ask/11726.html
