如何解决不要在 Kubernetes 的入口级别终止 SSL
我有一个 Java 应用程序在 tomcat 服务器(位于 pod 内)中运行,该应用程序配置为使用 https。 我正在使用 Nginx 入口。问题是,Nginx 入口正在终止 SSL 并仅将普通 http 转发到 tomcat 服务器(实际上是到 pod)。由于 tomcat 服务器配置为仅使用 HTTPS,因此不接受流量。
以下不起作用:
Nginx.ingress.kubernetes.io/ssl-passthrough: "true"
解决方法
我终于找到了答案:
我必须添加以下两行:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
所以入口是这样的(我还添加了一些评论来描述并展示我尝试过但没有奏效的选项,以免浪费时间):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-resource-staging
namespace: staging-space
annotations:
kubernetes.io/ingress.class: nginx #You may deploy any number of ingress controllers within a cluster. When you create an ingress,you should annotate each ingress with the appropriate ingress.class to indicate which ingress controller should be used if more than one exists within your cluster.
#If you do not define a class,your cloud provider may use a default ingress controller.
#nginx.ingress.kubernetes.io/ssl-passthrough: "true"
##Following 2 lines are important,otherwise the SSL is terminated at the ingress level and the
## traffic sent to the service is plain http and then tomcat complains that the host and port combination
## needs https connection (in the tomcat server we have enabled the HTTPS internally)
## We want to forward the HTTPS traffic to the pods
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
#tls:
# - hosts:
# - yourhost.com
rules:
- host: yourhost.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: my-app-service
port:
#number: 8080
number: 8443
,
默认情况下禁用 SSL Passthrough,需要使用 --enable-ssl-passthrough 标志启动控制器。
因此,如果您想使用注解 nginx.ingress.kubernetes.io/ssl-passthrough,您需要使用 --enable-ssl-passthrough 标志启动 Nginx Ingress Controller
此外,由于 SSL Passthrough 在 OSI 模型 (TCP) 的第 4 层而不是第 7 层 (HTTP) 上工作,因此使用 SSL Passthrough 会使 Ingress 对象上设置的所有其他注释无效。
编辑:
如果您使用入口注释 nginx.ingress.kubernetes.io/ssl-passthrough 和 --enable-ssl-passthrough=true 标志作为入口控制器,那么 SSL 终止发生在您的 Tomcat 服务器 Pod。因此,您的客户端浏览器收到的 SSL 服务器证书就是您的 Tomcat SSL 服务器证书。在这种情况下,您的客户端浏览器必须信任 Tomcat SSL 服务器证书。此 SSL 直通发生在第 4 层 TCP,因此 NGINX 入口控制器不会解密来自客户端浏览器的 SSL 流量,它只是将其传递到 Tomcat 服务器 Pod。
如果您只是使用注解 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS",那么第一个 SSL 终止将在您的入口控制器上发生。因此,您的客户端浏览器收到的 SSL 服务器证书是您的 Nginx 入口控制器 SSL 服务器证书,您的客户端浏览器必须信任它。然后从 Nginx Ingress Controller 到 Tomcat Pod 的通信使用另一个 SSL 加密。在这种情况下,您的 Nginx 入口控制器必须信任 Tomcat SSL 服务器证书,并且您拥有双重 SSL 加密和解密。
如果您使用注解 nginx.ingress.kubernetes.io/force-ssl-redirect: "true" 那么您的所有 http 请求都将使用 308 重定向 http 代码重定向到 https。你是在调用 http:// 还是 https:// ?
以下是代码和文档链接
https://github.com/kubernetes/ingress-nginx/blob/master/rootfs/etc/nginx/lua/lua_ingress.lua
https://github.com/openresty/lua-nginx-module
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
当您在入口资源中进行更改时,检查 /etc/nginx/nginx.conf 在 nginx 控制器 pod 中的变化情况
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。