談及容器技術,毫不夸張地說,2017年是“Kubernetes的元年”。Kubernetes自2014年推出以來,一直保持穩步增長。
這要歸功于云原生應用的興起。準確來說,云原生更像是一種文化,更是一種潮流,它是云計算的一個必然導向。它的意義在于讓云成為云化戰略成功的基石,而不是阻礙,如果業務應用上云之后開發和運維人員比原先還痛苦,成本高企的話,這樣的云我們寧愿不不上。
其實在 Kubernetes 出現之前,就已經有人提出了云原生的概念,如 2010 年 Paul Fremantle 就在他的博客中提出了云原生的核心理念,但是還沒有切實的技術解決方案。而那時候 PaaS 才剛剛出現,PaaS 平臺提供商 Heroku 提出了 12 因素(基準代碼、依賴、配置、后端服務、發布、進程、端口綁定、并發、易處理、開發環境與線上環境等價、日志、管理進程)應用的理念,為構建 SaaS 應用提供了方法論,該理念在云原生時代依然適用。
Kubernetes 是一個相對較新的運行容器化負載的平臺,它解決了這些問題。它原本是 Google 內部的一個項目,Kubernetes 在 2015 年被捐贈給了云原生計算基金會,并吸引了來自世界各地開源社區的開發人員。 Kubernetes 的設計基于 Google 15 年的在生產和開發環境運維的經驗。由于它是開源的,任何人都可以下載并使用它,并實現其帶來的優勢。
云原生應用理念要求將環境配置存在應用運行的環境中,在K8s集群中,所有的環境配置都存在分布式共享存儲Etcd中。Kubernetes還有一些操作對象是用來專門存儲環境配置的。例如ConfigMap是存儲通用的配置變量的。ConfigMap有點兒像一個統一的配置文件,使用戶可以將分布式系統中用于不同模塊的環境變量統一到一個對象中管理;而它與配置文件的區別在于它是存在集群的“環境”中的,并且支持Kubernetes集群中所有通用的操作調用方式。
再比如Secret是專門用來存儲密鑰對象的,它使得在Kubernetes集群中用到密碼等私密信息時不必用明文環境變量來表示,從而加強密鑰傳遞和保存的安全性。
更重要的是,云原生應用理念要求盡量保證開發、測試和生產環境的配置一致,但是同時這幾個不同的環境又應該是彼此隔離。在Kubernetes集群中,不同的環境可以通過namespace進行隔離,保證彼此不互相干擾。
可以說,Kubernetes在像 OpenStack 這樣的基礎架構即服務(IaaS)和完整的平臺即服務 (PaaS)的資源之間達到了最佳平衡,它的底層運行時實現完全由供應商控制。Kubernetes 提供了兩個優勢:對管理基礎設施的抽象,以及深入裸機進行故障排除的工具和功能。