不要在Kubernetes的入口级别终止SSL



我有一个Java应用程序在tomcat服务器(位于pod内(中运行,该服务器被配置为使用https。我正在使用nginx入口。问题是,nginx入口正在终止SSL,并且只将纯http转发到tomcat服务器(实际上是转发到pod(。由于tomcat服务器被配置为仅使用HTTPS,因此它不接受流量。

以下不起作用:

nginx.ingress.kubernetes.io/ssl-passthrough: "true"

我终于找到了答案:

我必须添加以下2行:

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

请参阅文档https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#ssl-通过

SSL Passthrough在默认情况下被禁用,并且需要使用--enable SSL Passthrough标志启动控制器。

因此,如果您想使用注释Nginx.Ingress.kubernetes.io/sl-passthrough ,则需要使用--enable ssl passthrough标志启动Nginx Ingress控制器

此外,由于SSL Passthrough在OSI模型(TCP(的第4层上工作,而不在第7层(HTTP(上工作,因此使用SSL Passthrough会使Ingress对象上设置的所有其他注释无效。

编辑:

如果您使用ingress annotation nginx.ingress.kubernetes.io/ssl-passthrough,并为ingress控制器使用--enable ssl passthrough=true标志,那么ssl终止将在Tomcat Server Pod上发生。因此,客户端浏览器收到的SSL服务器证书就是Tomcat SSL服务器证书。在这种情况下,您的客户端浏览器必须信任Tomcat SSL服务器证书。此SSL传递发生在第4层TCP,因此NGINX入口控制器不会解密客户端浏览器中的SSL流量,而只是将其传递到Tomcat Server Pod。

如果你只使用注释nginx.ingress.kubernetes.io/backendprotocol:"HTTPS";,那么第一个SSL终止发生在您的入口控制器上。因此,客户端浏览器收到的SSL服务器证书是您的Nginx Ingress Controller SSL服务器证书,您的客户端浏览器必须信任它。然后,从Nginx Ingress Controller到Tomcat Pod的通信使用另一种SSL加密。在这种情况下,您的Nginx入口控制器必须信任Tomcat SSL服务器证书,并且您有双重SSL加密和解密。

如果使用注释nginx.ingress.kubernetes.io/force-sl-redirect:"真";然后使用308重定向http代码将所有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

当您在入口资源中进行更改时,请检查nginx/conf在nginx控制器吊舱内的更改情况

相关内容

  • 没有找到相关文章

最新更新