kubectl申请vs kubectl创建?


266

我从文档中了解到的是:

  • kubectl create =在集群中创建新的k8s资源
  • kubectl replace =更新活动集群中的资源
  • kubectl apply =如果我想创建+替换(参考

我的问题是

  1. 为什么在集群中要执行三个操作才能执行同一任务?
  2. 这些操作的用例是什么?
  3. 它们在引擎盖下有何不同?

Answers:


315

这是两种不同的方法:

当务之急

kubectl create这就是我们所谓的命令式管理。通过这种方法,您可以告诉Kubernetes API您要创建,替换或删除的内容,而不是您希望K8s群集世界的外观。

声明式管理

kubectl apply“声明式管理”方法的一部分,在该方法中,即使您对该对象进行了其他更改,也可能scale保留 ”了您对活动对象(即通过)应用的apply更改。

您可以在Kubernetes对象管理文档中阅读有关命令式和声明式管理的更多信息。


24
那么生产中将使用哪一个呢?
Yogesh Jilhawar

11
@YogeshJilhawar都是在生产中工作的有效方法。
吉瓦尔

2
所以从本质上讲,就像整个对象修改还是部分补丁一样?
Ryall

12
这个答案并没有证实是否这两个操作kubectl create,并kubectl apply具有相同的作用或没有。
纳瓦兹

61
@Nawaz-他们做不同的事情。 kubectl create如果资源已经存在,将抛出错误。 kubectl apply惯于。区别在于,kubectl create专门说“创建此东西”,而kubectl apply说“做任何必要的事情(创建,更新等)使其看起来像这样”。
拉玛先生

44

在CI脚本中运行时,命令性命令会遇到麻烦,因为如果资源已经存在,create会引发错误。

您可以做的是通过使用和选项,应用(声明式)命令式命令的输出:--dry-run=true-o yaml

kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -

如果资源已经存在,则上面的命令不会引发错误(并且将在需要时更新资源)。

在某些无法使用声明性模式的情况下(例如,在创建docker-registry机密时),这非常有用。


或者,使用--ignore-not-found标志在创建资源之前将其删除。这不会引发AlreadyExists错误。例如:kubectl delete deployment nginx --ignore-not-found; kubectl create deployment nginx --image=nginx
Noam Manos

33

根据我的理解,只是给出一个更直接的答案:

apply-对现有对象进行增量更改
create-创建一个全新的对象(以前不存在/已删除),


这是从Kubernetes网站链接的DigitalOcean文章中获取的:

我们在此处使用Apply而不是create,以便将来我们可以将更改增量应用到Ingress Controller对象,而不是完全覆盖它们。


是吗?例如当我们使用docker-compose:+使用applylike docker-compose up -d+使用createlike docker-compose up -d --build
Whoiskp

8

这些是命令性命令

kubectl run = kubectl create deployment

优点:

  • 简单,易学且易于记忆。
  • 仅需一步即可对集群进行更改。

缺点:

  • 不要与变更审核流程集成。
  • 不要提供与更改关联的审核跟踪。
  • 除了现场直播外,不要提供记录来源。
  • 不提供用于创建新对象的模板。

这些是命令对象config

kubectl create -f your-object-config.yaml

kubectl delete -f your-object-config.yaml

kubectl replace -f your-object-config.yaml

与命令式命令相比的优势:

  • 可以存储在源控制系统中,例如Git。
  • 可以与流程集成,例如在推送和审计跟踪之前检查更改。
  • 提供用于创建新对象的模板。

与命令式命令相比的缺点:

  • 需要基本了解对象架构。
  • 需要额外的编写YAML文件的步骤。

与声明性对象配置相比的优势:

  • 更简单易懂。
  • Kubernetes 1.5版之后更加成熟。

与声明性对象配置相比的缺点:

  • 在文件而非目录上效果最佳。
  • 对活动对象的更新必须反映在配置文件中,否则在下一次替换期间将丢失。

这些是声明性对象配置

kubectl diff -f configs/

kubectl apply -f configs/

与命令式对象配置相比的优势:

  • 即使未将它们重新合并到配置文件中,也将保留直接对活动对象所做的更改。
  • 更好地支持对目录进行操作并自动检测每个对象的操作类型(创建,修补,删除)。

与命令式对象配置相比的缺点:

  • 当结果出乎意料时,更难调试和理解结果。
  • 使用差异的部分更新会创建复杂的合并和补丁操作。

3

官方文档中的以下说明帮助我理解了kubectl apply

此命令会将您要推送的配置版本与先前版本进行比较,并应用所做的更改,而不会覆盖未指定属性的任何自动更改。

kubectl create 另一方面将创建(应该是不存在的)资源。


1

kubectl create一次可以使用一个对象配置文件。这也称为命令式管理

kubectl创建-f文件名| URL

kubectl apply适用于包含对象配置yaml文件的目录及其子目录。这也称为声明式管理。可以从目录中拾取多个对象配置文件。 kubectl apply -f目录/

详细信息:
https : //kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/ https://kubernetes.io/docs/tasks/manage-kubernetes-objects/imperative-config/


0

我们之所以喜欢Kubernetes,是因为一旦我们给了他们他们想要的东西,它就会继续寻找如何在没有我们任何参与的情况下实现它。

“创造”就像通过把事情掌握在自己手中来玩神。当您只想使用POD而不关心abt部署/复制控制器时,这对于本地调试很有用。

“申请”正在按规则进行。“应用”就像是一个主工具,可以帮助您创建和修改,不需要任何东西来管理容器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.