“ kubectl apply”和“ kubectl create”之间的区别

时间:2018-09-25 14:19:32

标签: kubernetes declarative imperative

我使用下面的Yaml用kubectl create -f pod.xmlkubectl apply -f pod.xml创建了一个pod,但没有发现任何区别,两个命令都创建了pod。 K8S document提到了命令式和声明式命令。但是,创建和应用的行为仍然相同。

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文件 其中的对象详细信息。

3 个答案:

答案 0 :(得分:8)

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第二次抛出错误。

我花了一些时间来解决它,但是现在有意义。

答案 1 :(得分:4)

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

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

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

对此问题也有更多见解:Kubectl apply vs kubectl create?

答案 2 :(得分:0)

这是两种不同的方法。 kubectl create是我们所谓的Imperative Management。通过这种方法,您可以告诉Kubernetes API您要创建,替换或删除的内容,而不是希望K8s群集世界的外观。

kubectl apply是Declarative Management方法的一部分,即使您将其他更改应用于对象,也可以保留您可能已对活动对象(即按比例缩放)应用的更改。

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