kubectl命令行工具支持多种创建和管理Kubernetes对象的方式。该文档提供这些方式的概述。 阅读Kubectl book来查看kubectl管理对象的详细内容。
管理技术
提示:一个Kubernetes对象应只被一个技术管理。混合技术管理同一对象会导致未知行为.
管理技术 | 操作对象 | 推荐环境 | 支持的写入者 | 学习曲线 |
---|---|---|---|---|
强制命令 | 活跃对象 | 开发项目 | 1+ | 最低 |
强制对象配置 | 独立的文件 | 产品项目 | 1 | 中等 |
声明式对象配置 | 文件目录 | 产品项目 | 1+ | 最高 |
强制命令
当使用强制命令时,用户命令将直接作用于集群中的活跃对象。用户提供参数或标志给kubectl命令来进行操作。
这是在集群上进行一次任务的最简单方法。由于这是直接作用于活跃对象的最直接操作,所以并不提供技术历史。
例子
创建一个部署对象来运行一个nginx容器实例:
kubectl run nginx --image nginx
另一种实现语句:
kubectl create deployment nginx --image nginx
对比
比起对象配置的优点:
- 命令简单易学易记。
- 命令只需一步就可以对集群做出改变。
比起对象配置的缺点:
- 命令不经过变更的审查流程
- 命令不提供变更的审计跟踪
- 命令不提供资源记录
- 命令不提供创建新对象的模板
强制对象配置
在强制对象配置中,kubectl命令指定了操作(创建、替换等)、非必填的标志和至少一个文件名。指定文件必须包含一个YAML或JSON格式的完整对象定义。
阅读API reference 来查看对象定义的细节。
警告:强制replace命令使用新的规格(spec )来替换现有的,抛弃所有配置文件中所没有的对象变更。这种方法不应该用于有更新独立于配置文件之外的资源类型。例如LoadBalancer类型的服务,externalIPs字段独立于集群的配置来更新。
例子
使用配置文件定义来创建对象
kubectl create -f nginx.yaml
删除两个配置文件中定义的对象
kubectl delete -f nginx.yaml -f redis.yaml
通过修改配置文件来更新对象
kubectl replace -f nginx.yaml
对比
比起强制命令的优点:
- 可以在Git之类的资源控制系统中存储
- 可以和变更审计之类的过程集成
- 提供创建对象的模板
比起强制命令的缺点:
- 需要理解对象模式的基础
- 需要额外步骤编写YAML文件
比起声明式配置的优点:
- 简单易于理解
- Kubernetes 1.5版本之后更加成熟了
比起声明式配置的缺点:
- 对于文件效果更好,而非目录
- 更新活跃对象必须在配置文件体现,否则下次代替会丢失变更。
声明式对象配置
使用声明式对象配置时,用户的对象配置文件操作本地保存。但用户并不执行采用文件的操作。增删改操作由kubectl逐个对象地自动发现。这允许对目录进行操作,不同对象可能需要不同的操作。
注:声明式对象配置保留其他用户的变更,即使变更没有合并到对象配置文件。可以使用patch API操作来写看到的不同,而不用使用replace API操作来替代整个对象配置。
例子
处理configs目录中的所有对象配置文件,并创建或patch活跃对象。你可以先diff来看会做哪些变更,然后再应用:
kubectl diff -f configs/
kubectl apply -f configs/
递归处理目录:
kubectl diff -R -f configs/
kubectl apply -R -f configs/
对比
比起强制对象配置的优点:
- 直接作用于活跃对象的变更会保存,即使这些变更没有合并到配置文件
- 能更好地支持目录并自动发现每个对象的操作类型(增删改)
比起强制对象配置的缺点:
- 更难debug,更难理解意料外的结果
- 使用差异化更新导致复杂的合并和修补操作