【问题标题】:Kubernetes nginx ingress controller bad gatewayKubernetes nginx 入口控制器坏网关
【发布时间】:2021-01-15 11:10:37
【问题描述】:

我的 K8S 集群遇到了一个奇怪的问题

基本上我有 2 个应用程序:

  • 身份管理器(基于 WSO2,但问题与 WSO2 无关)
  • 将管理 X509 身份验证的外部 SAML2 IDP

我配置了 WSO2 以便使用这个外部 SAML2 IDP

当我尝试通过 X509 登录时,WSO2 显示登录页面,我点击智能卡并重定向到外部 SAML IDP。

在这种情况下,nginx 入口给我 502 bad gateway。如果我复制 URL,关闭浏览器并再次尝试直接访问 X509 IDP,一切正常。

请注意,我正在使用另一个外部 SAML IDP,在这种情况下,重定向工作得很好

2 个外部 IDP 的区别在于我在直通中配置了 X509 SAML IDP 的入口控制器,因为我需要我的 Java 应用程序使用 X509 证书

谁能告诉我为什么我会有这种奇怪的行为?

谢谢

安杰洛

更新 在这里你可以找到我的nginx.conf https://raw.githubusercontent.com/angeloimm/nginx_configuration/main/nginx.conf

这是我的ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: eid-tls-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /eid-tsl/
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
    - hosts:
        - login-cns-test.it
  rules:
  - host: login-cns-test.it
    http:
      paths:
      - path: /
        backend:
          serviceName: eid-tls-service
          servicePort: 443

更新 2

这是我的场景:

正如您所见,来自 Internet 的所有 http/s 请求都被我的客户平衡器(Balancer cloud vmware nsx)拦截,此平衡器将请求路由到工作节点。

在工作节点上,我有我的 eid-tls-service;这是一个默认类型的服务(clusterIP 类型),所以我需要入口控制器来处理请求。

唯一重要的事情(至少我认为)是我需要一个 passthrough 配置。所以我通过使用 passthrough 配置了我的 K8S 和我的 nginx 控制器。 Balancer cloud vmware nsx上没有做任何配置

事实上,我需要入口控制器不使用 X509 证书,但它必须直接到达我的应用程序(到我的服务)。

我的服务只有 1 个副本。

这是我的服务 yaml 配置:

kind: Service
apiVersion: v1
metadata:
  name: eid-tls-service
spec:
  selector:
    app: eid-tls
  ports:
  - protocol: TCP
    name: https-port
    port: 443
    targetPort: 443

来自 kubectl,这是我的 eid-tls-service 描述:

Name: eid-tls-service
Namespace: eid-tls-idp-ns
Labels: <none>
Annotations: Selector: app=eid-tls
Type: ClusterIP
IP: xx.ss.z.ttt
Port: https-port 443/TCP
TargetPort: 443/TCP
Endpoints: xx.yy.z.www:443
Session Affinity: None
Events: <none>

这是我的入口控制器日志错误:

2021/01/28 11:24:06 [error] 3210#3210: *78115978 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: 127.0.0.1, server:

我真的不明白为什么如果我复制 URL,关闭浏览器(通过清除所有 cookie 和文件)并粘贴复制的 URL 一切正常(证书由我的 java 应用程序使用)

【问题讨论】:

  • 您可以与我们分享您的入口配置吗?
  • @matt_j 我更新了我的问题
  • 来自 nginx-ingress 控制器的日志有提示吗?
  • 我会试试的!十分感谢!我会更新你
  • @matt_j 请看我的更新 2;我回答你的问题了吗?

标签: kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

我想我找到了这种行为的原因。基本上它正在发生以下情况:

  • 我的 IAM 使用 SSL 连接处理 HTTP 请求
  • 重定向是从我的 IAM 到我的 X509 IAM 住在 saml K8S 集群。

我的 X509 IAM 入口控制器配置为直通。 在第 2 步,SSL 连接终止并由我的 pod 处理,K8S 入口控制器尝试在重定向期间使用 SSL 连接,因此流量受到损害。

如果我复制并粘贴 URL,我不会在我的 IAM 上启动 SSL 连接,而是直接转到 X509 IAM,因此不会进行重定向。

基本上我认为我无法遵循我的方法,所以我所做的就是以这种方式更改 ingress.yaml 定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: eid-tls-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/configuration-snippet: "proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;"
    nginx.ingress.kubernetes.io/server-snippet: "ssl_verify_client optional_no_ca;"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
    - hosts:
        - login-cns-test.it
  rules:
  - host: login-cns-test.it
    http:
      paths:
      - path: /
        backend:
          serviceName: eid-tls-service
          servicePort: 443

我配置了入口控制器,使证书在 HTTP 请求标头中传递给后端应用程序。现在看来一切正常。

谢谢大家

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2021-10-04
    • 2020-04-09
    • 2020-12-05
    • 2020-04-24
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多