基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Kubernetes 是如何实现高可用的?

知识点图片

Kubernetes (K8s) 的高可用(High Availability, HA)是一个多层级的设计,涵盖了从控制平面(Control Plane)数据平面(Worker Nodes)应用负载(Workloads)以及基础设施的各个方面。

简单来说,K8s 通过冗余(Redundancy)自动故障转移(Failover)自我修复(Self-healing)机制来实现高可用。

以下是 Kubernetes 实现高可用的核心架构和机制详解:


1. 控制平面高可用 (Control Plane HA)

这是 K8s 的“大脑”。如果控制平面挂了,虽然现有的 Pod 可能还能跑,但你无法发布新版本、无法扩缩容,集群将失去管理能力。

  • 多主节点架构 (Multi-Master Topology):
    生产环境通常至少部署 3 个 Master 节点。
  • API Server (kube-apiserver):
    • 机制: 无状态(Stateless)。
    • HA 实现: 可以同时运行多个实例。通常会在这些 API Server 前面架设一个 负载均衡器 (Load Balancer, LB)(如 Nginx, HAProxy 或云厂商的 LB)。所有 kubectl 命令和 Worker 节点的流量都通过 LB 分发给健康的 API Server。
  • Etcd (集群数据库):
    • 机制: 强一致性的键值存储,保存集群所有状态。
    • HA 实现: 使用 Raft 共识算法。Etcd 集群需要奇数个节点(通常 3 或 5 个)来保证在部分节点失效时仍能选举出 Leader 并写入数据。只要有 (N/2)+1 个节点存活,集群就是可写的。
  • Controller Manager & Scheduler:
    • 机制: 有状态(Stateful),它们需要监听状态并做出决策。如果多个实例同时修改集群状态会冲突。
    • HA 实现: 领导者选举 (Leader Election)。虽然每个 Master 节点上都运行这两个组件,但在同一时刻,只有一个实例是 Active(主)状态,其余处于 Standby(备)状态。如果主实例挂了,备用实例会通过竞选接管工作。

2. 数据平面高可用 (Node Level HA)

这是运行应用的地方。如果某个物理机或虚拟机挂了,K8s 需要保证业务不受影响。

  • 节点健康监测:
    • Worker 节点的 kubelet 会定期向 API Server 发送心跳。
    • Controller Manager 会监控这些状态。如果一个节点在一定时间(默认 40秒 - 5分钟不等)内没有汇报心跳,该节点会被标记为 NotReady
  • 自动驱逐与重新调度 (Eviction & Rescheduling):
    • 一旦节点被判定故障,Scheduler 会将该节点上的 Pod 标记为驱逐状态,并在其他健康的 Node 上重新创建这些 Pod,从而恢复副本数量。

3. 应用层高可用 (Pod/Application HA)

这是开发者最关心的部分,确保你的服务不中断。

  • 副本控制器 (ReplicaSet / Deployment):
    • 不要直接运行 Pod,而是使用 Deployment。它确保集群中始终运行指定数量(比如 3 个)的 Pod 副本。如果一个 Pod 崩溃,Controller 会立马启动一个新的。
  • 健康检查 (Probes):
    • Liveness Probe (存活探针): 检测容器是否活着。如果探测失败,K8s 会重启该容器(解决死锁问题)。
    • Readiness Probe (就绪探针): 检测应用是否准备好接收流量。如果探测失败,K8s 会将该 Pod 从 Service 的负载均衡池中摘除,确保流量只打到健康的 Pod 上。
    • Startup Probe: 用于启动慢的应用,防止在启动过程中被误杀。
  • 调度策略 (Affinity / Anti-Affinity):
    • Pod Anti-Affinity (Pod 反亲和性): 强制 K8s 将同一个服务的不同副本调度到不同的 Node 上。甚至可以配置为调度到不同的可用区 (Availability Zone)。这样即使一台服务器甚至一个机房挂了,服务依然可用。
  • Pod Disruption Budget (PDB):
    • 在进行集群维护(如升级节点)时,PDB 限制了同时不可用的 Pod 数量,确保在主动维护期间服务依然保持高可用。

4. 网络与服务高可用 (Service & Networking HA)

  • Service (ClusterIP / NodePort / LoadBalancer):
    • Service 提供了一个虚拟 IP (VIP),它是稳定的。无论后端的 Pod 怎么销毁重建、IP 怎么变,客户端只需要访问 Service IP。
  • kube-proxy:
    • 在每个节点上运行,负责维护网络规则(iptables 或 IPVS),将发往 Service VIP 的流量负载均衡到后端的 Pod 上。
  • Ingress Controller:
    • 作为集群的入口网关,通常配合外部的高可用负载均衡器使用,负责七层路由。

5. 存储高可用 (Storage HA)

  • PV / PVC 体系:
    • K8s 将存储抽象化。Pod 挂掉后,新起的 Pod 可以通过 PVC 重新挂载原来的 PV(持久卷),保证数据不丢失。
  • 云原生存储 / 分布式存储:
    • 通常后端对接 AWS EBS、Ceph、GlusterFS 等。这些存储系统本身就具备数据多副本复制的能力。

总结:K8s 高可用的层级图

层级 关键组件 HA 核心机制
控制平面 API Server 多实例 + 负载均衡器 (LB)
Etcd Raft 算法 (Quorum 机制)
Scheduler/Controller 领导者选举 (Active-Standby)
节点层 Kubelet/Node 心跳监测 + 自动驱逐 + 重新调度
应用层 Pod Deployment (多副本) + 反亲和性 (分散部署)
容器 Liveness/Readiness Probes (健康检查)
基础设施 机房/区域 跨可用区 (Multi-AZ) 部署

一句话总结:
Kubernetes 的高可用是通过消除单点故障(多 Master)、状态监测与自动修复(Controller Loop)、以及资源冗余调度(多副本跨节点)共同实现的。

00:00
00:00