【云原生 Kubernetes 系列】K8s 实战 Kubernetes 声明式对象的 增 删 改 查_kubectl

34 阅读2分钟

我们可以通过在一个目录中存储多个对象配置文件、并使用 kubectl apply 来递归地创建和更新对象来创建、更新和删除 Kubernetes 对象。 这种方法会保留对现有对象已作出的修改,而不会将这些更改写回到对象配置文件中。 kubectl diff 也会给你呈现 apply 将作出的变更的预览。


一、创建对象

使用 kubectl apply 来创建指定目录中配置文件所定义的所有对象,除非对应对象已经存在:

$ kubectl apply -f <目录>/

此操作会在每个对象上设置 kubectl.kubernetes.io/last-applied-configuration: '{...}' 注解。注解值中包含了用来创建对象的配置文件的内容。

现在我们在目录 application/simple_deployment.yaml 中新增一个对象配置文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

执行 kubectl diff 可以打印出将被创建的对象:

$ kubectl diff -f k8s.io/examples/ap…

使用 kubectl apply 来创建对象:

$ kubectl apply -f
k8s.io/examples/ap…

使用 kubectl get 打印其现时配置:

$ kubectl get -f k8s.io/examples/ap… -o yaml

输出显示注解 kubectl.kubernetes.io/last-applied-configuration 被写入到 现时配置中,并且其内容与配置文件相同:

kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple\_deployment.yaml
    # It was written by kubectl apply when the object was created
    kubectl.kubernetes.io/last-applied-configuration: |
 {"apiVersion":"apps/v1","kind":"Deployment",
 "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
 "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
 "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
 "ports":[{"containerPort":80}]}]}}}} 
  # ...
spec:
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

二、更新对象

也可以使用 kubectl apply 来更新某个目录中定义的所有对象,即使那些对象已经存在。 这一操作会隐含以下行为:

  1. 在现时配置中设置配置文件中出现的字段;
  2. 在现时配置中清除配置文件中已删除的字段。

kubectldifff<目录>/kubectl diff -f <目录>/ kubectl apply -f <目录>/

我们来更新 simple_deployment.yaml 配置文件,将镜像文件从 nginx:1.14.2 更改为 nginx:1.16.1,同时删除minReadySeconds 字段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1 # 更新该镜像
        ports:
        - containerPort: 80

应用对配置文件所作更改:

kubectldifffhttps://k8s.io/examples/application/update_deployment.yamlkubectl diff -f https://k8s.io/examples/application/update\_deployment.yaml kubectl apply -f k8s.io/examples/ap…

使用 kubectl get 打印现时配置:

$ kubectl get -f k8s.io/examples/ap… -o yaml

在上面输出的结果中,我们会发现,nginx:1.14.2 更改为 nginx:1.16.1,同时删除minReadySeconds 字段。

三、删除对象

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!