为什么这些入口规则不向外部公开服务?(NET::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)

查看:11
本文介绍了为什么这些入口规则不向外部公开服务?(NET::ERR_CERT_AUTHORITY_INVALID/ERR_TOO_MANY_REDIRECTS)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试设置服务(ArgoCD)并将其公开给群集外部。注:我对库伯内斯还很陌生,所以很可能我有一些误解。如果你能看到一个,请帮我摆脱它。如果需要更多信息来诊断发生了什么,请让我知道,我会添加的。

我在命名空间nginx中的集群中安装了nginx-ingress入口控制器。我已经通过HELM将ArgoCD安装到argocd命名空间*中。kubectl get service -n argocd显示(省略年龄栏):

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的输出是(省略年龄,端口为80;<url>是AWS控制台中显示的LoadBalancerURL):

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是带url的负载均衡器<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设置:

  • 我已经为project name.org创建了一个托管区域(在路53中),将其DNS服务器放到域名注册的NS条目中
  • 我已在托管区域中创建了一个CNAME条目,指向test.projectname.org<url>
  • 我为test2.projectname.org创建了一个A条目,并从列表中选择了负载均衡器,因此它指向dualstack.<url>

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

  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.project tname.org和est2.project tname.org)上公开相同内容时,两个入口是否会发生冲突?我是否可以至少看到一个服务(ArgoCD),而不使用project tname.org检查其配置和部署是否正确?(以区分是入口/路由/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有点出乎意料。

psnginxIngressClass是生成的,而不是手动创建的,因此也可以查看它(我已经用";...";替换了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

推荐答案

对,这个问题有点复杂,但我已经弄清楚了。基本上由两个问题组成:

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

HTTPS配置的主要问题在单独的question中解决,简化为将ACME服务器从暂存切换到生产。我已在我的答复中提供了更多详细信息。

现在,入口配置有些棘手,因为ArgoCD有一些重定向,~内部TLS要求~,并且还在:443处服务于多个协议。幸运的是,我找到了this tutorial,它显示了SSL通过设置,还有更多的入口注释,包括修复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

这篇关于为什么这些入口规则不向外部公开服务?(NET::ERR_CERT_AUTHORITY_INVALID/ERR_TOO_MANY_REDIRECTS)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