K8s Ingress Nginx 控制器配置 HTTPS 自动重定向的 YAML 要怎么写?

文章导读
在 Kubernetes 集群中,要实现 Ingress Nginx 控制器将 HTTP 请求自动重定向到 HTTPS,最标准的方法是在 Ingress 资源的 metadata.annotations 中配置 ssl-redirect 注解,并确保 spec.tls 绑定了有效的证书 Secret。
📋 目录
  1. A 1. 前置准备:创建 TLS Secret
  2. B 2. 完整 Ingress YAML 配置模板
  3. C 3. 应用配置与验证
  4. D 4. 常见故障与排查
A A

在 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 状态:

K8s Ingress Nginx 控制器配置 HTTPS 自动重定向的 YAML 要怎么写?
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-ingress
  namespace: <your-namespace>
  annotations:
    # 开启 HTTPS 强制重定向
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - example.com
    secretName: my-tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

配置关键点说明:

  • annotations:必须包含 nginx.ingress.kubernetes.io/ssl-redirect: "true"。
  • spec.tls:必须配置,否则控制器不会监听 443 端口,重定向后用户无法访问。
  • secretName:必须与第一步创建的 Secret 名称完全一致。

3. 应用配置与验证

保存上述 YAML 为 ingress.yaml,执行应用命令:

K8s Ingress Nginx 控制器配置 HTTPS 自动重定向的 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