简介
DeScheduler 是容器服务的一个基于 Node 真实负载进行重调度的插件。该插件会和 Kube-scheduler 协同生效,实时监控集群中高负载节点并驱逐低优先级 Pod。建议您搭配 Dynamic Scheduler(动态调度器扩展组件)一起使用,多维度保障集群负载均衡。
该插件依赖 Prometheus 监控组件以及相关规则配置。
四个方面优化:
- coredns 功能
- dns 本地缓存
- client和server 之间网络
- 服务自动扩容
Kubernetes Pod 解析 DNS 域名会 search 很多次,例如上图 Pod 中 DNS 配置,当它请求 ksyun.com,会依次解析:
- ksyun.com.kube-system.svc.cluster.local -> NXDOMAIN
- ksyun.com.svc.cluster.local -> NXDOMAIN
- ksyun.com.cluster.local -> NXDOMAIN
- ksyun.com -> 1.1.1.1
Coredns 是中心化部署在某一个节点上的,Pod 访问 Coredns 解析经过链路过长,又是 UDP 协议,导致失败率高。
NodeLocal DNSCache 通过在集群节点上作为 DaemonSet 运行 dns 缓存代理来提高集群 DNS 性能。在今天的架构中,ClusterFirst DNS 模式下的 Pod 会访问 kube-dns serviceIP 以进行 DNS 查询。这通过 kube-proxy 添加的 iptables 规则转换为 kube-dns/CoreDNS 端点。使用这种新架构,Pods 将接触到运行在同一节点上的 dns 缓存代理,从而避免 iptables DNAT 规则和连接跟踪。本地缓存代理将查询 kube-dns 服务以查找集群主机名(默认为 cluster.local 后缀)的缓存未命中。
- 拦截 Pod 的 DNS 查询的请求
- 将外部域名分流,外部域名请求不再请求中心 Coredns
- 中间链路使用更稳定的 TCP 解析
- 节点级别缓存 DNS 解析结果,较少请求中信 Coredns
开启拓扑感知服务路由特性需同时启动ServiceTopology=true和EndpointSlice=true的FeatureGate
FEATURE STATE: Kubernetes v1.17 [beta]
EndpointSlices提供了一种简单的方法来跟踪Kubernetes集群中的网络Endpoints。 它们为Endpoints提供了更可扩展和可扩展的替代方案。 Endpoints API提供了一种简单而直接的方式来跟踪Kubernetes中的网络Endpoints。 不幸的是,随着Kubernetes集群和服务能够处理更多流量并将其发送到更多后端Pod,该原始API的局限性变得更加明显。 最值得注意的是,这些挑战包括扩展到更多网络Endpoints的挑战。 由于服务的所有网络Endpoints都存储在单个Endpoints资源中,因此这些资源可能会变得很大。 这影响了Kubernetes组件(尤其是主控制平面)的性能,并在Endpoints更改时导致大量网络流量和处理。 EndpointSlices可帮助您减轻这些问题,并为诸如拓扑路由之类的其他功能提供可扩展的平台。
Eni多IP方案是由 VPC 功能负责路由,打通容器网络的连通性,可实现 Pod 和 Node 的控制面和数据面完全在同一网络层面,该模式下的 Pod 能够复用VPC 所有产品特性。
VPC-CNI(多IP共享) 模式和VPC-CNI(独占)模式下,集群内 Pod 与 Node 的 IP 均来自同一 VPC。区别是,独占模式指的是pod独享一块弹性网卡,而多IP共享模式指的是多个pod共享一块弹性网卡,将弹性网卡的辅助ip分配给pod,通过这种方式,增加单个Node上可以创建的pod数量。
注:但由于弹性网卡辅助 IP 数量的限制,单个 Node 上可以创建的 Pod 数量仍然会受到限制,但综合pod数量和性能的考虑,目前该方案已属较优。
ENI多IP方案支持的最大Pod数=(云主机支持的ENI数-1)×单个ENI支持的私有IP个数