我使用下面的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文件。
发布于 2018-09-26 15:36:33
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 exists2) 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,因此它是命令式。在declarative.命令中,我们指定了系统的目标状态,但没有指定某个动作,因此使用kubectl apply命令我们让系统决定要采取什么行动。如果资源不在那里,它将创建它,如果资源在那里,它将对现有资源应用配置。
从执行的角度来看,在第一次创建资源时,kubectl create和kubectl apply没有区别,如上所述。但是,第二次kubectl create将抛出错误。
我花了一些时间来绕过它,但现在它是有意义的。
发布于 2018-09-25 23:06:23
简而言之,如果您在单个文件上运行创建资源的操作,则create和apply本质上是相同的。但是,apply允许您在一个目录下同时创建和修补多个文件。
还有一个用于从目录中删除资源的apply,但在撰写本文时它是alpha:
kubectl apply -f <directory/> --prune -l your=label)关于这个问题也有更多的见解:Kubectl apply vs kubectl create?
发布于 2019-01-10 16:53:44
这是两种不同的方法。kubectl create就是我们所说的Imperative Management。在这种方法中,您将告诉Kubernetes API您希望创建、替换或删除什么,而不是您希望您的K8s集群世界是什么样子。
kubectl apply是Declarative Management方法的一部分,在该方法中,即使您对对象应用了其他更改,也会保留您可能已应用于活动对象的更改(即,通过缩放)。
您可以在Kubernetes Object Management文档中阅读有关命令式和声明性管理的更多信息。
https://stackoverflow.com/questions/52500442
复制相似问题