kubectl apply vs create:在Kubernetes集群环境中使用哪个资源创建资源?
Kubectl apply和Kubectl create都是在Kubernetes集群环境中创建资源的两种不同方法。
它们都从文件或者STDIN创建资源。
kubectl的应用和创建:两种创建资源的方法
现在,让我们详细介绍一下,并了解kubectl在实现时如何应用和创建彼此不同的地方。
kubectl创建:命令式管理
“ kubectl create”就是我们所谓的命令式管理。
通过这种方法,我们可以告诉Kubernetes API我们要创建,替换或者删除的内容。
用更简单的话来说,create
会创建一个全新的对象(以前不存在或者已删除)。
kubectl适用:声明式管理
kubectl apply
是声明式管理方法的一部分,在该方法中,我们可能已对活动对象进行了更改(即
即使我们对对象应用了其他更改,“ scale”(通过scale)也将被“保留”。
用简单的话来说,“ apply”通过定义我们需要的东西来对现有对象进行增量更改。
注意:kubectl创建和应用方法都接受JSON和YAML文件格式。
通过示例了解kubectl创建和应用之间的区别
我将使用下面的YAML文件创建Kubernetes容器。
Hyman@theitroad:~/pod-create# cat mypod.yml apiVersion: v1 kind: Pod metadata: name: create-vs-apply-demo labels: app: front-end rel: dev spec: containers: - name: httpd image: docker.io/httpd imagePullPolicy: IfNotPresent ports: - containerPort: 80
让我们使用命令式方式创建Pod,即使用kubectl create
命令:
Hyman@theitroad:~/pod-create# kubectl create -f mypod.yml pod/create-vs-apply-demo created
列出容器状态以及标签:
Hyman@theitroad:~/pod-create# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS create-vs-apply-demo 1/1 Running 0 8s app=front-end,rel=dev
现在,我将编辑YAML文件并为其添加一个另外的标签(示例:applyVscreate)。
Hyman@theitroad:~/pod-create# cat mypod.yml apiVersion: v1 kind: Pod metadata: name: create-vs-apply-demo labels: app: front-end rel: dev demo: applyVscreate spec: containers: - name: httpd image: docker.io/httpd imagePullPolicy: IfNotPresent ports: - containerPort: 80
现在,让我们再次使用命令式方法使更改生效。
Hyman@theitroad:~/pod-create# kubectl create -f mypod.yml Error from server (AlreadyExists): error when creating "mypod.yml": pods "create-vs-apply-demo" already exists
它引发一个错误,并说该资源已经存在。
现在,让我们使用声明性方法执行相同的操作,例如:kubectl apply
命令。
Hyman@theitroad:~/pod-create# kubectl apply -f mypod.yml pod/create-vs-apply-demo configured
因此,这次资源已配置好。
验证所做的更改。
Hyman@theitroad:~/pod-create# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS create-vs-apply-demo 1/1 Running 0 3m19s app=front-end,demo=applyVscreate,rel=dev
我们可以看到新标签已应用到AD连播。
我相信现在我们应该对这两种方法有清楚的了解。
创建或者应用Kubectl?使用哪一个?
这取决于用例,我们如何使用这些概念或者方法。
这与哪个好还是坏无关。
如果要对k8s对象进行版本控制,则最好使用声明性方法(kubectl套用),这有助于确定k8s对象中数据的准确性。
而且,如果我们只想创建一些用于故障排除,学习或者交互式实验目的的资源,则可以使用命令式方法(kubectl create)。