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



    前言

    在这里插入图片描述

    我们可以通过在一个目录中存储多个对象配置文件、并使用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

    $ kubectl diff -f https://k8s.io/examples/application/simple_deployment.yaml

    使用 kubectl apply 来创建对象:

    $ kubectl apply -f
    https://k8s.io/examples/application/simple_deployment.yaml

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

    $ kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -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
            # ...
          # ...
        # ...
      # ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    二、更新对象

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

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

    $ 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    $ kubectl diff -f https://k8s.io/examples/application/update_deployment.yaml
    $ kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml

    使用 kubectl get 打印现时配置:

    $ kubectl get -f https://k8s.io/examples/application/update_deployment.yaml -o yaml

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

    三、删除对象

    有两种方法来删除 kubectl apply 管理的对象。

    1. 使用指令式命令来手动删除对象是建议的方法,因为这种方法更为明确地给出了 要删除的内容是什么,且不容易造成用户不小心删除了其他对象的情况。

    $ kubectl delete -f <文件名>

    1. 使用替代方法来作为 kubectl delete 操作的替代方式,你可以在目录中对象配置文件被删除之后, 使用 kubectl apply 来辩识要删除的对象。 带 --prune 标志的 apply 命令会首先查询 API 服务器,获得与某组标签相匹配 的对象列表,之后将返回的现时对象配置与目录中的对象配置文件相比较。 如果某对象在查询中被匹配到,但在目录中没有文件与其相对应,并且其中还包含 last-applied-configuration 注解,则该对象会被删除。命令如下:

    $ kubectl apply -f --prune -l

    四、查看对象

    在上面文中,我想有些童鞋已经发现了,使用 kubectl get 并指定 -o yaml 选项来查看现时对象的配置:

    $ kubectl get -f <文件名 | URL> -o yaml

    总结

    使用声明式对象配置时,用户对本地存储的对象配置文件进行操作,但是用户 未定义要对该文件执行的操作。 kubectl 会自动检测每个文件的创建、更新和删除操作。 这使得配置可以在目录上工作,根据目录中配置文件对不同的对象执行不同的操作。

    本篇文章内容较少,主要介绍了 配置文件对 Kubernetes 对象 的增、删、改、查的操作,由于在Kubernetes 对象管理中,声明式管理是最难的,所以我这里将分两篇文章去讲解,当然在后面我们也会学习指令式命令,指令式对象配置

  • 相关阅读:
    在线地图获取城市路网数据
    2024超好看的404单页HTML源码
    Java分别用BIO、NIO实现简单的客户端服务器通信
    Bootstrap的导航菜单组件相关知识
    Mybatis之动态sql和分页
    本地生活餐饮视频怎么拍摄能有更多流量?如何批量生产呢?
    不用加减乘除做加法
    Spring boot与Spring cloud 之间的关系
    Go Web——Gin使用中间件
    对话PPIO边缘云联合创始人王闻宇,聊聊边缘计算与元宇宙
  • 原文地址:https://blog.csdn.net/u010755471/article/details/126279198