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
注:
- 上面规则中提到的curl就是hostY。
- 通过浏览器到 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 部分的不同入口。
为了在启用 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
注:
- 上面规则中提到的curl就是hostY。
- 通过浏览器到 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 部分的不同入口。