把分布在不同可用区中的 node 纳入到一个 kubernetes 集群,意味着操作其中的负载时需要考虑可用区的影响。 比如 pod 如何在多个可用区之间分布,对 service 的请求会不会跨可用区传输。
Running in multiple zones 概括了包含多个可用区时需要考虑的问题以及解决方法:
整套方案在不冲击 kubernetes 整体架构的情况下增加了对可用区的支持,设计的比较巧妙,虽然不怎么强大。
kubernetes 对用来标识可用区的 label 名称并没有约束,只需要在单个集群内保持统一。比较常用的标签名是:topology.kubernetes.io/zone。 kubernetes 不自动设置 node 和 pv 的可用区标签。node 可用区标签需要人为在 kubelet 中设置或者通过 cloud-controller-manager 设置。
topologySpreadConstraints 影响的是新增的 pod 被调度到 node 过程,实现 pod 在不同可用区中的数量平衡。具体用法见:Pod Topology Spread Constraints。
通过在 pv 上设置可用区标签来避免 pod 挂载了其它可用区的存储。用 persistentvolumelabel 从 cloud provider 获取到可用区信息然后设置标签的做法已经不建议使用,建议用 cloud-controller-manager。
storagte-class 可以限定 allowed-topologies,主要还是通过设置 WaitForFirstConsumer 模式,在可用区已知的时候进行 pv 创建。
为了避免访问 service 的请求被转发到另外的可用区,可以启用 Topology Aware Routing,kube-proxy 以及 dns 组件都需要开启。