# NodePool 流程图 ## Mutating ```plantuml start :"收到mutating webhook"; :"检查Kind"; if ("Kind是否等于 Pod") then (true) :"反序列化Pod"; if ("NodePool 存在") then (true) if ("NodeName 为空 且 NodeSelectot 为空 且 NodeAffinity 为空") then (true) :"根据NodePool添加默认NodeAffinity"; else (false) endif if ("边缘节点Tolerations是否存在") then (true) :"添加边缘节点Tolerations"; endif :"修改POD,返回 Allowed"; else (false) :"跳过修改,返回 Allowed"; endif else (false) :"跳过修改,返回 Allowed"; endif stop @enduml ``` ## Validating ```plantuml start :"收到 validating webhook"; :"检查Kind"; if ("Kind是否等于 Pod") then (true) :"反序列化Pod"; if ("NodePool 存在") then (true) :"获取当前NodePool节点列表"; if ("存在边缘节点Tolerations") then (false) :"返回 Denied"; else (true) fork if ("NodeName 为空") then (true) :"返回nil"; else (false) :"返回对应的节点列表"; endif fork again if ("NodeSelector 为空") then (true) :"返回nil"; else (false) :"返回对应的节点列表"; endif fork again if ("NodeAffinity 为空") then (true) :"返回nil"; else (false) :"返回对应的节点列表"; endif end merge if ("NodeName NodeSelector NodeAffinity 是否存在交集") then (false) :"返回 Denied"; else (true) if ("交集节点是否全部存在于NodePool中") then (false) :"返回 Denied"; else (true) :"返回 Allowed"; endif endif endif else (false) :"返回 Allowed"; endif else :"返回 Allowed"; endif stop @enduml ``` # 时序图 ```plantuml kubernetes --> mutating: webhook request mutating --> mutating: 检查Kind mutating --> mutating: 反序列化Pod mutating --> mutating: 检查Pod是否配置节点选择器 mutating <--> kubernetes: 查询NodePool和ConfigMap是否存在 mutating --> mutating: 转换NodePool为节点亲和性 mutating --> mutating: 更新Pod的节点亲和性 mutating --> mutating: 更新Pod的污点容忍度 mutating --> kubernetes: webhook response kubernetes --> validating: webhook request validating --> validating: 检查Kind validating --> validating: 反序列化Pod validating <--> kubernetes: 查询NodePool和ConfigMap是否存在 validating <--> kubernetes: 查询NodePool的节点列表 validating --> validating: 查询Pod的选择的节点 validating --> validating: 检查Pod选择的节点是否在NodePool中 validating --> kubernetes: webhook response ```