簡體   English   中英

為什么這些入口規則不向外部公開服務? (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)

我正在嘗試設置並向集群外部公開服務 (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

據我了解,service 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顯示nginx-ingress-ingress-nginx-controller是帶有 url <url> ( 80:30538/TCP ) 的 LoadBalancer。

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 界面。 實際發生的是:

  1. 當我打開http://test.projectname.org/ ,它會將我重定向到 https url 並顯示NET::ERR_CERT_AUTHORITY_INVALID 如果我堅持訪問,瀏覽器會顯示ERR_TOO_MANY_REDIRECTS

  2. 在我添加入口類並將ingress-routingnginx命名空間移動到argocd命名空間之前, http://test2.projectname.org/ argocd給了我 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:默認值,因為這些應該應用於依賴項。 值得注意的是,那些在ingress: enabled: false ,因此創建 ingress 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個問題:

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM