Kubernetes 很復雜,那是因為復雜才能解決你的問題
Kubernetes 是否過于復雜?
我經常被問及Kubernetes 是否復雜。在這篇文章中,我將逐一討論這些論點并給出答案。當您需要和不需要 Kubernetes 時,我也會向您解釋。
與虛擬機相比,使用容器的優(yōu)勢
在了解 Kubernetes 本身的復雜性之前,我們需要了解一下 Docker 容器,因為它也增加了復雜性。這種復雜性值得嗎?
幾乎每個人都會同意,即使您決定不使用 Kubernetes,您仍然應該使用 Docker。在沒有 Kubernetes 的情況下,將 Docker 容器部署到 AWS 或其他云提供商也不難。您只需要在虛擬機上設置一個運行 Docker 守護進程。
Docker 容器的主要優(yōu)點是它們是獨立的包。它們將應用程序的環(huán)境與其運行的機器分離。您不再需要關心主機上存在什么庫或 Python 版本,因為 Dockerfile 使您的依賴關系明確。如果它可以在您自己的機器上運行,那么它也可以在任何相同CPU架構上的機器運行。Docker 不完全是基礎設施即代碼,但 Dockerfiles 確實允許您將應用程序運行時定義為 git 存儲庫中的一個簡單文件。
Docker 容器的另一個好處是它們是分布式應用程序包,專為不可變基礎架構的世界而設計。換句話說,它們被設計成無狀態(tài)的。容器本質上是短暫的。如果他們死了并重新啟動也沒關系。
什么時候不需要使用 kubernetes
當滿足以下四個條件時,您不需要 Kubernetes:
- 將極少數容器部署到極少數機器(主機),換句話說你的用戶數量有限。
- 容器和機器的數量是靜態(tài)的,不會經常出現擴容或者縮容。
- 您的容器和機器不會經常出現故障。
- 您不需要持久存儲、負載均衡、配置管理、服務發(fā)現、自動修復、自動縮放等其他功能?;蛘吣_實需要這些功能,但您的要求非常有限并且不介意供應商鎖定。
換句話說,如果您有簡單的要求,那么有一個更簡單的 Kubernetes 替代方案。您可以將容器直接部署到運行在幾個虛擬機上的 Docker 守護進程。
復雜的需求就需要復雜的解決方案
當您擁有的業(yè)務正在快速成長,用戶量激增,那么您可能確實需要 Kubernetes:
- 您的應用需要處理可變的用戶負載量
- 您需要使用計算之外的其他云服務 - 例如,持久存儲、負載均衡器、配置管理等。
- 節(jié)點過多,經常出錯,您的應用需要自動恢復能力
- 您希望以一致的方式管理多個應用程序和系統(tǒng)
- 您有上百個團隊在相同的環(huán)境中工作或使用彼此的微服務
- 其它復雜場景
對于上述要求,您需要引入容器基礎設施,這意味著為大規(guī)模、動態(tài)地部署 Docker 容器并將它們相互連接以及與其他云服務(如存儲)進行優(yōu)化的基礎設施。
該基礎設施最流行的形式是 Kubernetes。如果這些是您的要求,為什么不運行 Kubernetes?當然它很復雜,但是滿足這些要求的每個解決方案都將具有相似的復雜性。
至少對于 Kubernetes,復雜性是開源的,并且以聲明式 Kubernetes API 的形式標準化。這優(yōu)于其他公共云或內部解決方案。
沒有 Kubernetes 和 Docker 的企業(yè)基礎架構
這是仇恨者的典型主張:
Kubernetes 和 Docker 是不必要的,因為自動縮放很容易,systemd 可以自我修復,云提供商有用于持久卷的 API,備份應該用主機上的 cronjobs 完成,秘密用 MyFavoriteSecretVault 完成,Consul 做配置管理,服務發(fā)現是 DNS ,健康檢查不是必需的,Reddit 上的一個家伙在他的上一家公司寫了一個 3000 行的 Perl 腳本用于滾動更新,因此顯然 Kubernetes 是不必要的。
對于這些人,我只能說祝你好運。此外,您重新發(fā)明了 Kubernetes。
讓初學者更容易使用 Kubernetes
Kubernetes 的最大缺點是它預先加載了很多復雜性,但是復雜性是合理的,這就導致又很多東西需要預先學習。