我在文档中理解的是 kubectl apply = kubectl create + kubectl replace 。 Reference
我的理解是,如果我想在群集中创建新的k8s资源,我应该使用 kubectl create 操作。现在,如果我想更新现场k8s资源中的内容,我应该使用 kubectl replace 操作。
如果我想同时执行这两项操作(创建新的k8s资源以及更新实时k8s资源),那么我应该使用 kubectl apply 操作
我的问题为什么在群集中执行相同任务有三个操作?这些操作的用例是什么?他们如何在引擎盖下相互区别?
目前我正在使用 kubectl create 操作在群集中创建新资源。 谢谢
答案 0 :(得分:187)
这是两种不同的方法。 kubectl create
就是我们所说的Imperative Management。在这种方法中,您可以告诉Kubernetes API您要创建,替换或删除的内容,而不是您希望K8s群集世界的样子。
kubectl apply
是Declarative 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
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部署/复制控制器时,这对于本地调试很有用。
“应用”正在按规则进行。 “应用”就像是一个主工具,可以帮助您创建和修改,不需要任何东西来管理容器。