极客时间《云原生训练营》学习笔记。

核心技术概念和 API 对象

API 对象是 Kubernetes 集群中的管理操作单元。 Kubernetes 集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的 API 对象,支持对该功能的管理操作。 每个 API 对象都有四大类属性:

  • TypeMeta , 对应如下的 metadata以上的部分, kind / apiversion
  • MetaData , 对应如下的 metadata
  • Spec , 对应如下的 spec
  • Status , 这个是由系统控制器自已决定的, 如第二份code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# nginx-deploy.yaml
apiVersion: apps/v1    
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
 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
37
38
39
40
# kubectl get po nginx -owide
# 取最后面的 status 部分
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2021-12-19T03:56:14Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2021-12-19T03:56:49Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2021-12-19T03:56:49Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2021-12-19T03:56:14Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://e140c5bc9c2538f4c4a15d776d5d769fc2adc09cf1958b21d71c410886a9f837
    image: nginx:latest
    imageID: docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
    lastState: {}
    name: nginx
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2021-12-19T03:56:49Z"
  hostIP: 192.168.49.2
  phase: Running
  podIP: 10.244.0.4
  podIPs:
  - ip: 10.244.0.4
  qosClass: BestEffort
  startTime: "2021-12-19T03:56:14Z"

TypeMeta

Kubernetes对象的最基本定义,它通过引入GKV(Group,Kind,Version)模型定义了一个对象的类型。

  1. Group Kubernetes 定义了非常多的对象,如何将这些对象进行归类是一门学问,将对象依据其功能范围归入不同的分组,比如把支撑最基本功能的对象归入 core 组,把与应用部署有关的对象归入 apps 组,会使这些对象的可维护性和可理解性更高。
  2. Kind 定义一个对象的基本类型,比如 Node、Pod、Deployment 等。
  3. Version 社区每个季度会推出一个 Kubernetes 版本,随着 Kubernetes 版本的演进,对象从创建之初到能够完全生产化就绪的版本是不断变化的。与软件版本类似,通常社区提出一个模型定义以后,随着该对象不断成熟,其版本可能会从 v1alpha1 到 v1alpha2,或者到 v1beta1,最终变成生产就绪版本 v1。

Metadata

Metadata 中有两个最重要的属性:Namespace和Name,分别定义了对象的 Namespace 归属及名字,这两个属性唯一定义了某个对象实例。

对于 No Namespace 的对象, Name是全局唯一的

有Namespace的对象, Namespace + Name 是唯一的

Label

顾名思义就是给对象打标签,一个对象可以有任意对标签,其存在形式是键值对。 Label 定义了对象的可识别属性,Kubernetes API 支持以 Label 作为过滤条件查询对象。

  • Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上。
  • key 最长不能 超过 63 字节,value 可以为空,也可以是不超过 253 字节的字符串。
  • Label 不提供唯一性,并且实际上经常是很多对象(如 Pods)都使用相同的 label 来标志具 体的应用。
  • Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象
  • Label Selector 支持以下几种方式:
    • 等式,如 app=nginx 和 env!=production;
    • 集合,如 env in (production, qa);
    • 多个 label(它们之间是 AND 关系),如 app=nginx,env=test。

Annotations

Annotation 与 Label 一样用键值对来定义,但 Annotation 是作为属性扩展, 更多面向于系统管理员和开发人员,因此需要像其他属性一样做合理归类。

当你觉得的对象里面的属性不太够用的时候,你可以自定义属性的一个地方,你可以把附加的属性放在这里面。

  • Annotations 是 key/value 形式附加于对象的注解。
  • 不同于 Labels 用于标志和选择对象,Annotations 则是用来记录一些附加信息,用来辅助应用部署、安 全策略以及调度策略等。
  • 比如 deployment 使用 annotations 来记录 rolling update 的状态。

Finalizer

Finalizer 本质上是一个资源锁,Kubernetes 在接收某对象的删除请求时,会检查 Finalizer 是否为空,如果不为空则只对其做逻辑删除,即只会更新对象中的metadata.deletionTimestamp 字段。

比如我在配置里面增加一个 finalizer属性, 它删除时就没有真的删除,只是逻辑删除并有一个删除的时间戳

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 编辑配置文件
kubectl edit po nginx
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-12-19T03:56:14Z"
  finalizers:
  - kubernetes
  labels:
    run: nginx
...

# 再去删除它 
kubectl delete po nginx
# 再查看, 发现 nginx pod 还在 只是状态为 Terminating
kubectl get pods
NAME                          READY   STATUS        RESTARTS   AGE
nginx                         0/1     Terminating   0          4h3m

# 再编辑 kubectl edit po nginx 把 finalizers 属性去掉, nginx才会退出 

ResourceVersion

ResourceVersion 可以被看作一种乐观锁,每个对象在任意时刻都有其 ResourceVersion,当 Kubernetes 对象被客户端读取以后,ResourceVersion 信息也被一并读取。此机制确保了分布式系统中任意多线程能够无锁并发访问对象,极大提升了系统的整体效率。

当多个控制器去访问同一个对象时,这个时候就会去判断当前的ResourceVersion与你的版本号是否一致,不一致就说明你这个边你是基于一个比较旧的数据去改的,这个修改会被拒绝掉,知道我冲突了,这时由控制器来负责说我去获取一次最新的这个状态,然后在这个基础上之上再去做修改,再去重试。

Spec 和 Status

  • Spec 和 Status 才是对象的核心。

  • Spec 是用户的期望状态,由创建对象的用户端来定义。

  • Status 是对象的实际状态,由对应的控制器收集实际状态并更新。

  • 与 TypeMeta 和 Metadata 等通用属性不同,Spec 和 Status 是每个对象独有的。

常用 Kubernetes 对象及其分组

image-20211219163152523