Kubernetes Ingress 中的空白页面

Blank Page in Kubernetes Ingress

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

当我访问 APP2 时,我可以访问该网站并且它工作正常,但 APP1 显示空白页面。没有错误只是空白和响应 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/
    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: /
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根路径


为什么?

首先,值得提醒的是 NGINX Ingress controller by default is Cluster-wide:

  • Cluster-wide Ingress Controller (default). The Ingress Controller handles configuration resources created in any namespace of the cluster. As NGINX is a high-performance load balancer capable of serving many applications at the same time, this option is used by default in our installation manifests and Helm chart.

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

查看
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:

Edit the argocd-server deployment to add the --rootpath=/argo-cd flag to the argocd-server command.

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

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

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。一切正常。