我使用下面的Yaml用kubectl create -f pod.xml
和kubectl 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文件
其中的对象详细信息。
答案 0 :(得分:8)
kubectl create
和kubectl 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 create
和kubectl apply
之间没有区别,如上所述。但是,kubectl create
第二次抛出错误。
我花了一些时间来解决它,但是现在有意义。
答案 1 :(得分:4)
简单来说,如果您在单个文件上运行该操作以创建资源,则create
和apply
基本上是相同的。但是,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文档中阅读有关命令式和声明式管理的更多信息。