我从文档中了解到:

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

我的问题是

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


当前回答

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

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

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

其他回答

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

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

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

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

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

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



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


EDIT

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

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

必要的:

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

声明:

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


从K8s的角度来看:

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

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

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

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

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

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/

这可以用简单的例子来总结:-

让我们创建一个简单的yaml来部署一个包含nginx图像的pod。

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    type: front-end
spec:
  containers:
    - name: nginx-container
      image: nginx

现在我们使用kubectl命令-创建一个pod

Kubectl创建-f pod.yaml

现在一个名为nginx的pod被创建了,你可以通过-获取运行的pod的信息

库贝特尔,把吊舱弄宽

和详细的查看豆荚由

kubectl描述pod nginx

现在如果我想在我的pod中做一些改变。Yaml文件是这样的-

pod.yaml

apiVersion: v1 
kind: Pod 
metadata:
  name: nginx
  labels:
    app: nginx
    tier: frontend
    title: frontend
spec:
  containers:
    - name: nginx
      image: nginx

现在试试命令

Kubectl创建-f pod.yaml

要应用pod.yaml中的更改。

它的输出是-

来自服务器的错误(AlreadyExists):创建pod时出错。Yaml ": pods "nginx"已经存在

但是有了命令-

Kubectl应用-f pod.yaml

输出为-

豆荚/ nginx配置

在第一个评论中,它非常详细地解释了create之类的命令式命令专注于分配给它们的任务,你不能给它们分配更多的任务来调整集群的世界,但apply之类的声明性命令旨在使其工作来调整集群的世界。