簡體   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