本文发布时间超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已不再准确。

使用 Puppet 管理 Kubernetes Pods, Services 和 Replication Controllers

熟悉 Puppet 的人可能已经使用它来管理主机上的文件、软件包和用户。但 Puppet 首先是一款配置管理工具,而配置管理是一个比仅仅管理主机级资源更广泛的学科。配置管理的一个良好定义是,它旨在解决四个相关问题:识别、控制、状态记账以及验证和审计。这些问题存在于任何复杂系统的运行中,而通过新的 Puppet Kubernetes 模块,我们开始研究如何为 Kubernetes 解决这些问题。

Puppet Kubernetes 模块

Puppet Kubernetes 模块目前假定您已经有一个 Kubernetes 集群正在运行;它的重点是管理 Kubernetes 中的资源,如 Pods、Replication Controllers 和 Services,而不是(目前)管理底层的 kubelet 或 etcd 服务。以下是一段用 Puppet DSL 描述 Pod 的快速代码片段。

kubernetes_pod { 'sample-pod':
  ensure => present,
  metadata => {
    namespace => 'default',
  },
  spec => {
    containers => [{
      name => 'container-name',
      image => 'nginx',
    }]
  },

}

如果您熟悉 YAML 文件格式,您可能会立即认出其结构。该接口故意设计得与 YAML 相同,以便于不同格式之间的转换——事实上,支持此功能的代码是根据 Kubernetes API Swagger 定义自动生成的。运行上述代码,假设我们将其保存为 pod.pp,就像这样简单:

puppet apply pod.pp

认证使用标准的 kubectl 配置文件。您可以在模块的 README 中找到完整的安装说明

Kubernetes 有多种资源,从 Pods 和 Services 到 Replication Controllers 和 Service Accounts。您可以在Puppet 中的 Kubernetes guestbook 示例文章中看到该模块管理这些资源的示例。这演示了将典型的 hello-world 示例转换为使用 Puppet 代码。

然而,使用 Puppet 的主要优势之一是,您可以创建自己的更高级、更具业务特性的接口来管理 Kubernetes 上的应用。例如,对于 guestbook,您可以创建如下所示的内容:

guestbook { 'myguestbook':
  redis_slave_replicas => 2,
  frontend_replicas => 3,
  redis_master_image => 'redis',
  redis_slave_image => 'gcr.io/google_samples/gb-redisslave:v1',
  frontend_image => 'gcr.io/google_samples/gb-frontend:v3',     
}

您可以在 Puppet 博客文章“在 Puppet 中为 Kubernetes 构建自己的抽象”中阅读更多关于使用 Puppet 定义类型的内容,并查看更多代码示例。

结论

使用 Puppet 而不仅仅是标准的 YAML 文件和 kubectl 的优势在于:

  • 能够创建自己的抽象,减少重复,构建更高级的用户界面,就像上面的 guestbook 示例一样。 
  • 使用 Puppet 的开发工具进行代码验证和编写单元测试。 
  • 与 Puppet Server 等其他工具集成,确保代码中的模型与集群状态一致;与 PuppetDB 集成,用于存储报告和跟踪更改。
  • 能够反复针对 Kubernetes API 运行相同的代码,以检测任何更改或修复配置漂移。 

另外值得注意的是,大多数大型组织的环境非常异构,运行着各种各样的软件和操作系统。拥有一个统一这些离散系统的工具链,可以使采纳 Kubernetes 等新技术变得容易得多。

可以肯定地说,Kubernetes 为构建云原生系统提供了一套出色的原语。而通过 Puppet,您可以解决在生产环境中运行任何复杂系统所带来的一些运维和配置管理问题。如果您试用该模块,请告诉我们您的想法,以及您希望未来支持哪些其他功能。