Kubernetes nginx入口 Controller 坏网关

标签 kubernetes kubernetes-ingress nginx-ingress

我的 K8S 集群遇到一个奇怪的问题
基本上我有2个应用程序:

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

  • 我配置了 WSO2 以便使用这个外部 SAML2 IDP
    当我尝试通过 X509 登录时,WSO2 向我显示登录页面,我单击智能卡并重定向到外部 SAML IDP。
    在这种情况下,nginx 入口给了我 502 个错误的网关。如果我复制 URL,关闭浏览器并再次尝试直接访问 X509 IDP,一切都很好。
    请注意,我使用的是另一个外部 SAML IDP,在这种情况下,重定向工作得很好
    2个外部IDP的区别在于我在pass-through中配置了X509 SAML IDP的入口 Controller ,因为我需要X509证书被我的Java应用程序使用
    谁能告诉我为什么我会有这种奇怪的行为?
    谢谢
    安杰洛
    更新
    在这里你可以找到我的 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
    这是我的场景:
    enter image description here
    如您所见,我的客户平衡器( Balancer cloud vmware nsx )拦截了来自 Internet 的所有 http/s 请求,该平衡器将请求路由到工作节点。
    在工作节点上,我有我的 eid-tls-service;这是一个默认类型的服务(clusterIP 类型),所以我需要入口 Controller 来处理请求。
    唯一重要的事情(至少我认为)是我需要一个 直通配置。所以我使用 passthrough 配置了我的 K8S 和我的 nginx Controller 。 Balancer cloud vmware nsx 上没有做任何配置
    事实上,我需要入口 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:我真正无法理解的是为什么如果我复制 URL,关闭浏览器(通过清除所有 cookie 和文件)并粘贴复制的 URL 一切正常(证书由我的 Java 应用程序使用)

    最佳答案

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

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

  • 我的 X509 IAM 入口 Controller 配置为直通。
    在第 2 步中,SSL 连接终止并由我的 pod 处理,K8S 入口 Controller 在重定向期间尝试使用 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 请求 header 中的后端应用程序的方式配置了入口 Controller 。现在似乎一切都很顺利。
    谢谢大家

    关于Kubernetes nginx入口 Controller 坏网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65735055/

    相关文章:

    mysql - Kubernetes/Node MySQL - 并发请求呈指数级减慢并导致 pod 崩溃

    docker - Kubernetes flannel pod 网络错误

    Kubernetes 入口(hostNetwork=true),无法通过节点 IP 访问服务 - GCP

    git - K8S : How to reach pod with SSH service (Gitea) over the same host ingress-nginx exposes as HTTP?

    Kubernetes-入口 : Error: connect ECONNREFUSED 127. 0.0.1:80

    ssl - Kubernetes: Nginx Ingress注解----> nginx.ingress.kubernetes.io/secure-backends

    kubernetes - 使用OpenShift在卷装载上写入权限

    kubernetes - 在多命名空间集群 AKS 中使用入口

    spring-boot - 当 Spring Boot 应用程序使用 nginx Controller 部署到 kubernetes 集群时,JWT 身份验证不起作用

    kubernetes - Ingress 和证书管理器未创建证书