
用户是访问master01还是node01,master01可以是多台高可用
“容忍度(Toleration)”确实不在 Endpoints 的准入条件里。 只要一个 Pod 满足了你列出的那四个条件,Endpoints Controller 就会把它加入 Endpoints 列表,IPVS 也会为它转发流量。
但是,这里有一个因果关系上的先后顺序,导致了“如果不容忍,Pod 根本无法满足前三个条件”。我们可以把这个过程拆解为两步来看:
第一步:生杀大权(调度阶段)
Endpoints 和 IPVS 是“交通警察”,但 Pod 能不能上路,得先过“调度器(kube-scheduler)”这一关。
● 如果 Master 节点有 NoSchedule 污点,而 Pod 没有配置容忍度,调度器会直接拒绝将这个 Pod 调度到 Master 节点。
● 既然没有被调度到 Master 节点,Pod 自然也就不可能在 Master 节点上运行。
第二步:网络准入(Endpoints 阶段)
假设调度器真的把 Pod 调度到了 Master 节点上(比如你手动指定了 nodeName 绕过了调度器,或者加了容忍度):
● 此时 Pod 确实处于 Running 状态,标签也匹配。
● 但是,如果它没有容忍度,而节点上有 NoExecute 污点,节点上的 kubelet 会立刻驱逐(Evict)这个 Pod。
● Pod 一旦被驱逐,就会变成 Terminating 或 Failed 状态,Readiness Probe 自然无法通过,Endpoints Controller 就会立刻把它从列表中剔除。
你看到的逻辑是: Endpoints 只认状态,不认容忍度 。
实际的完整链路是: 容忍度决定了 Pod 能不能被调度 -> 调度决定了 Pod 能不能运行 -> 运行状态决定了 Pod 能不能进 Endpoints 。
所以,Endpoints 确实没有“容忍度检查”的代码,因为调度器已经在最前端把不容忍的 Pod 给拦截了。 这就是 Kubernetes 各个组件之间完美的分工与解耦。