當前位置: 妍妍網 > 碼農

【運維幹貨分享】面向初學者的kubernetes-ingress教程

2024-08-31碼農

在此 Kubernetes Ingress 教程中,你將學習 Ingress 的基本概念、原生 Ingress 資源物件以及 Ingress controller中涉及的概念。

Kubernetes Ingress 是一種資源,用於添加規則以將流量從外部源路由到 kubernetes 集群中執行的應用程式。

以下是我將在本 Kubernetes Ingress 完整指南中介紹的主題:

什麽是 Kubernetes Ingress?
在 Kubernetes Ingress 之前?
Kubernetes Ingress 是如何工作的?
Kubernetes Ingress資源
Kubernetes Ingresscontroller
Ingress controller如何工作?
Ingress和Ingresscontroller架構
Kubernetes Ingress Controller 列表
部署你的第一個 Ingress controller
Kubernetes Ingress 常見問題

什麽是 Kubernetes Ingress?

字面意思是:Ingress 指的是進入的行為。

在 Kubernetes 世界中也是如此。Ingress 表示進入集群的流量,Egress 是離開集群的流量。

Ingress 是一種原生的 Kubernetes 資源,如 Pod、Deployment 等。使用Ingress,你可以維護 DNS 路由配置。Ingress controller透過從儲存在 etcd 中的 Ingress 物件中讀取路由規則來執行實際路由。

讓我們透過一個高級範例來了解 Ingress。

如果沒有 Kubernetes Ingress,要將應用程式暴露給外部世界,你需要將服務 Loadbalancer 添加到deployment中。這是它的外觀。(我展示了 nodePort 只是為了顯示流量)

在同一個實作中,使用 Ingress,負載均衡器和 kubernetes 伺服端點之間有一個反向代理層(Ingress controller實作)。

這是 Ingress 實作的一個非常高級的檢視。在後面的部份中,我們將看到涵蓋所有關鍵概念的詳細架構。

在 Kubernetes Ingress 之前?

在 Kubernetes Ingress 穩定之前,自訂 Nginx 或 HAproxy kubernetes 部署將作為 Loadbalancer 服務公開,用於將外部流量路由到內部集群服務。

路由規則作為 configmap 添加到 Nginx/HAProxy Pod 中。每當 dns 發生變化或需要添加新的路由條目時,它就會在 configmap 中更新,並且 Pod 配置會被重新載入,或者會被重新部署。

Kubernetes Ingress 也遵循類似的模式,將路由規則維護為原生 Kubernetes Ingress 物件,而不是 configmap。

而 Nginx/HAProxy 則用 Ingress controller、Nginx/HAProxy 的客製版本等來代替 Nginx/HAProxy,它們可以動態地獲取路由規則。

此外,還有一些使用 consul 和其他服務發現工具的實作,在不停機的情況下將 DNS 更改更新到 Nginx 或 HAproxy,這帶來了與Ingress完全相同的實作。

對於 openshift,路由器(HAproxy 實作)概念使在集群外部公開伺服端點變得容易。你所要做的就是建立一個路由器配置(Openshift YAML 物件),openshift 路由器會處理所有事情。它類似於 Kubernetes Ingress。

Kubernetes Ingress 是如何工作的?

如果你是初學者並試圖了解 Ingress,則可能會對其工作原理感到困惑。

例如,你可能會問,嘿,我建立了入站規則,但我不確定如何將其對映到網域名稱或將外部流量路由到內部部署。

