我从文档中了解到:
kubectl创建 在集群中创建一个新的k8s资源 kubectl取代 更新活动集群中的资源 kubectl应用 如果我想创建+替换(参考)
我的问题是
为什么在集群中执行相同的任务有三种操作? 这些操作的用例是什么? 它们在本质上有什么不同?
我从文档中了解到:
kubectl创建 在集群中创建一个新的k8s资源 kubectl取代 更新活动集群中的资源 kubectl应用 如果我想创建+替换(参考)
我的问题是
为什么在集群中执行相同的任务有三种操作? 这些操作的用例是什么? 它们在本质上有什么不同?
当前回答
这是两种不同的方法:
必要的管理
kubectl create就是我们所说的命令式管理。在这种方法中,你告诉Kubernetes API你想要创建、替换或删除什么,而不是你想要你的K8s集群世界是什么样子。
声明式管理
kubectl apply是声明式管理方法的一部分,在这种方法中,即使对对象应用了其他更改,也会“维护”对活动对象应用的更改(即通过缩放)。
您可以在Kubernetes对象管理文档中阅读更多关于命令式和声明式管理的内容。
在外行他们做不同的事情。如果资源存在,kubectl create会出错,而kubectl apply不会出错。
其他回答
对于初学者来说,这是理解命令式模式和声明式模式之间区别的最好方法之一。
参考:https://www.digitalocean.com/community/tutorials/imperative-vs-declarative-kubernetes-management-a-digitalocean-comic
EDIT
有错误的例子中提到的图像。请参考评论以便更好地理解。
你也可以参考下面的例子。
必要的:
拿一个平底锅。 打开炉子。 锅中加入水、糖、咖啡粉、牛奶 等到咖啡准备好 用杯子盛咖啡。
声明:
告诉服务员你要一杯咖啡。他给你端咖啡。
从K8s的角度来看:
命令式:你必须自己管理不同的资源,如pod、服务、副本集等。
声明性:K8将负责所有的资源,所有您需要指定的是您的实际需求。
这些是命令式命令:
Kubectl run = Kubectl create deployment
优点:
简单、易学、易记。 只需要一个步骤就可以对集群进行更改。
缺点:
不要与变更评审过程集成。 不要提供与变更相关的审计跟踪。 除了实时的记录,不要提供其他记录来源。 不要为创建新对象提供模板。
这些是命令式对象配置:
Kubectl create -f your-object-config.yaml
Kubectl delete -f your-object-config.yaml
Kubectl替换-f your-object-config.yaml
与命令式命令相比的优点:
可以存储在源代码控制系统中,比如Git。 可以与流程集成,例如在推送之前检查更改和审计跟踪。 提供用于创建新对象的模板。
与命令式命令相比的缺点:
要求对对象模式有基本的了解。 需要编写YAML文件的额外步骤。
与声明式对象配置相比的优势:
更简单,更容易理解。 Kubernetes 1.5版本之后更加成熟。
与声明式对象配置相比的缺点:
在文件上工作最好,而不是目录上。 对活动对象的更新必须反映在配置文件中,否则它们将在下一次替换期间丢失。
这些是声明性的对象配置
Kubectl diff -f configs/
Kubectl应用-f configs/
与命令式对象配置相比的优点:
直接对活动对象所做的更改将被保留,即使它们没有合并回配置文件中。 更好地支持对目录进行操作,并自动检测每个对象的操作类型(创建、修补、删除)。
与命令式对象配置相比的缺点:
当结果出乎意料时,更难调试和理解。 使用差异的部分更新会创建复杂的合并和补丁操作。
我们喜欢Kubernetes是因为一旦我们给了他们我们想要的东西,它就会在没有我们参与的情况下找到实现它的方法。
“创造”就像扮演上帝,把事情掌握在自己手中。当您只想使用POD而不关心Deployment/Replication Controller时,它很适合用于本地调试。
“apply”是按规则行事。“apply”就像一个主工具,可以帮助您创建和修改,并且不需要您管理pod。
下面来自官方文档的解释帮助我理解kubectl apply。
此命令将比较您正在推送的配置版本与以前的版本,并应用您所做的更改,而不会覆盖对未指定属性的任何自动更改。
另一方面,Kubectl创建将创建(应该是不存在的)资源。
┌─────────┬───────────────────────┬────────────────────────┐
│ command │ object does not exist │ object already exists │
├─────────┼───────────────────────┼────────────────────────┤
│ create │ create new object │ ERROR │
│ │ │ │
│ apply │ create new object │ configure object │
│ │ (needs complete spec) │ (accepts partial spec) │
│ │ │ │
│ replace │ ERROR │ delete object │
│ │ │ create new object │
└─────────┴───────────────────────┴────────────────────────┘