为什么这些入口规则不向外部公开服务? (网络::ERR_CERT_AUTHORITY_INVALID/ERR_TOO_MANY_REDIRECTS)
Why these ingress rules don't expose a service to outside? (NET::ERR_CERT_AUTHORITY_INVALID/ERR_TOO_MANY_REDIRECTS)
我正在尝试设置服务 (ArgoCD) 并将其公开到集群外部。注意:我是 Kubernetes 的新手,所以很可能我有一些误解。如果你能看到一个,请帮我摆脱它。如果需要更多信息来诊断正在发生的事情,请告诉我,我会添加。
我在集群中的命名空间 nginx
中安装了 nginx-ingress 入口控制器。我已经通过 helm 安装 ArgoCD 到 argocd
命名空间*。 kubectl get service -n argocd
显示(省略 AGE 列):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
projectname-argocd-application-controller ClusterIP 10.100.249.133 <none> 8082/TCP
projectname-argocd-dex-server ClusterIP 10.100.80.187 <none> 5556/TCP,5557/TCP
projectname-argocd-redis ClusterIP 10.100.230.170 <none> 6379/TCP
projectname-argocd-repo-server ClusterIP 10.100.221.87 <none> 8081/TCP
projectname-argocd-server ClusterIP 10.100.22.26 <none> 80/TCP,443/TCP
据我了解,服务 projectname-argocd-server
是我应该公开以获得 ArgoCD WebUI 的服务。为此,我创建了一个入口(基于 docs):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-routing
spec:
rules:
- host: test2.projectname.org
http:
paths:
- path: /
pathType: Prefix # presumably may comment this out
backend:
service:
name: projectname-argocd-server
port:
number: 80
# this was added later while trying to figure the problem out
defaultBackend:
service:
name: projectname-argocd-server
port:
number: 80
ingressClassName: nginx
并通过 kubectl apply -f routing.yaml -n argocd
应用它。现在我可以看到入口是与部署 ArgoCD 创建的入口一起创建的,kubectl get ing -A
的输出是(省略 AGE,PORTS 是 80;<url>
是 url 的AWS 控制台中显示的 LoadBalancer):
NAMESPACE NAME CLASS HOSTS ADDRESS
argocd projectname-argocd-server nginx test.projectname.org <url>
argocd ingress-routing nginx test2.projectname.org <url>
顺便说一下,kubectl get svc -n nginx
显示 nginx-ingress-ingress-nginx-controller
是 LoadBalancer with url <url>
(80:30538/TCP
).
kubectl describe ingress -n argocd
表明 ingress ingress-routing
没问题,有正确的地址、默认后端和规则;对于入口 projectname-argocd-server
它显示正常的地址和规则(路径 /
),尽管 Default backend
显示为 default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
.
现在让我再展示一下 DNS 设置以完成图片:
- 我已经为 projectname.org 创建了一个托管区域(在 Route 53 中),将其 DNS 服务器放入域名注册的 NS 条目中
- 我在托管区域中创建了一个 CNAME 条目,将
test.projectname.org
指向 <url>
- 我为
test2.projectname.org
创建了一个 A 条目,从列表中选择了负载均衡器,因此它指向 dualstack.<url>
我预计 至少会在 http://test.projectname.org/
和 http://test2.projectname.org/
之一看到 ArgoCD 界面。 实际发生的是:
当我打开 http://test.projectname.org/
时,它会将我重定向到 https url 并显示 NET::ERR_CERT_AUTHORITY_INVALID
。如果我坚持访问,浏览器显示 ERR_TOO_MANY_REDIRECTS
.
在我添加入口 class 并将 ingress-routing
从 nginx
命名空间移动到 argocd
命名空间之前,http://test2.projectname.org/
给了我 404;现在它也重定向到 https,然后给出 ERR_TOO_MANY_REDIRECTS
我也检查了 /healthz
地址,但它们给出的结果与 /
相同。 (相比之下,http://<url>/healthz
给出一个空白页)
我的问题是:我还缺少什么,为什么我没有得到 UI?
在设置一些SSL证书之前是否无法公开服务?尝试在不同子域(test.projectname.org 和 test2.projectname.org)上公开相同内容时,2 个入口是否会发生冲突? 我可以在不使用 projectname.org 检查它是否配置和部署正确的情况下至少看到一项服务 (ArgoCD) 吗?(如果是 ingress/routing/dns 问题或配置问题)
(*) 这是我用来安装 ArgoCD 的图表:
apiVersion: v2
name: argo-cd
appVersion: v2.1.5
description: A declarative, GitOps continuous delivery tool for Kubernetes
version: 3.26.3
dependencies:
- name: argo-cd
version: 3.26.3
repository: https://argoproj.github.io/argo-helm
我使用的 和 values-overwrite.yaml 只是 default values 包裹在 argo-cd:
中,因为这些应该应用于依赖项。值得注意的是,那些在 ingress:
中有 enabled: false
,因此创建入口 projectname-argocd-server
的事实有点出乎意料。
PS nginx
IngressClass 是生成的,不是手动创建的,所以查看它可能也很有用(我用“...”替换了 id 和时间戳),如kubectl get IngressClass nginx -o yaml
所示:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
annotations:
meta.helm.sh/release-name: nginx-ingress
meta.helm.sh/release-namespace: nginx
creationTimestamp: ...
generation: 1
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/version: 1.0.3
helm.sh/chart: ingress-nginx-4.0.5
name: nginx
resourceVersion: "5750"
uid: ...
spec:
controller: k8s.io/ingress-nginx
对,这个问题有点复杂,但我已经想通了。基本上,它由 2 个问题组成:
- https 配置和
- 入口配置
关于 https 配置的主要问题已在单独的 中解决,并且简化为将 ACME 服务器从暂存切换到生产。我在回答中提供了更多详细信息。
现在,入口配置有些棘手,因为 ArgoCD 有一些重定向、~内部 TLS 要求~,并且还在 :443 提供不止一种协议。幸运的是,我找到了显示 ssl-passthrough 设置的 this tutorial,更多入口注释,包括修复 ERR_TOO_MANY_REDIRECTS
错误的 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
。这是我的入口配置,它在 https 设置下运行良好(还要注意端口和 tls 秘密的变化):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-argocd-routing
namespace: argocd
annotations:
cert-manager.io/cluster-issuer: <cluster issuer name>
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
tls:
- hosts:
- test2.projectname.org # switched to argocd. later
secretName: argocd-secret # do not change, this is provided by Argo CD
rules:
- host: test2.projectname.org # switched to argocd. later
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: projectname-argocd-server
port:
number: 443
我正在尝试设置服务 (ArgoCD) 并将其公开到集群外部。注意:我是 Kubernetes 的新手,所以很可能我有一些误解。如果你能看到一个,请帮我摆脱它。如果需要更多信息来诊断正在发生的事情,请告诉我,我会添加。
我在集群中的命名空间 nginx
中安装了 nginx-ingress 入口控制器。我已经通过 helm 安装 ArgoCD 到 argocd
命名空间*。 kubectl get service -n argocd
显示(省略 AGE 列):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
projectname-argocd-application-controller ClusterIP 10.100.249.133 <none> 8082/TCP
projectname-argocd-dex-server ClusterIP 10.100.80.187 <none> 5556/TCP,5557/TCP
projectname-argocd-redis ClusterIP 10.100.230.170 <none> 6379/TCP
projectname-argocd-repo-server ClusterIP 10.100.221.87 <none> 8081/TCP
projectname-argocd-server ClusterIP 10.100.22.26 <none> 80/TCP,443/TCP
据我了解,服务 projectname-argocd-server
是我应该公开以获得 ArgoCD WebUI 的服务。为此,我创建了一个入口(基于 docs):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-routing
spec:
rules:
- host: test2.projectname.org
http:
paths:
- path: /
pathType: Prefix # presumably may comment this out
backend:
service:
name: projectname-argocd-server
port:
number: 80
# this was added later while trying to figure the problem out
defaultBackend:
service:
name: projectname-argocd-server
port:
number: 80
ingressClassName: nginx
并通过 kubectl apply -f routing.yaml -n argocd
应用它。现在我可以看到入口是与部署 ArgoCD 创建的入口一起创建的,kubectl get ing -A
的输出是(省略 AGE,PORTS 是 80;<url>
是 url 的AWS 控制台中显示的 LoadBalancer):
NAMESPACE NAME CLASS HOSTS ADDRESS
argocd projectname-argocd-server nginx test.projectname.org <url>
argocd ingress-routing nginx test2.projectname.org <url>
顺便说一下,kubectl get svc -n nginx
显示 nginx-ingress-ingress-nginx-controller
是 LoadBalancer with url <url>
(80:30538/TCP
).
kubectl describe ingress -n argocd
表明 ingress ingress-routing
没问题,有正确的地址、默认后端和规则;对于入口 projectname-argocd-server
它显示正常的地址和规则(路径 /
),尽管 Default backend
显示为 default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
.
现在让我再展示一下 DNS 设置以完成图片:
- 我已经为 projectname.org 创建了一个托管区域(在 Route 53 中),将其 DNS 服务器放入域名注册的 NS 条目中
- 我在托管区域中创建了一个 CNAME 条目,将
test.projectname.org
指向<url>
- 我为
test2.projectname.org
创建了一个 A 条目,从列表中选择了负载均衡器,因此它指向dualstack.<url>
我预计 至少会在 http://test.projectname.org/
和 http://test2.projectname.org/
之一看到 ArgoCD 界面。 实际发生的是:
当我打开
http://test.projectname.org/
时,它会将我重定向到 https url 并显示NET::ERR_CERT_AUTHORITY_INVALID
。如果我坚持访问,浏览器显示ERR_TOO_MANY_REDIRECTS
.在我添加入口 class 并将
ingress-routing
从nginx
命名空间移动到argocd
命名空间之前,http://test2.projectname.org/
给了我 404;现在它也重定向到 https,然后给出ERR_TOO_MANY_REDIRECTS
我也检查了
/healthz
地址,但它们给出的结果与/
相同。 (相比之下,http://<url>/healthz
给出一个空白页)
我的问题是:我还缺少什么,为什么我没有得到 UI?
在设置一些SSL证书之前是否无法公开服务?尝试在不同子域(test.projectname.org 和 test2.projectname.org)上公开相同内容时,2 个入口是否会发生冲突? 我可以在不使用 projectname.org 检查它是否配置和部署正确的情况下至少看到一项服务 (ArgoCD) 吗?(如果是 ingress/routing/dns 问题或配置问题)
(*) 这是我用来安装 ArgoCD 的图表:
apiVersion: v2
name: argo-cd
appVersion: v2.1.5
description: A declarative, GitOps continuous delivery tool for Kubernetes
version: 3.26.3
dependencies:
- name: argo-cd
version: 3.26.3
repository: https://argoproj.github.io/argo-helm
我使用的 和 values-overwrite.yaml 只是 default values 包裹在 argo-cd:
中,因为这些应该应用于依赖项。值得注意的是,那些在 ingress:
中有 enabled: false
,因此创建入口 projectname-argocd-server
的事实有点出乎意料。
PS nginx
IngressClass 是生成的,不是手动创建的,所以查看它可能也很有用(我用“...”替换了 id 和时间戳),如kubectl get IngressClass nginx -o yaml
所示:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
annotations:
meta.helm.sh/release-name: nginx-ingress
meta.helm.sh/release-namespace: nginx
creationTimestamp: ...
generation: 1
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/version: 1.0.3
helm.sh/chart: ingress-nginx-4.0.5
name: nginx
resourceVersion: "5750"
uid: ...
spec:
controller: k8s.io/ingress-nginx
对,这个问题有点复杂,但我已经想通了。基本上,它由 2 个问题组成:
- https 配置和
- 入口配置
关于 https 配置的主要问题已在单独的
现在,入口配置有些棘手,因为 ArgoCD 有一些重定向、~内部 TLS 要求~,并且还在 :443 提供不止一种协议。幸运的是,我找到了显示 ssl-passthrough 设置的 this tutorial,更多入口注释,包括修复 ERR_TOO_MANY_REDIRECTS
错误的 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
。这是我的入口配置,它在 https 设置下运行良好(还要注意端口和 tls 秘密的变化):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-argocd-routing
namespace: argocd
annotations:
cert-manager.io/cluster-issuer: <cluster issuer name>
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
tls:
- hosts:
- test2.projectname.org # switched to argocd. later
secretName: argocd-secret # do not change, this is provided by Argo CD
rules:
- host: test2.projectname.org # switched to argocd. later
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: projectname-argocd-server
port:
number: 443