我从文档中了解到:

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

我的问题是

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


当前回答

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

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

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

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

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

其他回答

下面来自官方文档的解释帮助我理解kubectl apply。

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

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

以我的理解,给一个更直接的回答:

Apply -对现有对象进行增量更改 创建—创建一个全新的对象(以前不存在/已删除) 从Kubernetes网站上的一篇DigitalOcean文章中摘录如下:

我们在这里使用apply而不是create,以便将来我们可以增量地对Ingress Controller对象应用更改,而不是完全覆盖它们。

对于初学者来说,这是理解命令式模式和声明式模式之间区别的最好方法之一。



参考:https://www.digitalocean.com/community/tutorials/imperative-vs-declarative-kubernetes-management-a-digitalocean-comic


EDIT

有错误的例子中提到的图像。请参考评论以便更好地理解。

你也可以参考下面的例子。

必要的:

拿一个平底锅。 打开炉子。 锅中加入水、糖、咖啡粉、牛奶 等到咖啡准备好 用杯子盛咖啡。

声明:

告诉服务员你要一杯咖啡。他给你端咖啡。


从K8s的角度来看:

命令式:你必须自己管理不同的资源,如pod、服务、副本集等。

声明性:K8将负责所有的资源,所有您需要指定的是您的实际需求。

这个问题很深刻,也很好。下面是我对这个问题的思考:

K8s有三种资源管理方法

基于命令的对象管理:直接使用命令对kubernetes资源进行操作。例如: Kubectl运行nginx-pod——image=nginx:1.17.1——port=80 命令类型对象配置:通过命令配置和配置文件操作Kubernetes资源。例如: Kubectl create/patch -f nginx-pod.yaml 声明式对象配置:通过apply命令和配置文件操作kubernetes资源。例如: Kubectl应用-f nginx-pod.yaml

Type Operate Object Suitable for environment Advantage disadvantage
Command Based Object Management Object test env Simple Only active objects can be operated, but not audited or tracked
Command Type Object Configuration File develop evn Can be audited and tracked When the project is large, there are many configuration files and the operation is troublesome
Declarative Object Configuration Directory develop evn Support directory operations It is difficult to debug under unexpected circumstances

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/