Kubectl适用于kubectl创建吗?

时间:2017-11-18 18:05:32

标签: kubernetes kubectl

我在文档中理解的是 kubectl apply = kubectl create + kubectl replace Reference

我的理解是,如果我想在群集中创建新的k8s资源,我应该使用 kubectl create 操作。现在,如果我想更新现场k8s资源中的内容,我应该使用 kubectl replace 操作。

如果我想同时执行这两项操作(创建新的k8s资源以及更新实时k8s资源),那么我应该使用 kubectl apply 操作

我的问题为什么在群集中执行相同任务有三个操作?这些操作的用例是什么?他们如何在引擎盖下相互区别?

目前我正在使用 kubectl create 操作在群集中创建新资源。 谢谢

9 个答案:

答案 0 :(得分:187)

这是两种不同的方法。 kubectl create就是我们所说的Imperative Management。在这种方法中,您可以告诉Kubernetes API您要创建,替换或删除的内容,而不是您希望K8s群集世界的样子。

kubectl applyDeclarative Management方法的一部分,即使您scale其他方式,也可以保留您应用于实时对象的更改(即通过apply)改变了对象。

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

答案 1 :(得分:20)

答案 2 :(得分:14)

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

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

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

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

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

答案 3 :(得分:6)

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

apply-进行增量更改
create-覆盖所有更改


DigitalOcean article(由Kubernetes网站链接)获得

  

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

答案 4 :(得分:3)

这些是命令命令

kubectl run = kubectl create deployment

优势:

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

缺点:

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

这些是命令对象配置

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/

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

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

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

  • 在意外情况下调试并理解结果。
  • 使用差异进行部分更新会创建复杂的合并和补丁操作。

答案 5 :(得分:1)

┌─────────┬───────────────────────┬────────────────────────┐
│ 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      │
└─────────┴───────────────────────┴────────────────────────┘

答案 6 :(得分:0)

以下official documentation的解释帮助我理解了kubectl apply

  

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

另一方面,

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

答案 7 :(得分:0)

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/

答案 8 :(得分:0)

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

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

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