三、 Object(元数据)
在Rest API中明确了Resource的kind、apiVersion,也确定了Object的namespace、name,作为凡是k8s资源对象都会引用的公共结构,自然也存在很多公共机制供使用。
metadata: annotations: alibabacloud.com/owner: testdemo k8s.aliyun.com/pod-eni: "true" creationTimestamp: "2022-06-02T07:21:36Z" deleteTimestamp: "2022-06-02T07:22:51Z" labels: app: taihao-app-cn-shanghai-pre-cloud-resource pod-template-hash: 5bbb759f78 name: testdemo-5bbb759f78-27v88 namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: testdemo-5bbb759f78 uid: 9c3f268a-c0d1-4038-bb2b-b92928f45e3d resourceVersion: "60166035" uid: e4236960-8be2-41bf-ac44-e7460378afb
|
观察上述YAML,将其整理:
• namespace:常规来说,Namespace资源才会使用该资源对象。
• name:代表资源实例名称。
• uid:是资源的唯一标识,可以区别已删除与重新创建的同名资源实例。
• resourceVersion:是k8s的内部版本,具备时间属性,基于此就能明确该资源对是什么时候发生改变的,也是保证k8s list-watch核心机制。
• creationTimestamp:资源实例创建时间。
• deleteTimestamp:资源实例删除时间,后续会在pod的生命周期内讲到对该字段应用。
• ownerReferences:资源从属对象,从上面yaml可知,该Pod资源从属于名为testdemo-5bb759f78,ownerReferences内部是没有namespace参数,也就是ownerReferences不允许跨namespace,将资源由下到上能够建立起来。
• labels:标签,k8s内的服务发现以及相应的软关联,都是围绕label运作的,比如testdemo-5bb759f78 replicaset的labelselector(标签筛选器)能够筛选到当前Pod的label,保证两者关联由上到下的建立。
• annotations:注释,通常来说会是作为额外字段供应给周边系统使用,比如当前k8s.aliyun.com/pod-eni="true"是提供网络系统使用。
label&labelSelector
Deployment会根据自己的labelseletor:app=taihao-app-cluster以及计算出podtemplate的hash lable:pod-template-hash:5b8b879786,筛选出出符合的replicaset,replicaset再根据自己的labelselector去筛选出符合的pods,相应的服务发现service,也是通过labelselector去筛选出符合的Pod。
Owner&GC(垃圾回收)
基于Pod的metadata.ownerReferences找寻到对应的replicaset,replicaset基于自身的metadata.ownerReferences找寻到deploy;当deployment被删除后,基于原有owner构建的树状,回收原有的rs与pod。
Deploy&Replicaset
基于label&labelselector,明确了从上到下的筛选归纳;基于owner&GC,明确了关联资源的回收流程。
apiVersion: apps/v1 kind: ReplicaSet metadata: generation: 1 labels: app: testdemo pod-template-hash: bcd889947 name: testdemo-bcd889947 namespace: taihao ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: Deployment name: testdemo uid: 1dddc849-c254-4cf5-aec8-9e1c2b5e65af spec: replicas: 1 selector: matchLabels: app: testdemo pod-template-hash: bcd889947 template: metadata: creationTimestamp: null labels: app: testdemo pod-template-hash: bcd889947 spec: containers: - args: - -c - sleep 1000000 command: - sh image: centos:7 imagePullPolicy: IfNotPresent name: testdemo status: fullyLabeledReplicas: 1 observedGeneration: 1 replicas: 1
|
replicaset.spec.replicas:实例数,rs控制下的Pod个数。
replicaset.spec.selector:基于label筛选出对应的Pod。
replicaset.spec.template:replicaset创建的Pod会基于podtemplate。
replicaset.status:replicaset当前管理Pod的状态。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: testdemo name: testdemo spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: testdemo strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: testdemo spec: containers: - args: - -c - sleep 1000000 command: - sh image: centos:7 imagePullPolicy: IfNotPresent name: testdemo status: availableReplicas: 1 observedGeneration: 2 readyReplicas: 1 replicas: 2 unavailableReplicas: 1 updatedReplicas: 1
|
deploy.spec.replicas:deploy期望的pod实例格式。
deploy.spec.revisionHistoryLimit:deploy管理replicaset的保留三个月。
deploy.spec.selector:deploy筛选符合标签。
deploy.spec.strategy:deploy的升级策略。
deploy.template:deploy基于此模版要创建的pod格式。