Kubernetes 入口 nginx 重定向到 https

Kubernetes ingress nginx redirect to https

为了在启用 tls 的主机上将任何 HTTP 流量重定向到 HTTPS,我已将以下注释添加到我的入口资源

nignx.ingress.kubernetes.io/force-ssl-redirect: true

有了这个,当我 curl 有问题的主机时,我得到了预期的重定向

但是当我使用浏览器时,HTTP 请求超时。

现在,我不确定是不是我在 Nginx ingress conf 做错了什么,因为 curl 有效? 请问有什么指点吗?谢谢!

完整注释:

   annotations:
    kubernetes.io/ingress.class: nginx-ingress
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 100m
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
    nginx.ingress.kubernetes.io/ssl-passthrough: "false"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

规则

 rules:
  - host: hostX
    http:
      paths:
      - backend:
          serviceName: svcX
          servicePort: 8080
        path: /
  - host: hostY
    http:
      paths:
      - backend:
          serviceName: svcX
          servicePort: 8080
        path: /
  tls:
  - hosts:
    - hostX
  - hosts:
    - hostY
    secretName: hostY-secret-tls

注:

  1. 上面规则中提到的curl就是hostY。
  2. 通过浏览器到 hostY 的 HTTPS 有效,因此证书是有效的。

正如@mdaniel 所提到的,您的代码片段显示 nignx.ingress.kubernetes.io/force-ssl-redirect: true 但注释应该是字符串。请注意,在您的“完整”配置中,您同时拥有 force-ssl-redirect: "true" (现在正确地是一个字符串)ssl-redirect: "false" .

只需删除注释 nginx.ingress.kubernetes.io/ssl-redirect: "false" 并仅保留 nignx.ingress.kubernetes.io/force-ssl-redirect: "true" 同时启用 --enable-ssl-passthrough。这是在 Ingress 对象中启用直通后端所必需的。

您的注释应如下所示:

kubernetes.io/ingress.class: nginx-ingress
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 100m
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"

如果您在 TLS 部分下定义了主机,则只能使用 https 访问它们。正在重定向 HTTP 请求以使用 HTTPS。这就是您无法通过 HTTP 访问主机的原因。您还必须为主机 hostX 指定机密,否则默认证书将用于入口。或者,如果您不想通过 HTTPS 连接到主机 hostX,只需为其创建不带 TLS 部分的不同入口。

看看:.