cloud provider node controller
node controller 是负责初始化/维护一个k8s node 在云上标识的信息,主要信息如下:
1: 初始化node的云相关的zone/region信息labels。
2: 初始化 node 的云上的实例信息,比如说 type 和 szie。
3: 获取 node 的网络地址信息和主机名称。
4: 当客户通过云的虚拟机管理面板删除主机的时候需要从 k8s 中同步的删除 node。
在实现上 cloud node controllr 核心逻辑只是重度依赖 cloud 接口 和 node Informers。
1 | // startControllers starts the cloud specific controller loops. |
node controller 实现最开始描述 4 个需求只有两块核心逻辑:
其一是周期性不断执行的UpdateNodeStatus
和MonitorNode
,前者是更新节点状态比如 ip 地址,后者通过云平台管理接口监控虚拟机,当客户通过虚拟机管理页面移除机器时候保证 k8s 中 node 也会被删除。
其二是通过 controller 机制来触发的两个回调函数AddCloudNode
和UpdateCloudNode
添加虚拟机与云相关标签比如实例类型x2.larget
实例 Idins-xxx
还有 ip 地址等。
1 | // NewCloudNodeController creates a CloudNodeController object |
cloud node controller 第一块逻辑:在实现上 cloud node controller 仅仅注册了 2 个回调函数,而且在实现上 UpdateCloudNode 调用了 AddCloudNode。
1 | func (cnc *CloudNodeController) UpdateCloudNode(_, newObj interface{}) { |
可以看一下 AddCloudNode 实现:
1 | // This processes nodes that were added into the cluster, and cloud initialize them if appropriate |
cloud node controller 第二块逻辑:周期性调用UpdateNodeStatus
和MonitorNode
。
1 | // This controller deletes a node if kubelet is not reporting |
UpdateNodeStatus
的实现更新了ip address
。
1 | // UpdateNodeStatus updates the node status, such as node addresses |
MonitorNode 函数也是周期性执行,当调用 cloud provider 发现节点不存在的时候也会从 k8s 中移除节点。
1 |
|