14

我使用kubectl create -f pod.xmlkubectl apply -f pod.xml使用下面的 yaml 创建了一个 pod,但我没有看到任何区别,一个 pod 是使用这两个命令创建的。K8S文档中提到了命令式和声明式命令。但是,create 和 apply 的行为仍然相同。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

有什么不同?另外,kubectl apply声明性和kubectl create命令性如何?它们都采用一个或多个包含对象详细信息的 yaml 文件。

4

3 回答 3

25

kubectl createkubectl apply命令之间存在细微差别。

kubectl create命令创建一个新资源。因此,如果再次运行该命令,它将引发错误,因为资源名称在命名空间中应该是唯一的。

kubectl get pods
No resources found.

kubectl create -f pod.xml 
pod/myapp-pod created

kubectl create -f pod.xml 
Error from server (AlreadyExists): error when creating "pod.xml": pods "myapp-pod" already exists

2) 该kubectl apply命令将配置应用于资源。如果资源不存在,那么它将被创建。该kubectl apply命令可以第二次运行,因为它只是应用了如下所示的配置。在这种情况下,配置没有改变。所以,豆荚没有改变。

kubectl delete pod/myapp-pod
pod "myapp-pod" deleted

kubectl apply -f pod.xml 
pod/myapp-pod created

kubectl apply -f pod.xml 
pod/myapp-pod unchanged

在 中kubectl create,我们指定了某个动作,在这种情况下create,它是必要的。在kubectl apply命令中,我们指定系统的目标状态,而不指定某个动作等声明性的。我们让系统决定采取什么行动。如果资源不存在,它将创建它,如果资源存在,则它将配置应用于现有资源。

从执行的角度来看,第一次创建资源的时间在 和 之间没有区别kubectl createkubectl apply如上所示。但是,第二次kubectl create会抛出错误。

我花了一些时间来解决它,但现在它是有道理的。

于 2018-09-26T07:36:32.883 回答
5

简单来说,如果您在单个文件上运行操作以创建资源,则本质上是相同的createapply但是,apply允许您同时在一个目录下的多个文件上创建和修补。

还有一个apply从目录中删除资源的方法,但在撰写本文时它处于 alpha 状态:

kubectl apply -f <directory/> --prune -l your=label)

关于这个问题也有更多见解:Kubectl apply vs kubectl create?

于 2018-09-25T15:06:23.330 回答
0

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

kubectl apply 是声明式管理方法的一部分,即使您将其他更改应用于对象,您可能已应用于活动对象(即通过规模)的更改也会得到维护。

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

于 2019-01-10T08:53:44.103 回答