我正在运行一个本地部署,并试图将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传递,需要设置以下几项。
-
首先是设置正确的主机名:
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-redirect
、affinity
等注释,也适用于您定义的路径(例如path: /myserver
(。由于流量是端到端加密的,所以ingress看到的都是一些胡言乱语,它所能做的就是根据dns名称(SNI(将这些数据传递给应用程序。
看起来这是一个悬而未决的问题https://github.com/kubernetes/ingress-nginx/issues/5686
因此,我不得不恢复使用我的证书作为默认证书,并将其安装为tls-sercets。