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

使用 Puppet 管理 Kubernetes Pod、服务和复制控制器

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

Puppet Kubernetes 模块

Puppet Kubernetes 模块目前假设您已经有一个 正在运行的 Kubernetes 集群;它的重点是管理 Kubernetes 中的资源,如 Pod、复制控制器和服务,而不是(目前)管理底层的 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 有多种资源,从 Pod 和服务到复制控制器和服务帐户。您可以在 Puppet 中的 Kubernetes 留言簿示例帖子中看到该模块管理这些资源的示例。这演示了如何将规范的 hello-world 示例转换为使用 Puppet 代码。

然而,使用 Puppet 的主要优势之一是,您可以为 Kubernetes 管理的应用程序创建自己的更高级别和更具业务特定性的接口。例如,对于留言簿,您可以创建如下内容:

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 的优点是:

  • 能够创建您自己的抽象,以减少重复并创建更高级别的用户界面,如上面的留言簿示例。
  • 使用 Puppet 的开发工具来验证代码和编写单元测试。
  • 与 Puppet Server 等其他工具集成,以确保您的代码模型与集群状态匹配,并与 PuppetDB 集成以存储报告和跟踪更改。
  • 能够针对 Kubernetes API 重复运行相同的代码,以检测任何更改或修复配置漂移。

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

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