Ang*_*ata 6 kubernetes kubernetes-ingress nginx-ingress
我的 K8S 集群遇到一个奇怪的问题
基本上我有2个应用程序:
我配置了 WSO2 以便使用这个外部 SAML2 IDP
当我尝试通过 X509 登录时,WSO2 向我显示登录页面,我单击智能卡并重定向到外部 SAML IDP。
在这种情况下,nginx 入口给我 502 错误网关。如果我复制 URL,关闭浏览器并再次尝试直接访问 X509 IDP,一切都很好。
请注意,我使用的是另一个外部 SAML IDP,在这种情况下,重定向工作得很好
2个外部IDP的区别在于我在pass-through中配置了X509 SAML IDP的入口控制器,因为我需要X509证书被我的Java应用程序使用
谁能告诉我为什么我会有这种奇怪的行为?
谢谢
安杰洛
更新
在这里你可以找到我的https://raw.githubusercontent.com/angeloimm/nginx_configuration/main/nginx.confnginx.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
Run Code Online (Sandbox Code Playgroud)
更新 2
正如您所看到的,我的客户平衡器(Balancer cloud vmware nsx)拦截了来自 Internet 的所有 http/s 请求,该平衡器将请求路由到工作节点。
在工作节点上,我有我的 eid-tls-service;这是一个默认类型的服务(clusterIP 类型),所以我需要入口控制器来处理请求。
唯一重要的事情(至少我认为)是我需要一个直通配置。所以我使用 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
Run Code Online (Sandbox Code Playgroud)
从 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>
Run Code Online (Sandbox Code Playgroud)
这是我的入口控制器日志错误:
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 应用程序使用)
我想我找到了这种行为的原因。基本上它发生以下情况:
我的 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
Run Code Online (Sandbox Code Playgroud)
我配置了入口控制器,将证书通过 HTTP 请求标头传递到后端应用程序。现在看来一切都很顺利。
谢谢大家
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |