跳转至

ojbect

  • object是对目标状态的定义,k8s会持久存储object,并试图使系统运行状态符合object的定义
  • object的基本信息
    • apiVersin 即所属的api组
    • kind 所属的类型
    • metadata
      • namespace 所属的ns,集群级ojbect不需要这个
      • name 在同类型中唯一,ns级的则是在同ns内同类型中唯一
      • uid 系统为每个object生成的uuid,在集群范围内的所有object中唯一
      • selfLink 对象所对应的api路径
    • spec object的具体规格,大部分obect使用spec字段,有一些使用其它字段
    • status 系统对于实际运行状态与object之间差异的描述

操作object

https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config

  • 对于object操作本质上就对相应api url进行post get put patch delete操作,附上相应的json格式的object定义
  • kubectl封装的一些常用操作
    • create 用来创建部分常用的对象
    • expose 专门用于创建svc
    • run 用于创建pod
    • set 用于对一部分对象设置特定的属性
    • get 获取一个或多个对象的信息
    • edit 编辑对象信息
    • delete 删除对象
    • rollout scale autosecale 针对deploy的一些操作
    • label 更新对像的label
    • annotaion更新对象的annotion
  • kubectl使用yaml/json
    • get 获取文件中object对应的live信息
    • diff 对比文件与live
    • apply 应用文件中的对象到live
      • 如果live不存在,那么相当于create
      • 每次apply,文件中的信息会被存入last
      • apply背后的逻辑是进行patch操作,根据文件 live last-applied-configuration来决定如何patch
        • 字段不存在于文件,存在于last,不考虑live,字段从live中清除
        • 字段存在于文件,不存在于live中,字段在live中被创建
        • 字段存在于文件和live中,值不同,文件中的值被应用到live
          • 对于string integer boolean这种primitive类型字段直接replace
          • 对于map类型的字段以key为基准进行merge
          • 对于list类型的字段则根据元素字段的类型进行replace或merge
          • 如果list中元素全部为primitive,那么list被整体replace
          • 对于复杂的list,以patchMergeKey为基准进行merge,不同字段的patchMergeKey:https://github.com/kubernetes/api/blob/master/core/v1/types.go
    • create 创建文件中定义的对象,文件中未定义的默认值会被应用到live
    • patch 对字段操作
    • replace 用文件替换live,所有文件中没有定义的字段都会从live中剔除,如果文件没有定义具有默认值但是是required的字段时会出错
    • delete 从live删除文件中定义的对象
    • kustomize
#primitive
file        live        last        Action
Yes         Yes         -           Set live to configuration file value.
Yes         No          -           Set live to local configuration.
No          -           Yes         Clear from live configuration.
No          -           No          Do nothing. Keep live value.
#map
file        live        last        Action
Yes         Yes         -           Compare sub fields values.
Yes         No          -           Set live to local configuration.
No          -           Yes         Delete from live configuration.
No          -           No          Do nothing. Keep live value.

label

  • label是一种对object进行逻辑分组的机制
  • label本身的内容对系统没有意义,系统关心的是基于label进行分组的逻辑
  • k:v形式,key支持一个可选的prefix,以/分隔,prefix必须是dns模式 abc.com/key1: value1
  • kubernetes.io k8s.io这两个prefix为系统保留

label selector

  • 多条件逻辑

    多条件间总是与逻辑,不存在或逻辑

  • 基于等式查询

    = == !=,前两种是一样的,!=表达不等于 abc.com/key1 = value1

  • set-based查询

    三种操作符 in notin exists in 选择value存在于给定的一个列表中 notin 选择value不存在于给定的一个列表中 exists 选择key存在,不关心value

      environment in (production, qa)
      tier notin (frontend, backend)
      partition
      !partition
    
    kubectl get pods -l 'environment in (production),tier in (frontend)'
    
    selector:
      matchLabels:
       component: redis
      matchExpressions:
      - {key: tier, operator: In, values: [cache]}
      - {key: environment, operator: NotIn, values: [dev]}
    

Field Selectors

通过字段来选择object

kubectl get services  --all-namespaces --field-selector metadata.namespace!=default
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always