使用Nginx Ingress控制器配置端到端SSL



我正在运行一个本地部署,并试图将HTTPS流量重定向到我的后端pod。我不希望SSL在Ingress级别终止,这就是为什么我没有使用任何tls机密。

我正在容器中创建一个自签名证书,Tomcat通过拾取该证书并在8443上公开来启动。

这是我的入口规格

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-name
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
#nginx.ingress.kubernetes.io/service-upstream: "false"
kubernetes.io/ingress.class: {{ .Values.global.ingressClass }}
nginx.ingress.kubernetes.io/affinity: "cookie"
spec:
rules:
- http:
paths:
- path: /myserver
backend:
serviceName: myserver
servicePort: 8443

我以不同的组合使用了上面的注释,但我仍然无法到达我的pod。

我的服务路线

# service information for myserver
service:
type: ClusterIP
port: 8443
targetPort: 8443
protocol: TCP

我确实看到了一些关于这个建议注释的答案,但这似乎对我不起作用。提前谢谢!

edit:唯一远程工作的是当我将入口值重写为时

nginx-ingress:
controller:
publishService:
enabled: true
service:
type: NodePort
nodePorts:
https: "40000"

这确实启用了https,但它会从容器中获取kubernetes的假证书,而不是我的证书

编辑2:由于某种原因,ssl传递不起作用。我把它当作强制执行

nginx-ingress:
controller:
extraArgs:
enable-ssl-passthrough: ""

当我描述部署时,我可以在参数中看到它,但当我使用kubectl ingress-nginx backends进行检查时,如中所述https://kubernetes.github.io/ingress-nginx/kubectl-plugin/#backends,上面写着";sslPassThrough:false";

SSL Passthrough要求在启动时将特定的标志传递给nginx控制器,因为它在默认情况下是禁用的。

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

由于ssl-passthrough在OSI模型的第4层上工作,而不是在第7层(HTTP(上工作,因此使用它将使您在ingress对象上设置的所有其他注释无效。

因此,在您的部署级别,您必须在args:下指定此标志

containers:
- name: controller
image: us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.34.1@sha256:0e072dddd1f7f8fc8909a2ca6f65e76c5f0d2fcfb8be47935ae3457e8bbceb20
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --enable-ssl-passthrough

如果要使用ssl传递,需要设置以下几项。

  1. 首先是设置正确的主机名:

    spec:
    rules:
    - host: example.com    <- HERE
    http:
    ...
    

    文档中提到:

    SSL Passthrough利用SNI〔服务器名称指示〕并从TLS协商,需要兼容的客户端。连接后已被TLS侦听器接受,则由控制器处理自身,并在后端和客户端之间来回传输。

    如果没有与请求的主机名匹配的主机名,则请求在配置的直通代理端口上移交给NGINX(默认值:442(,它将请求代理到默认后端。


  • 第二件事是设置--enable-ssl-passthrough标志,正如@thomas在另一个答案中提到的那样。

    只需编辑nginxingress部署并将此行添加到args列表:

    - --enable-ssl-passthrough
    

  • 必须做的第三件事是在入口对象定义中使用以下注释:

    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    
  • 重要信息:在文档中,您可以阅读:

    注意

    因为SSL Passthrough在OSI模型(TCP(的第4层上工作,并且不在第7层(HTTP(上,使用SSL Passthrough将使所有Ingress对象上设置的其他注释。

    这意味着从现在起,所有其他注释都将毫无用处。这适用于force-ssl-redirectaffinity等注释,也适用于您定义的路径(例如path: /myserver(。由于流量是端到端加密的,所以ingress看到的都是一些胡言乱语,它所能做的就是根据dns名称(SNI(将这些数据传递给应用程序。

    看起来这是一个悬而未决的问题https://github.com/kubernetes/ingress-nginx/issues/5686

    因此,我不得不恢复使用我的证书作为默认证书,并将其安装为tls-sercets。

    最新更新