当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯nginx入口控制器坏网关

孟成化
2023-03-14

我在K8S集群中面临一个奇怪的问题

基本上我有两个应用程序

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

为了使用这个外部SAML2 IDP,我配置了WSO2

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

在这种情况下,nginx入口为我提供了502个坏网关。如果我复制URL,关闭浏览器,然后再次尝试直接访问X509 IDP,一切都很好。

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

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

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

谢谢你

安杰洛

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

这是我的入口。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的所有超文本传输协议/s请求都被我的客户平衡器(平衡器云vmware nsx)拦截,此平衡器将请求路由到工作节点。

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

唯一重要的事情(至少我认为)是我需要一个直通配置。所以我通过使用直通来配置我的K8S和我的nginx控制器。尚未在Balancer云vmware nsx上进行任何配置

事实上,我需要X509证书不被Ingress Controller使用,但它必须直接到达我的应用程序(到我的服务)。

我只有一个我的服务副本。

这是我的服务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\u do\u handshake()失败(SSL:error:14094412:SSL例程:ssl3\u read\u字节:sslv3 alert bad certificate:SSL alert number 42),同时向上游进行SSL握手,客户端:127.0.0.1,服务器:

我真正不明白的是,为什么我复制URL,关闭浏览器(通过清理所有cookie和文件),然后粘贴复制的URL,结果都很好(证书被我的java应用程序使用)

共有1个答案

尹承业
2023-03-14

我想我找到了这种行为的原因。基本上是这样的:

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

我的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

配置了入口控制器,使cetificate在HTTP请求标头中传递给后端应用程序。现在它似乎都很有效。

感谢你们所有人

 类似资料:
  • 新来的。我想知道是否有人可以帮助我区分我可以用来识别入口控制器和通过YAML和服务识别入口的特征。我有一个预先存在的集群,我认为入口控制器可能是通过helm安装的,但我不确定。有没有办法了解helm在安装nginx ingress控制器时使用的yaml?

  • 我试图更改client\u max\u body\u size值,因此我的nginx入口不会返回413错误。 我测试了一些解决方案。 这是我的测试配置图: 这些更改根本没有效果,加载后,在nginx控制器日志中,我可以看到有关重新加载配置映射的信息,但可以看到nginx中的值。形态相同: 我的nginx控制器配置使用以下图像:quay.io/kubernetes-ingres-controller

  • 我已经研究Kubernetes几个星期了,并使用kube lego NGINX示例(https://github.com/jetstack/kube-lego)已使用DigitalOcean上的Rancher成功地将服务部署到Kubernetes群集。 我已经部署了示例静态站点、Wordpress、Laravel、Craft CMS等。所有这些都使用自定义命名空间、部署、秘密、具有外部注册表的容器

  • 具体来说,当我按照谷歌网站上的指示在GKE上设置nginx ingress时,为什么最终会有两个外部IP地址? 这两个IP地址用于LoadBalancer类型的入口资源和服务资源: 以下是我的想法: 这基本上就是我链接到的教程页面上的图表。因此,我希望负载平衡器是L4类型的,并且有一个外部IP(并且不需要花费任何金钱来使用!)。我希望入口(尽管其名称)没有外部IP,因为我用注释标记了它 谷歌应该承

  • 我的公司有一个伪造的CA证书。实例com和一张伪造地图的唱片。实例com连接到我们的负载平衡器的IP 负载平衡器正在将流量转发到我们的Kubernetes群集。 在集群中,我部署了nginx ingress helm图表,在30200处公开了https节点端口 我根据上述证书创建了一个名为test secret的k8s TLS机密。 我部署了一个带有服务“test”的应用程序,并安装了以下入口:

  • 我有一个网站在kubernetes集群中运行。我可以在本地访问它,但希望通过internet访问它。(我有一个注册域),但外部IP一直挂起 我按照以下指示工作:https://dev.to/peterj/expose-a-kubernetes-service-on-your-own-custom-domain-52dd 这是服务和入口的代码 因此,我正在使用helm安装nginx控制器,但在那之后