首页 > 解决方案 > 为什么这些入口规则不向外部公开服务?(NET::ERR_CERT_AUTHORITY_INVALID/ERR_TOO_MANY_REDIRECTS)

问题描述

我正在尝试设置服务(ArgoCD)并将其公开到集群外部。注意:我对 Kubernetes 还很陌生,所以很可能我有一些误解。如果你能看到一个,请帮我摆脱它。如果需要更多信息来诊断正在发生的事情,请告诉我,我会添加它。

我在 namespace 的集群中安装了 nginx-ingress 入口控制器nginx。我已通过 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 和 80 的端口;<url>是 AWS 控制台中显示的 LoadBalancer 的 url):

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显示的是带有 url ( )nginx-ingress-ingress-nginx-controller的 LoadBalancer 。<url>80:30538/TCP

kubectl describe ingress -n argocd表明入口ingress-routing没问题,地址正确,默认后端和规则;对于入口projectname-argocd-server,它显示正确的地址和规则(路径/),尽管Default backend显示为default-http-backend:80 (<error: endpoints "default-http-backend" not found>).

现在让我也显示 DNS 设置以完成图片:

我希望至少看到 ArgoCD 界面http://test.projectname.org/http://test2.projectname.org/. 实际发生的是:

  1. 当我打开时http://test.projectname.org/,它会将我重定向到 https url 并显示NET::ERR_CERT_AUTHORITY_INVALID。如果我坚持访问,浏览器显示ERR_TOO_MANY_REDIRECTS.

  2. 在我添加入口类并ingress-routingnginx命名空间移动到命名argocd空间之前,http://test2.projectname.org/给了我 404;现在它也重定向到 https 然后给出ERR_TOO_MANY_REDIRECTS

  3. 我也检查了/healthz地址,但它们给出的结果与地址相同/。(相反,http://<url>/healthz给出一个空白页面)

我的问题是:我还缺少什么,为什么我没有得到 UI?

在设置一些 SSL 证书之前不可能公开服务吗?尝试在不同的子域(test.projectname.org 和 test2.projectname.org)上公开相同的东西时,2 个入口会发生冲突吗?如果不使用 projectname.org 检查它是否配置和部署正确,我是否可以看到至少一项服务 (ArgoCD)?(如果是入口/路由/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 只是包装到事物中的默认值argo-cd:,因为这些应该应用于依赖项。值得注意的是,那些有enabled: falsein ingress:,所以创建 ingress 的事实projectname-argocd-server有点出乎意料。

PS nginxIngressClass 是生成的,而不是手动创建的,因此查看它可能也很有用(我已经用“...”替换了 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

标签: kuberneteskubernetes-ingressnginx-ingress

解决方案


是的,这个问题有点复杂,但我已经弄清楚了。基本上,它包括两个问题:

  1. https配置和
  2. 入口配置

有关 https 配置的主要问题已在一个单独的问题中解决,并且简化为将 ACME 服务器从登台切换到生产。我在回答中提供了更多详细信息。

现在,入口配置有点棘手,因为 ArgoCD 有一些重定向,~内部 TLS 要求~,并且还在 :443 处提供多个协议。幸运的是,我发现本教程显示了 ssl-passthrough 设置、更多入口注释,包括nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"修复ERR_TOO_MANY_REDIRECTS错误的方法。这是我的入口配置,它适用于 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

推荐阅读