我从文档中了解到:

kubectl创建 在集群中创建一个新的k8s资源 kubectl取代 更新活动集群中的资源 kubectl应用 如果我想创建+替换(参考)

我的问题是

为什么在集群中执行相同的任务有三种操作? 这些操作的用例是什么? 它们在本质上有什么不同?


当前回答

这是两种不同的方法:

必要的管理

kubectl create就是我们所说的命令式管理。在这种方法中,你告诉Kubernetes API你想要创建、替换或删除什么,而不是你想要你的K8s集群世界是什么样子。

声明式管理

kubectl apply是声明式管理方法的一部分,在这种方法中,即使对对象应用了其他更改,也会“维护”对活动对象应用的更改(即通过缩放)。

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

在外行他们做不同的事情。如果资源存在,kubectl create会出错,而kubectl apply不会出错。

其他回答

我们喜欢Kubernetes是因为一旦我们给了他们我们想要的东西,它就会在没有我们参与的情况下找到实现它的方法。

“创造”就像扮演上帝,把事情掌握在自己手中。当您只想使用POD而不关心Deployment/Replication Controller时,它很适合用于本地调试。

“apply”是按规则行事。“apply”就像一个主工具,可以帮助您创建和修改,并且不需要您管理pod。

这是两种不同的方法:

必要的管理

kubectl create就是我们所说的命令式管理。在这种方法中,你告诉Kubernetes API你想要创建、替换或删除什么,而不是你想要你的K8s集群世界是什么样子。

声明式管理

kubectl apply是声明式管理方法的一部分,在这种方法中,即使对对象应用了其他更改,也会“维护”对活动对象应用的更改(即通过缩放)。

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

在外行他们做不同的事情。如果资源存在,kubectl create会出错,而kubectl apply不会出错。

Kubectl创建可以一次使用一个对象配置文件。这也被称为命令式管理

Kubectl create -f filename|url

Kubectl应用程序与包含对象配置yaml文件的目录及其子目录一起工作。这也称为声明式管理。可以从目录中提取多个对象配置文件。 Kubectl应用-f directory/

细节: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/ https://kubernetes.io/docs/tasks/manage-kubernetes-objects/imperative-config/

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

在CI脚本中运行时,如果资源已经存在,则创建会引发错误,因此使用命令式命令会遇到麻烦。

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

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

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

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