使用Puppet管理Kubernetes配置

GeoRust 8年前

来自: 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