控制器
kube-controller-manager是一系列控制器的集合,每一种控制器都以独有的方式负责某种编排功能
1 2 3 4 5 6 7
| # cd kubernetes/pkg/controller
# ls -d */ apis/ cronjob/ endpoint/ history/ nodelifecycle/ replication/ storageversiongc/ util/ bootstrap/ daemon/ endpointslice/ job/ podautoscaler/ resourcequota/ testutil/ volume/ certificates/ deployment/ endpointslicemirroring/ namespace/ podgc/ serviceaccount/ ttl/ clusterroleaggregation/ disruption/ garbagecollector/ nodeipam/ replicaset/ statefulset/ ttlafterfinished/
|
控制循环
- X为待编排的对象,实际状态来源于Kubernetes集群,而期望状态一般来自于用户提交的YAML文件
- 别名:Reconcile、Reconcile Loop、Sync Loop、Control Loop
- 控制器对象本身,负责定义被管理对象的期望状态!!
- 被控制对象的定义,来源于模板,如Deployment.template与标准的Pod对象的API定义一致,称为PodTemplate
1 2 3 4 5 6 7 8 9
| for { 实际状态 := 获取集群中对象 X 的实际状态(Actual State) 期望状态 := 获取集群中对象 X 的期望状态(Desired State) if 实际状态 == 期望状态{ 什么都不做 } else { 执行编排动作,将实际状态调整为期望状态 } }
|
Deployment
- Deployment控制器从Etcd中获取到所有携带
app: nginx
标签的Pod,统计它们的数量 – 实际状态
- Deployment对象的Replicas字段为期望状态
- Deployment控制器比较实际状态和期望状态,确定创建Pod还是删除已有的Pod
nginx-deployment.yaml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: 'nginx:1.7.9' ports: - containerPort: 80
|
所有的API Object的Metadata都有ownerReference字段,用于保存该API Object的拥有者(Owner)
参考资料
- 深入剖析Kubernetes