使用Puppet管理Kubernetes配置
來自: http://dockone.io/article/1019
Kubernetes是來自谷歌的集群管理(工具),它使容器在一個非常大的基礎設施的部署、管理和擴容變得非常簡單。通過新的Puppet模塊,可以用類Puppet語言為Kubernetes管理Pods,RCs,Services等。
Kubernetes入門
最近的KubeCon大會演示了在很短一段時間內Kubernetes取得的迅速發展,它是Google開源的Linux容器集群管理工具,為企業如何管理其內部基礎設施而構建。Kubernetes旨在通過引入一系列核心基本要素和API來簡化對復雜分布式系統的管理。諸如eBay, SoundCloud和RedHat等許多公司都在討論在他們構建應用,系統和基礎設施時采納這種新的方式。
對Puppet而言,常對管理新的事物感興趣,像對Kubernetes著力于促使集成它精心設計的基本要素和穩健的API。通過新的Kubernetes的Puppet模塊,我們現在可以使用Puppet來管理Kubernetes的資源諸如RCs,Pods和Services這些概念。
配置管理:旁白
當談論到Puppet和Kubernetes時,有效地簡化為更高層次的話題:配置管理。有些人把配置管理(像Puppet這樣的工具)當作管理“host密集”型資源的一種方式,(這里說的host密集型資源指文件,服務,包,用戶和用戶組)。Kubernetes抽象出高層次的基本要素,如Pods和RCs,旨在簡化分布式可伸縮的系統的管理。本文闡述有了這些新的基本要素便不再需要配置管理。
但是配置管理真的是一個非常廣泛的學科,可以追溯到二十世紀五十年代。我最喜歡的對配置管理系統能力的描述來自于Military Handbook配置管理指南MIL-HDBK-61B,中所描述的:
- 身份識別
- 控制
- 狀態統計
- 校驗和審計
與這些功能相關的問題像Kubernetes系統一樣存在,并且目前只有部分通過原生工具來解決 - 像管理配置漂移的問題,通過使用單獨的良好精度的變更控制機制,和在基礎設施中存在Kubernetes之外的模型等。這也變得更加重要正如在多種多樣的生產環境中部署一樣,存在很多技術相互支撐。
使用Puppet管理Kubernetes
新的Kubernets的Puppet模塊允許你使用Puppet的特定領域語言來管理Kubernetes的資源 - 即RCs,Services和Pods實例。這意味著:
- 這將會更加快速便捷的管理Kubernetes資源的狀態,使用的源代碼可以和應用代碼一起用版本標記。
- 通過利用Puppet的內置報告和像PuppetDB這樣的工具可以非常容易獲得Kubernetes集群的真實狀態。
- 如果你已經使用Puppet,那么Kubernetes的Puppet模塊會提供便捷的方式來管理Kubernetes和你的其他基礎設施。
這個模塊還沒有安裝或是管理組成Kubernetes的各個組件,盡管這個領域已經有非常好的平臺可以提供服務,像OpenShift,Tectonic來自CoreOS或是GCE。
這個模塊允許在Puppet中定義Kubernetes的資源,然后根據需求在一段時間內使用Puppet來創建和更新這些資源。
Puppet代碼的用戶接口便是仿照Kubernetes的YAML格式。這個接口讓用過Kubernetes API的人同樣覺得熟悉,并且同時在Puppet中提供低層構建模塊來創建高層類型。
kubernetes_pod { 'sample-pod':
ensure => present,
metadata => {
namespace => 'default',
},
spec => {
containers => [{
name => 'container-name',
image => 'nginx',
}]
},
}
模塊現在支持以下類型:
* kubernetes_pod
* kubernetes_service
* kubernetes_replication_controller
* kubernetes_node
* kubernetes_event
* kubernetes_endpoint
* kubernetes_namespace
* kubernetes_secret
* kubernetes_resource_quota
* kubernetes_limit_range
* kubernetes_peristent_volume
* kubernetes_persistent_volume_claim
* kubernetes_component_status
* kubernetes_service_account
并非所有這些都能通過API來創建,但是所有均可用于查詢Puppet資源的權利。例如,如果你想知道當前節點是否在Kubernetes集群中,你可以運行:
$ puppet resource kubernetes_node
Puppet資源也可被用來導出正在運行的集群的狀態到一個Puppet清單文件,它可以用作在一段時間內維持集群狀態的基礎。
為什么是Puppet
使用Puppet管理Kubernetes在以下幾個方面超過了基礎的YAML文件:
* Puppet語言支持邏輯和抽象,允許自己定義業務特定的用戶接口。你可以創建高層的types,然后實例化多個副本。
* Puppet的代碼可以被修改,然后Puppet會處理更新相關的資源。你不必描述資源的完整狀態,或通過命令行界面(CLI)手動修改個人資源。
* Puppet有工具驗證代碼和編寫單元測試,以及分發和共享可重用的模塊。
* Puppet支持資源之間存在關系,所以你可以在必要時執行命令。通過新的應用的編排能力,你甚至可以在并沒有使用Kubernetes的部分基礎設施跨節點執行命令。
例子和反饋
在第二篇博文中,我們將展示一個完整的實踐例子,把權威的Kubernetes使用手冊中的的 Hello World例子向Puppet轉變。
讓我們知道你對模塊的想法,告訴我們你想要看到哪些其他的類似的結合或例子。
更多拓展
* Want to manage Kubernetes with Puppet? There's a module for that.
* The Kubernetes Guestbook Example in Puppet
* Building your Own Abstractions for Kubernetes in Puppet
</div>