本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Rancher 中的 Kubernetes:進一步演進

Kubernetes 是 Rancher 支援的第一個外部協調平台,自發布以來,它已成為我們使用者中最廣泛使用的平台之一,並且採用率持續快速成長。隨著 Kubernetes 的發展,Rancher 在適應 Kubernetes 新功能方面也隨之發展。我們從支援 Kubernetes 1.1 版本開始,然後在 1.2 版本發布後立即切換到該版本,現在我們正在努力支援 1.3 版本中令人興奮的新功能。我想帶您了解我們在這些階段中為每個階段新增支援的功能。

Rancher 和 Kubernetes 1.2

Kubernetes 1.2 引入了增強的 Ingress 物件,以簡化允許入站連線到達叢集服務的過程:這是一篇關於 Ingress 政策的優秀部落格文章。Ingress 資源允許使用者以使用者友好的方式定義主機名稱路由規則和 TLS 設定。然後它應該由 Ingress 控制器備份,該控制器將使用 Ingress 規則配置相應的雲端供應商的負載平衡器。由於 Rancher 已經包含基於 HAproxy 的軟體定義負載平衡器,我們已經支援 Ingress 資源的所有配置要求,並且不必在 Rancher 端進行任何更改即可採用 Ingress。我們必須做的是編寫一個 Ingress 控制器,它將監聽 Kubernetes Ingress 特定事件,相應地配置 Rancher 負載平衡器,並將負載平衡器公用進入點傳播回 Kubernetes

Screen-Shot-2016-05-13-at-11.15.56-AM.png

現在,Ingress 控制器作為我們的 Rancher Kubernetes 系統堆疊的一部分部署,並由 Rancher 管理。Rancher 監控 Ingress 控制器的健康狀況,並在發生任何故障時重新建立它。除了標準 Ingress 功能外,Rancher 還允許您透過 Ingress 註釋指定規模來水平擴展支援 Ingress 服務的負載平衡器。例如

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

 name: scalelb

 annotations:

 scale: "2"

spec:

  rules:

  - host: foo.bar.com

    http:

      paths:

      - path: /foo

        backend:

          serviceName: nginx-service

          servicePort: 80

由於上述結果,2 個 Rancher 負載平衡器實例將在不同的主機上啟動,並且 Ingress 將更新為 2 個公用 IP 位址

kubectl get ingress

NAME      RULE          BACKEND   ADDRESS

scalelb      -                    104.154.107.202, 104.154.107.203  // hosts ip addresses where Rancher LB instances are deployed

          foo.bar.com

          /foo           nginx-service:80

有關 Kubernetes 的 Rancher Ingress 控制器實作的更多詳細資訊,請參閱此處

Rancher 和 Kubernetes 1.3

我們對 Kubernetes 1.3 版本及其包含的所有新功能感到非常興奮。我們特別感興趣的有兩個:具狀態應用程式和叢集聯邦。

Kubernetes 具狀態應用程式

具狀態應用程式是 Kubernetes 的新資源,用於表示具狀態應用程式中的一組 Pod。這是使用複製控制器的替代方案,複製控制器最適合用於執行無狀態應用程式。此功能對於依賴法定人數和領導者選舉 (例如 MongoDB、Zookeeper、etcd) 和分散式法定人數 (Cassandra) 的應用程式特別有用。具狀態應用程式建立並維護一組 Pod,每個 Pod 都具有穩定的網路身分識別。為了提供網路身分識別,必須可以為 Pod 取得可解析的 DNS 名稱,該名稱與 Kubernetes 設計文件 中所述的 Pod 身分識別相關聯

# service mongo pointing to pods created by PetSet mdb, with identities mdb-1, mdb-2, mdb-3


dig mongodb.namespace.svc.cluster.local +short A

172.130.16.50


dig mdb-1.mongodb.namespace.svc.cluster.local +short A

# IP of pod created for mdb-1


dig mdb-2.mongodb.namespace.svc.cluster.local +short A

# IP of pod created for mdb-2


dig mdb-3.mongodb.namespace.svc.cluster.local +short A

# IP of pod created for mdb-3

上述功能是透過 Pod 上的註釋實作的,該註釋會顯示到端點,最終作為 DNS 顯示在公開這些 Pod 的服務上。目前,Rancher 透過利用 Rancher DNS 作為 SkyDNS 的直接替代品來簡化 DNS 配置。Rancher DNS 快速、穩定且可擴展 - 叢集中的每部主機都執行 DNS 伺服器。Kubernetes 服務已編程到 Rancher DNS,並解析為來自 10,43.x.x 位址空間的服務叢集 IP,或解析為無頭服務的 Pod IP 位址集。為了使 PetSet 透過 Rancher 與 Kubernetes 協同工作,我們必須在 Rancher DNS 配置中新增對 Pod 身分識別的支援。我們現在正在努力實現這一點,並應在即將發布的 Rancher 版本之一中支援它。

