Kubernetes 对象管理

kubectl 命令行工具支持多种不同的方式来创建和管理 Kubernetes 对象。本文档概述了这些不同的方法。有关通过 Kubectl 管理对象的详细信息,请阅读 Kubectl 书籍

管理技术

管理技术操作对象推荐环境支持的编写者学习曲线
命令式命令实时对象开发项目1+最低
命令式对象配置单个文件生产项目1中等
声明式对象配置文件目录生产项目1+最高

命令式命令

使用命令式命令时,用户直接在集群中操作实时对象。用户通过参数或 Flag 向 kubectl 命令提供操作。

这是入门或在集群中运行一次性任务的推荐方式。因为此技术直接操作实时对象,它不提供以前配置的历史记录。

示例

通过创建一个 Deployment 对象来运行一个 nginx 容器实例

kubectl create deployment nginx --image nginx

利弊权衡

相较于对象配置的优点

  • 命令以单个动作词表示。
  • 命令只需要一步即可更改集群。

相较于对象配置的缺点

  • 命令无法与变更评审流程集成。
  • 命令不提供与变更关联的审计日志。
  • 命令不提供除了实时状态之外的记录来源。
  • 命令不提供创建新对象的模板。

命令式对象配置

在命令式对象配置中,kubectl 命令指定操作(例如 create、replace),可选的 Flag 和至少一个文件名。指定的文件必须包含用 YAML 或 JSON 格式表示的对象完整定义。

有关对象定义的更多详细信息,请参见API 参考

示例

创建配置文件中定义的对象

kubectl create -f nginx.yaml

删除两个配置文件中定义的对象

kubectl delete -f nginx.yaml -f redis.yaml

通过覆盖实时配置来更新配置文件中定义的对象

kubectl replace -f nginx.yaml

利弊权衡

相较于命令式命令的优点

  • 对象配置可以存储在源代码控制系统(例如 Git)中。
  • 对象配置可以与推送到仓库之前的变更评审和审计日志等流程集成。
  • 对象配置提供了创建新对象的模板。

相较于命令式命令的缺点

  • 对象配置需要对对象模式有基本了解。
  • 对象配置需要额外编写 YAML 文件。

相较于声明式对象配置的优点

  • 命令式对象配置的行为更简单、更容易理解。
  • 截至 Kubernetes 1.5 版本,命令式对象配置更成熟。

相较于声明式对象配置的缺点

  • 命令式对象配置最适合处理文件,而不是目录。
  • 对实时对象的更新必须反映在配置文件中,否则它们会在下次替换时丢失。

声明式对象配置

使用声明式对象配置时,用户操作本地存储的对象配置文件,但用户并不定义要对文件执行的操作。kubectl 会按对象自动检测创建、更新和删除操作。这使得处理目录成为可能,因为不同对象可能需要不同的操作。

示例

处理 configs 目录中的所有对象配置文件,并创建或修补(Patch)实时对象。你可以先使用 diff 查看将要进行的更改,然后执行 apply 操作

kubectl diff -f configs/
kubectl apply -f configs/

递归处理目录

kubectl diff -R -f configs/
kubectl apply -R -f configs/

利弊权衡

相较于命令式对象配置的优点

  • 直接对实时对象进行的更改会保留,即使它们没有合并回配置文件中。
  • 声明式对象配置更好地支持操作目录,并按对象自动检测操作类型(创建、修补、删除)。

相较于命令式对象配置的缺点

  • 当结果出乎意料时,声明式对象配置更难调试和理解。
  • 使用 diff 进行局部更新会创建复杂的合并和修补操作。

接下来

最后修改于 2022 年 1 月 8 日太平洋标准时间下午 6:09:重组“使用 Kubernetes 对象”章节 (634c17f61c)