你需要非常清楚兩個關鍵概念才能理解這一點。

  • Kubernetes Ingress資源:Kubernetes Ingress 資源負責將 DNS 路由規則儲存在集群中。

  • Kubernetes Ingress controller:Kubernetes Ingress controller(Nginx/HAProxy 等)負責透過存取透過Ingress資源套用的 DNS 規則進行路由。

  • 讓我們詳細看看 Ingress 資源和 Ingress controller。

    Kubernetes Ingress資源

    Kubernetes Ingress 資源是原生 kubernetes 資源,你可以在其中指定 DNS 路由規則。這意味著,你可以將外部 DNS 流量對映到內部 Kubernetes 服務終端節點。

    它需要一個 Ingress controller來路由 Ingress 物件中指定的規則。讓我們看一下一個非常基本的 Ingress 資源。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: test-ingress
    namespace: dev
    spec:
    rules:
    - host: test.apps.example.com
    http:
    paths:
    - backend:
    serviceName: hello-service
    servicePort: 80

    上述聲明意味著,所有對test.apps.example.com的呼叫都應該命中駐留在 dev 名稱空間中的名為hello-service的服務。

    如你所見,它所擁有的只是路由規則。你可以為基於路徑的路由添加多個路由端點,也可以添加 TLS 配置等。

    需要了解的有關 Ingress 物件的關鍵事項。

  • Ingress 物件需要 Ingress controller來路由流量。

  • 最重要的是,外部流量不會到達Ingress API,而是會到達直接使用負載均衡器配置的Ingress controller伺服端點。

  • 現在,讓我們了解一下 Ingress controller。

    Kubernetes Ingress controller

    Ingress controller不是原生 Kubernetes 實作。這意味著集群中不會預設有.

    我們需要設定一個 Ingress controller,才能讓 Ingress 規則正常工作。有幾個開源和企業Ingress controller可用。

    Ingress controller通常是集群中的反向 Web 代理伺服器實作。在 kubernetes 術語中,它是一個反向代理伺服器,部署為 kubernetes deployment,向服務型別 Loadbalancer 公開。

    你可以在集群中將多個 Ingress Controller 對映到多個負載均衡器。每個 Ingress controller都應該有一個名為 ingress- class 的唯一識別元添加到註解中。

    Ingress controller如何工作?

    Nginx 是廣泛使用的 Ingress controller之一。

    那麽讓我們以 Nginx Ingresscontroller實作為例來了解它是如何工作的。

  • Nginx controller Pod 中的檔是一個 lua 樣版,可以與 Kubernetes Ingress API 通訊,並即時獲取流量路由的最新值。

  • Nginx controller與 Kubernetes Ingress API 通訊,以檢查是否為流量路由建立了任何規則。

  • 如果找到任何Ingress規則,Nginx controller會在每個 nginx pod 內的 location 內生成路由配置。/etc/nginx/conf.d

  • 對於你建立的每個 Ingress 資源,Nginx 都會在 location 中生成一個配置。/etc/nginx/conf.d

  • 主檔包含來自/etc/nginx/nginx.confetc/nginx/conf.d.

  • 如果使用新配置更新 Ingress 物件,則 Nginx 配置將再次更新並正常重新載入配置。

  • 如果使用 exec 連線到 Nginx Ingress controller Pod 並檢查檔,則可以看到在 conf 檔中套用的 Ingress 物件中指定的所有規則。/etc/nginx/nginx.conf

  • Ingress和Ingresscontroller架構

    這是解釋kubernetes集群上的Ingress和Ingresscontroller設定的架構圖。

    它顯示了將流量路由到兩個和應用程式的Ingress規則paymentauth

    現在,如果你看一下架構,它會更有意義,你可能能夠理解每個 Ingress 工作流是如何工作的。

    Kubernetes Ingress Controller 列表

    以下是可用於 Kubernetes 的常用 Ingress controller。

  • Nginx Ingress controller(社群 & 來自 Nginx Inc)

  • Traefik

  • HAproxy

  • Contour

  • 適用於 GKE 的 GKE Ingress controller

  • AWS ALB Ingress Controller Fro AKS

  • Azure Application Gateway Ingress Controller

  • Learnk8s 建立了一個很棒的文件,比較了所有可用的Ingress controller。

    部署你的第一個 Ingress controller

    為了更好地理解 ingress 和 ingress controller,你應該熟悉 implementation 。

    我已經釋出了一個關於設定 Nginx Ingresscontroller的詳細指南。

    我還詳細介紹了一些基本概念,例如 Ingress 準入controller。

    此外,我還提供了分步的 manifest 部署和解釋,以便深入了解。

    檢視 Nginx Ingresscontroller設定指南。(下面一篇文章具體介紹)

    Kubernetes Ingress 常見問題

    Ingress 是負載均衡器嗎?

    Ingress 不是負載均衡器。它包含所有路由規則、自訂檔頭和 TLS 配置。Ingress controller充當負載均衡器。

    為什麽我需要 Ingress controller?

    Ingress controller負責將外部流量實際路由到 kubernetes 伺服端點。如果沒有 Ingress controller,添加到 Ingress 的路由規則將不起作用。

    ingress 和 Nginx 有什麽區別?

    Ingress 是一個 kubernetes 物件。Nginx 用作 Ingress controller(反向代理)。

    我們可以使用 Ingress 將流量路由到多個路徑嗎?

    是的。使用單個Ingress定義,你可以添加多個基於路徑的路由配置。

    Ingress 是否支持 TLS 配置?

    是的。你可以在Ingress物件定義中使用 TLS 配置。TLS 證書將添加為 Kubernetes 金鑰,並在 Ingress 物件中參照。

    結論

    在本 Kubernetes Ingress 教程中,我們了解了 Ingress 在 Kubernetes 中的工作原理。及其相關元件。選擇用於生產的 Ingress controller取決於各種因素和要求。

    你可以使用 Ingress controller比較文件作為參考來選擇 Ingress controller。

    也許剛剛開始學習 ingress 或目前正在計畫中使用 ingress。

    無論哪種方式,請在下方發表評論,讓我知道你的想法。