Docker 使用Nginx入口控制器配置端到端SSL
我正在运行本地部署,并尝试将HTTPS流量重定向到我的后端播客。 我不想在入口级别终止SSL,这就是为什么我没有使用任何tls机密 我在容器中创建了一个自签名证书,Tomcat通过拾取该证书并在8443上曝光来启动 这是我的入门说明书Docker 使用Nginx入口控制器配置端到端SSL,docker,kubernetes,kubernetes-ingress,nginx-ingress,Docker,Kubernetes,Kubernetes Ingress,Nginx Ingress,我正在运行本地部署,并尝试将HTTPS流量重定向到我的后端播客。 我不想在入口级别终止SSL,这就是为什么我没有使用任何tls机密 我在容器中创建了一个自签名证书,Tomcat通过拾取该证书并在8443上曝光来启动 这是我的入门说明书 apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-name annotations: kubernetes.io/ingress.class: &
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
我确实看到了一些关于这个问题的答案,但这似乎对我不起作用。提前谢谢
编辑:远程工作的唯一一件事是当我将入口值重写为
nginx-ingress:
controller:
publishService:
enabled: true
service:
type: NodePort
nodePorts:
https: "40000"
这确实启用了https,但它从容器中获取kubernetes的假证书,而不是我的证书
编辑2:
由于某些原因,ssl传递不起作用。我强制执行了它
nginx-ingress:
controller:
extraArgs:
enable-ssl-passthrough: ""
当我描述部署时,我可以在args中看到它,但当我检查中所述的
kubectl ingress nginx backends
时,它说“sslPassThrough:false”SSL Passthrough需要在启动时向nginx控制器传递一个特定的标志,因为默认情况下它是禁用的
默认情况下,SSL Passthrough被禁用,并且需要使用该标志启动控制器
由于ssl passthrough
在OSI模型的第4层上工作,而不是在第7层(HTTP)上工作,因此使用它将使您在入口对象上设置的所有其他注释无效
因此,在部署级别,您必须在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
看来这是个悬而未决的问题
因此,我不得不恢复使用我的证书作为默认证书,并将其装载为tls sercets。如果您想使用ssl passthrough,需要设置一些内容
spec:
rules:
- host: example.com <- HERE
http:
...
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
这意味着从现在起,所有其他注释都是无用的。这适用于诸如
force ssl redirect
、affinity
之类的注释,也适用于您定义的路径(例如path:/myserver
)。由于流量是端到端加密的,所以入口看到的都是胡言乱语,它所能做的就是根据dns名称(SNI)将此数据传递给应用程序。您是否尝试将服务公开为节点端口?是的,很抱歉,我错过了。修改了问题!我试过了,但出于某种原因,入口没有接收到它。一种检查方法是通过kubectl ingress nginx后端——部署我的ingress
,根据,尽管它显示在ingress deployment的args部分,“恢复使用我的证书作为默认证书”是什么意思?我面临同样的问题,你能分享一下你当前的代码吗。谢谢
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"