本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
使用 Puppet 管理 Kubernetes Pod、Service 和 Replication Controller
熟悉 Puppet 的人可能用它来管理主机上的文件、软件包和用户。但 Puppet 首先是一种配置管理工具,配置管理是一个比仅仅管理主机级资源更广泛的领域。配置管理的一个很好的定义是,它旨在解决四个相关问题:识别、控制、状态核算以及验证和审计。这些问题存在于任何复杂系统的操作中,通过新的 Puppet Kubernetes 模块,我们开始研究如何为 Kubernetes 解决这些问题。
Puppet Kubernetes 模块
Puppet Kubernetes 模块目前假定您已经有一个 Kubernetes 集群 正在运行;它的重点是管理 Kubernetes 中的资源,如 Pod、Replication Controller 和 Service,而不是(尚未)管理底层的 kubelet 或 etcd 服务。以下是 Puppet DSL 中描述 Pod 的一段简短代码片段。
kubernetes_pod { 'sample-pod':
ensure => present,
metadata => {
namespace => 'default',
},
spec => {
containers => [{
name => 'container-name',
image => 'nginx',
}]
},
}
如果您熟悉 YAML 文件格式,您可能会立即识别出其结构。为了便于不同格式之间的转换,该接口特意设计成相同的——事实上,驱动此功能的代码是从 Kubernetes API Swagger 定义自动生成的。运行上述代码(假设我们将其保存为 pod.pp)就像以下这样简单:
puppet apply pod.pp
身份验证使用标准的 kubectl 配置文件。您可以在模块的 README 中找到完整的安装说明。
Kubernetes 有多种资源,从 Pod 和 Service 到 Replication Controller 和 Service Account。您可以在 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,您可以解决在生产环境中运行任何复杂系统所带来的一些操作和配置管理问题。如果您尝试了该模块,请告诉我们您的想法,以及您未来希望看到支持哪些其他功能。