首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Nginx Ingress控制器配置端到端SSL

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

Stack Overflow用户
提问于 2020-07-17 02:31:39
回答 3查看 2.1K关注 0票数 3

我正在运行本地部署,并尝试将HTTPS流量重定向到我的后端pods。我不希望SSL在入口级终止,这就是为什么我没有使用任何tls秘密。

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

这是我的入口规范

代码语言:javascript
复制
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。

我的服务路线

代码语言:javascript
复制
# service information for myserver
service:
  type: ClusterIP
  port: 8443
  targetPort: 8443
  protocol: TCP

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

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

代码语言:javascript
复制
nginx-ingress:
  controller:
    publishService:
      enabled: true
    service:
      type: NodePort
      nodePorts:
        https: "40000"

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

编辑2:由于某些原因,ssl-passthrough无法工作。我强制执行它为

代码语言:javascript
复制
nginx-ingress:
  controller:
    extraArgs:
      enable-ssl-passthrough: ""

当我描述部署时,我可以在args中看到它,但是当我像https://kubernetes.github.io/ingress-nginx/kubectl-plugin/#backends中描述的那样检查kubectl ingress-nginx backends时,它显示"sslPassThrough:false“

EN

回答 3

Stack Overflow用户

发布于 2020-07-17 17:08:56

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

默认情况下,

SSL Passthrough是禁用的,并且需要使用--enable-ssl-passthrough标志启动控制器。

由于ssl-passthrough在开放系统互连模型的第4层上工作,而不是在第7层(超文本传输协议)上工作,因此使用它将使您在入口对象上设置的所有其他注释无效。

因此在您部署级别上,您已经在args下指定了此标志

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-03-15 23:13:28

如果你想使用ssl-passthrough,你需要设置几个东西。

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

规格:规则:-主机: example.com <-此处example.com:...

其中提到了in documentation

SSL Passthrough利用SNI服务器名称指示并从TLS协商中读取虚拟域,这需要兼容的客户端。连接被TLS侦听器接受后,它由控制器本身处理,并在后端和客户端之间来回传输。

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

  1. 第二件事是设置--enable-ssl-passthrough标志,@thomas已经在单独的答案中提到过。

只需编辑nginx入口部署并将此行添加到args list:

  • --enable-ssl-passthrough

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

nginx.ingress.kubernetes.io/ssl-passthrough:"true“nginx.ingress.kubernetes.io/后端协议:"HTTPS"

重要提示:In docs您可以阅读:

注意

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

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

票数 1
EN

Stack Overflow用户

发布于 2020-07-18 00:42:49

看起来这是一个开放的问题https://github.com/kubernetes/ingress-nginx/issues/5686

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62941369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档