Docker 使用Nginx入口控制器配置端到端SSL

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: &

我正在运行本地部署,并尝试将HTTPS流量重定向到我的后端播客。 我不想在入口级别终止SSL,这就是为什么我没有使用任何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
我确实看到了一些关于这个问题的答案,但这似乎对我不起作用。提前谢谢

编辑:远程工作的唯一一件事是当我将入口值重写为

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"
    
  • 重要提示:您可以阅读:

    注意

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


    这意味着从现在起,所有其他注释都是无用的。这适用于诸如
    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"