想系统学习k8s源码,云原生的可以加:mkjnnm
背景
在Kubernetes 集群中,Controller通过 API Server提供的(List & Watch)接口实时监控集群中资源对象的状态变化,当发生故障,导致资源对象的状态变化时,Controller会尝试将其状态调整为期望的状态。
比如当某个Pod出现故障时,Deployment Controller会及时发现故障并执行自动化修复流程,确保集群里的Pod始终处于预期的工作状态。
![](../../.gitbook/assets/image%20%281%29%20%281%29.png)
工作原理
Kubernetes控制器是通过定期重复执行如下 3 个步骤来完成控制任务的:
- 从API Server读取资源对象的期望状态和当前状态。
- 比较两者的差异,然后运行控制器操作现实中的资源对象,将资源对象的真实状态修正为Spec中定义的期望状态。
- 变动执行成功后,将结果状态写回到在API Server上的目标资源对象的status字段中。
![](../../.gitbook/assets/截屏2024-06-30%2018.27.13.png)
常见的 Controller
Kubernetes 中内置了许多 Controller,Controller Manager是这些 Controller 的管理者,当资源状态发生变化时,Controller Manager 会通知这些 Controller 做出决策和执行操作。
- Deployment Controller:负责部署和管理 Pod 副本。
- ReplicaSet Controller:负责管理 Pod 副本的数量。
- DaemonSet Controller:确保每个节点都运行指定的 Pod。
- Job Controller:负责执行一次性任务。
- CronJob Controller:负责按照指定的频率执行任务。
- StatefulSet Controller:确保 Pod 的顺序性和持久性。
- Garbage collector Controller:负责回收kubernetes中的资源对象,监听资源对象事件,更新对象之间的依赖关系,并根据对象的删除策略来决定是否删除其关联对象。
- …
Deployment
管理一组Pod,假设设置副本数 replicas=2,这时 node01和node02上会各自分配一个Pod,现在将node02关闭,则会发现node01上会部署两个Pod。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: test
labels:
app: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deployment-tp
template:
metadata:
labels:
app: nginx-deployment-tp
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 30