【问题标题】:Blank Page in Kubernetes IngressKubernetes Ingress 中的空白页
【发布时间】:2021-12-17 05:52:06
【问题描述】:

我在 Kubernetes 中部署了一个入口,并在不同的入口命名空间上使用了两个应用程序。

当我访问 APP2 时,我可以访问该网站并且它工作正常,但 APP1 显示空白页面。没有错误只是 BLANK 和响应 200 OK。

基本上我将 ArgoCd 与 Azure AD 集成在一起。集成很好,但我认为入口规则并不完全正常。

两个应用程序都在不同的命名空间上,所以我必须在不同的命名空间上使用两个不同的入口:

这是APP1:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /argo-cd/$2
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  defaultBackend:
    service:
      name: argocd-server
      port:
        number: 443
  rules:
  - http:
      paths:
        - path: /argo-cd
          pathType: Prefix
          backend:
            service:
              name: argocd-server
              port:
                number: 443

这是APP2:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sonarqube-ingress
  namespace: ingress-nginx
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  defaultBackend:
    service:
      name: sonarqube
      port:
        number: 9000  
  tls:
  - hosts:
    - sq-example
    secretName: nginx-cert
  rules:
  - host: sq.example.com
    http:
      paths:
      - path: /sonarqube(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: sonarqube
            port:
              number: 9000
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: sonarqube
            port:
              number: 9000

入口部署参数:

spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
        - --election-id=ingress-controller-leader
        - --controller-class=k8s.io/ingress-nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        - --default-ssl-certificate=ingress-nginx/ca-key-pair
        - --enable-ssl-passthrough

记录入口控制器 pod:

10.200.140.160 - - [03/Nov/2021:15:00:34 +0000] "GET /argo-cd HTTP/1.1" 200 831 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" 489 0.002 [argocd-argocd-server-443] [] 10.200.140.177:8080, 10.200.140.177:8080 0, 831 0.000, 0.004 502, 200 d491c01cd741fa9f155642f8616b6d9f
2021/11/03 15:09:05 [error] 867#867: *534643 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: 10.200.140.160, server: _, request: "GET /argo-cd/ HTTP/1.1", upstream: "https://10.200.140.177:8080/argo-cd/", host: "10.200.140.211"
10.200.140.160 - - [03/Nov/2021:15:09:05 +0000] "GET /argo-cd/ HTTP/1.1" 200 831 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" 440 0.006 [argocd-argocd-server-443] [] 10.200.140.177:8080, 10.200.140.177:8080 0, 831 0.000, 0.004 502, 200 8995b914ae6e39d8ca781e1f4f269f50
10.200.140.160 - - [03/Nov/2021:15:09:16 +0000] "GET /argo-cd HTTP/1.1" 200 831 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" 489 0.001 [argocd-argocd-server-443] [] 10.200.140.177:8080 831 0.004 200 0adadba11c87f9b88ed75d52e4ca387a

我尝试在 APP1 上使用路径:/argo-cd,例如:

路径:/argo-cd/ 路径:/argo-cd/(/|$)(.) 路径:/argo-cd/(.) 路径:/argo-cd/*

但不可能让它工作。我在这里做错了吗?

提前致谢。

【问题讨论】:

  • 只是猜测:在argo-cd ingress docu 中,如果使用ssl-passthrough,则必须使用--enable-ssl-passthrough 启动nginx 入口控制器。你做过吗?
  • @mr.wolle 我在入口控制器参数中添加了这个并且仍然得到相同的结果。容器:-args:---validating-webhook-certificate=/usr/local/certificates/cert---default-ssl-certificate=ingress-nginx/ca-key-pair--更多东西---enable-ssl -直通
  • 我用新鲜的ArgoCD installation 测试了你的 Ingress 定义,它运行良好。你是如何安装 ArgoCD 和 Nginx Ingress 控制器的?您能否获取 Ingress 控制器 pod 的名称 (kubectl get pods -n ingress-nginx),然后运行 ​​kubectl logs {ingress-nginx-controller-pod-name} -n ingress-nginx 并粘贴日志?
  • @MikolajS。要安装 argoCD,我遵循以下步骤: 1. kubectl create namespace argocd 2. kubectl apply -n argocd -f raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/… 3. 对于 AD 集成,我遵循:Azure AD App Registration Auth using OIDC using argo-cd.readthedocs.io/en/stable/operator-manual/… 之前我在测试安装,它工作正常,但不是在暂存中。很可能它与入口控制器/入口规则有关...对于 Ingress Heml dpl
  • kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-controller-77f778464b-74x6h 1/1 Running 0 12h ingress-nginx-controller-77f778464b-wwgf2 1/1 Running 0 12h sonarqube-774cfbc997-qj7pz 1/1 运行 0 17h

标签: azure kubernetes kubernetes-ingress nginx-ingress argocd


【解决方案1】:

问题是你没有配置argo-cd根路径。


为什么?

首先,值得提醒的是,NGINX Ingress 控制器by default is Cluster-wide

  • 集群范围的入口控制器(默认)。 Ingress Controller 处理在集群的任何命名空间中创建的配置资源。由于 NGINX 是一种高性能负载均衡器,能够同时为多个应用程序提供服务,因此我们的安装清单和 Helm 图表默认使用此选项。

因此,即使您最后在不同的命名空间中配置了 Ingress,您也使用了相同的 NGINX Ingress Controller。您可以通过运行来检查它:

kubectl get ing -n ingress-nginx
kubectl get ing -n argocd

您可以观察到ADDRESS 对于不同命名空间中的两个入口是相同的。

假设我只应用了第一个入口定义 (APP1)。如果我尝试访问https://{ingress-ip}/argo-cd,我将被重定向到https://{ingress-ip}/applications 网站——它可能是因为您还设置了defaultBackend 设置。无论如何这不是一个好方法 - 你应该正确配置 argo-cd 根路径。

当我应用第二个入口定义 (APP2) 时,我也会像你一样得到空白页 - 可能是因为两个入口的定义混合在一起,这会导致问题。

如何设置 argo-cd 根路径?

基于this documentation

编辑 argocd-server 部署以将 --rootpath=/argo-cd 标志添加到 argocd-server 命令。

文档中并没有详细解释,但我想出了如何设置它:

首先,我们需要获取当前的部署配置:

kubectl get deploy argocd-server -o yaml -n argocd > argocd-server-deployment.yaml

现在,我们需要编辑argocd-server-deployment.yaml 文件。在command(在我的情况下是第52行)下,我们需要添加rootpath标志 - 之前:

containers:
- command:
  - argocd-server
  env:

之后:

containers:
- command:
  - argocd-server
  - --rootpath=/argo-cd
  env:

保存并运行kubectl apply -f argocd-server-deployment.yaml

现在,是时候编辑入口定义了——当我们设置根路径时,我们需要删除 nginx.ingress.kubernetes.io/rewrite-target: 注释:

annotations:
  kubernetes.io/ingress.class: nginx
  nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
  nginx.ingress.kubernetes.io/ssl-passthrough: "true"
  nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

在这些更改之后,如果我到达https://{ingress-ip}/argo-cd,我将被重定向到https://{ingress-ip}/argo-cd/applications。一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多