使用Puppet管理Kubernetes配置

HassanTJHM 9年前

来自: http://dockone.io/article/1019



Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用。通过新的Puppet模块,可以用类Puppet语言为Kubernetes管理Pods、RC、Services等。

Kubernetes入门

KubeCon大会上演示了Kubernetes取得的成果,它是Google开源的Linux容器集群管理工具,为企业管理其内部基础设施而生。Kubernetes旨在通过引入一系列核心基本要素和API来简化对复杂分布式系统的管理。诸如eBay、SoundCloud和RedHat等公司都在他们构建应用、系统和基础设施时采纳这种新的方式。

现在通过新的Kubernetes的Puppet模块,我们现在可以使用Puppet来管理Kubernetes的资源,诸如RCs、Pods和Services这些概念。

配置管理:旁白

当谈论到Puppet和Kubernetes时,可以将之简化为更高层次的话题——配置管理。有些人把配置管理(像Puppet这样的工具)当作管理“host密集”型资源的一种方式,(这里说的host密集型资源指文件、服务、包、用户和用户组)。Kubernetes抽象出高层次的基本要素,如Pods和RCs,旨在简化对分布式可伸缩系统的管理。得益于这些新的基本要素,也许我们就不再需要配置管理了。

但是配置管理真的是一个非常广泛的学科,可以追溯到二十世纪五十年代。我最喜欢的对配置管理系统能力的描述是来自于Military Handbook配置管理指南MIL-HDBK-61B,其描述是:
  • 身份识别
  • 控制
  • 状态统计
  • 校验和审计


与这些功能相关的问题在系统中是普遍存在的,在Kubernetes中同样存在,并且目前只有部分能通过原生工具来解决———像管理配置漂移问题、使用一个单独的、拥有良好精度的变更控制机制和在基础设施中存在Kubernetes之外的模型等问题。这也变得更加重要,正如在多种多样的生产环境中部署一样,会有很多技术是相互支撑的。

使用Puppet管理Kubernetes

新的Kubernetes的Puppet模块允许你使用Puppet的特定领域语言来管理Kubernetes的资源 - 即RCs、Services和Pods实例。这意味着:
  • 这将会更加快速便捷的管理Kubernetes资源的状态,使用的源代码可以和应用代码一起用版本标记。
  • 通过利用Puppet的内置报告和像PuppetDB这样的工具可以非常容易获得Kubernetes集群的真实状态。
  • 如果你已经使用Puppet,那么Kubernetes的Puppet模块会提供便捷的方式来管理Kubernetes和你的其他基础设施。


这个模块还没有安装或是管理组成Kubernetes的各个组件,尽管这个领域已经有非常好的平台可以提供服务,像OpenShift、来自CoreOS的Tectonic或是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的部分基础设施上跨节点执行命令。


原文链接:Managing Kubernetes Configuration with Puppet(翻译:张仪)