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根路径?
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
。一切正常。
我已经在 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根路径?
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
。一切正常。