本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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
現在,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 提供)
每個 Kubernetes 叢集都公開一個 API 端點,並作為聯邦物件的一部分註冊到叢集聯邦。然後,使用叢集聯邦 API,您可以建立聯邦服務。這些物件由多個等效的底層 Kubernetes 資源組成。假設上圖中的 3 個叢集屬於同一個聯邦物件,則透過叢集聯邦建立的每個服務都會在每個叢集中建立等效的服務。除此之外,叢集聯邦服務還將獲得可公開解析的 DNS 名稱,該名稱可解析為 Kubernetes 服務的公用 IP 位址(DNS 記錄已編程到以下公用 DNS 提供者之一)
為了透過 Rancher 中的 Kubernetes 支援叢集聯邦,需要進行一些變更。如今,每個 Kubernetes 叢集都表示為 Rancher 環境。在每個 Kubernetes 環境中,我們都會建立一個完整的 Kubernetes 系統堆疊,其中包含多個服務:Kubernetes API 伺服器、排程器、Ingress 控制器、持久性 etcd、控制器管理員、Kubelet 和 Proxy(最後 2 個在每部主機上執行)。為了設定叢集聯邦,我們將建立一個額外的環境,叢集聯邦堆疊將在其中執行
然後,由 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 內升級到它。