叢集聯邦

叢集聯邦是 Kubernetes 中叢集聯邦的控制平面。它透過在多個叢集之間分散應用程式來提高應用程式的可用性(下圖由 Kubernetes 提供)

Screen Shot 2016-07-07 at 1.46.55 PM.png

每個 Kubernetes 叢集都公開一個 API 端點,並作為聯邦物件的一部分註冊到叢集聯邦。然後,使用叢集聯邦 API,您可以建立聯邦服務。這些物件由多個等效的底層 Kubernetes 資源組成。假設上圖中的 3 個叢集屬於同一個聯邦物件,則透過叢集聯邦建立的每個服務都會在每個叢集中建立等效的服務。除此之外,叢集聯邦服務還將獲得可公開解析的 DNS 名稱,該名稱可解析為 Kubernetes 服務的公用 IP 位址(DNS 記錄已編程到以下公用 DNS 提供者之一)

Screen Shot 2016-07-07 at 1.24.18 PM.png

為了透過 Rancher 中的 Kubernetes 支援叢集聯邦,需要進行一些變更。如今,每個 Kubernetes 叢集都表示為 Rancher 環境。在每個 Kubernetes 環境中,我們都會建立一個完整的 Kubernetes 系統堆疊,其中包含多個服務:Kubernetes API 伺服器、排程器、Ingress 控制器、持久性 etcd、控制器管理員、Kubelet 和 Proxy(最後 2 個在每部主機上執行)。為了設定叢集聯邦,我們將建立一個額外的環境,叢集聯邦堆疊將在其中執行

Screen Shot 2016-07-07 at 1.23.14 PM.png

然後,由 Rancher 環境表示的每個底層 Kubernetes 叢集都應註冊到特定的叢集聯邦。每個叢集都可以透過 Kubernetes 叢集上表示聯邦名稱的標籤,由 Rancher 叢集聯邦環境自動探索。我們仍在努力完成我們的設計,但我們對此功能感到非常興奮,並且看到了它可以解決的許多使用案例。叢集聯邦文件參考

Kubernetes 1.4 的計畫

當我們在 Rancher 中啟動 Kubernetes 支援時,我們決定維護我們自己的 Kubernetes 發行版,以便支援 Rancher 的原生網路功能。我們意識到,擁有我們自己的發行版,我們每次 Kubernetes 發生變更時都需要更新它,但我們認為這對於支援我們正在為使用者開發的使用案例是必要的。作為我們 1.4 版本工作的一部分,我們再次審視了我們的網路方法,並重新分析了我們自己的 Kubernetes 分支的初始需求。除了網路整合之外,我們使用 Kubernetes 完成的所有工作都已開發為 Kubernetes 外掛程式

  • Rancher 作為 CloudProvider(以支援負載平衡器)。
  • Rancher 作為 CredentialProvider(以支援 Rancher 私有登錄檔)。
  • Rancher Ingress 控制器備份 Kubernetes Ingress 資源。

因此,我們已決定消除對 Rancher Kubernetes 發行版的需要,並嘗試將我們所有的變更上游到 Kubernetes 儲存庫。為此,我們將重新設計我們的網路整合,並支援 Rancher 網路作為 Kubernetes 的 CNI 外掛程式。有關這方面的更多詳細資訊將在功能設計完成後立即分享,但預計會在未來 2-3 個月內推出。我們還將繼續投資與 Kubernetes 整合的 Rancher 核心功能,包括但不限於

  • 透過表示 Kubernetes 叢集的 Rancher 環境進行存取權管理
  • 憑證管理和輕鬆的基於 Web 的標準 kubectl cli 存取
  • 負載平衡支援
  • Rancher 內部 DNS 支援
  • Kubernetes 範本的目錄支援
  • 增強的 UI 以表示更多 Kubernetes 物件,例如:Deployment、Ingress、Daemonset。

所有這些都是為了使 Kubernetes 體驗更加強大且使用者直覺。我們對 Kubernetes 社群的所有進展感到非常興奮,並很高興能夠參與其中。Kubernetes 1.3 是一個非常重要的版本,您很快就能在 Rancher 內升級到它。

Rancher-and-Kubernetes.png