繁体   English   中英

Kubernetes nginx 入口 controller 坏网关

[英]Kubernetes nginx ingress controller bad gateway

我在我的 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的入口controller,因为我需要我的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 类型),所以我需要入口 controller 来处理请求。

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

事实上,我需要 Ingress Controller 不使用 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>

这是我的入口 controller 日志错误:

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:

What I really can't understand is why if I copy the URL, close the browser (by cleaning all cookies and files) and I paste the copied URL all works good (certificate is consumed by my java application)

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

  • HTTP 请求由我的 IAM 使用 SSL 连接处理
  • 从我的 IAM 重定向到位于 saml K8S 集群内的 X509 IAM。

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

如果我复制并粘贴 URL,我不会在我的 IAM 上启动 SSL 连接,但我直接将 go 重定向到 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

我配置了入口 controller,使证书在 HTTP 请求 header 中传递到后端应用程序。 现在似乎一切都很好。

谢谢大家

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM