'kubectl apply'和'kubectl create'的区别

15
我使用以下yaml文件创建了一个pod,命令为kubectl create -f pod.xmlkubectl apply -f pod.xml,但是我没有看到任何区别,两个命令都可以创建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文件来指定对象的详细信息。请注意保留{{和}}占位符。

3
可能是Kubectl apply vs kubectl create?的重复问题。 - rath
重复的查询只是简单地指向了k8s文档,没有太多的解释,所以这个查询需要一些关注。 - Praveen Sripati
3个回答

27

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 命令,因为它只是按照以下方式应用配置。在这种情况下,配置没有更改。因此,Pod 没有更改。

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时会引发错误。
我花了一些时间才弄清楚,但现在它有意义了。

5
简单来说,如果您在单个文件上运行操作来创建资源,createapply基本相同。但是,apply允许您在目录下同时创建和修补多个文件。
此外,还有一个apply用于从目录中删除资源,但截至本文撰写时仍处于alpha版本。
kubectl apply -f <directory/> --prune -l your=label)

这个问题还有更多的见解:kubectl apply与kubectl create的区别?


0

这是两种不同的方法。kubectl create 是我们称之为 命令型管理。在此方法中,您告诉 Kubernetes API 您要创建、替换或删除什么,而不是您想让 K8s 集群世界看起来如何。

kubectl apply 是 声明式管理 方法的一部分,其中对实时对象进行的更改(例如通过缩放)即使应用其他更改也会保持。

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


1
OP 询问更多解释,而不是文档中提到的相同内容。 - Nag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接