kubectl apply vs create:在Kubernetes集群环境中使用哪个资源创建资源?

时间:2020-03-05 15:31:08  来源:igfitidea点击:

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)。