K8S 的高可用是“分层保障”的思路,从集群层面应用层面都有对应的解决方案,下面我会从核心组件到应用部署,一步步讲清楚。

一、先明确:高可用要解决什么问题?

二、K8S 集群层面的高可用(核心基石)

1. 控制平面(Master)多副本部署

控制平面是 K8S 的“大脑”,包含 kube-apiserveretcdkube-schedulerkube-controller-manager 核心组件,高可用的核心是不搞单 Master 节点

graph TD
    客户端 --> LB(负载均衡器)
    LB --> Master1[kube-apiserver]
    LB --> Master2[kube-apiserver]
    LB --> Master3[kube-apiserver]
    Master1 <--> etcd1
    Master2 <--> etcd2
    Master3 <--> etcd3
    etcd1 <--> etcd2
    etcd2 <--> etcd3
    etcd1 <--> etcd3

2. 工作节点(Node)多副本 + 故障自动迁移

三、应用层面的高可用(核心落地手段)

集群层面的高可用是基础,应用的高可用需要你通过 K8S 资源配置来实现,这也是日常使用中最常操作的部分:

1. Deployment/StatefulSet:Pod 自动重建 + 多副本

这是最核心的应用部署方式,替代了直接创建 Pod(单 Pod 无高可用):

核心配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3  # 部署3个Pod副本,保证高可用
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v1
        ports:
        - containerPort: 8080
        # 健康检查:提前发现Pod异常,自动重启
        livenessProbe:  # 存活探针:检测Pod是否存活,挂了就重启
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30  # 启动30秒后开始检测
          periodSeconds: 10        # 每10秒检测一次
        readinessProbe:  # 就绪探针:检测Pod是否能接收请求,未就绪则剔除流量
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

2. Service:稳定的访问入口 + 负载均衡

Pod 会重建、IP 会变化,Service 就是为 Pod 提供固定的访问地址,同时实现 Pod 间的负载均衡:

核心配置示例

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app  # 关联上面Deployment的Pod标签
  ports:
  - port: 80        # Service的端口
    targetPort: 8080 # Pod的端口
  type: ClusterIP   # 集群内访问,外部访问可换NodePort/LoadBalancer

3. 健康检查(探针):提前发现并处理异常

上面 Deployment 配置中的 livenessProbe(存活探针)和 readinessProbe(就绪探针)是高可用的关键:

4. 其他高可用保障

三、配置生效与验证

  1. 部署 Deployment 和 Service:
kubectl apply -f my-app-deployment.yaml
kubectl apply -f my-app-service.yaml
  1. 查看 Pod 状态(确认多副本运行):
kubectl get pods -l app=my-app
  1. 模拟 Pod 故障(验证自动重建):
kubectl delete pod <pod-name>
# 再次查看,会发现新的Pod被创建
kubectl get pods -l app=my-app
  1. 模拟 Node 故障(验证 Pod 迁移):
# 标记Node不可调度
kubectl cordon <node-name>
# 驱逐Node上的Pod
kubectl drain <node-name> --ignore-daemonsets
# 查看Pod,会发现Pod迁移到其他Node
kubectl get pods -o wide -l app=my-app

总结

  1. K8S 集群高可用核心是控制平面多副本 + etcd 集群 + 领导者选举,避免单点故障;
  2. 应用高可用核心是Deployment 多副本 + Service 负载均衡 + 健康检查,保证 Pod 故障自动恢复、请求不中断;
  3. 进阶保障可通过反亲和性、StatefulSet、HPA、持久化存储进一步提升稳定性。

我给你用最直白、面试能直接说出口的方式讲清楚:什么是 etcd 集群、为什么要用、怎么工作、为什么必须奇数节点


一、etcd 是什么?

一句话:
etcd 是 Kubernetes 的“数据库 / 配置中心”,是一个分布式、强一致、高可用的键值存储。


二、什么是 etcd 集群?

就是:
把多个 etcd 节点组成一个集群,一起存数据,保证:

这就叫 etcd 集群


三、etcd 集群靠什么保证高可用?

核心两点:

1. Raft 一致性算法

2. 容错机制(重点!面试必考)

etcd 集群必须用 奇数节点

只要 存活节点 > 一半,集群就能正常工作。

为什么不能 2 节点?
因为 2 节点挂 1 个就剩 50%,不满足“大于一半”,集群直接不可用。


四、etcd 集群工作流程(极简口述版)

  1. 客户端写数据 → 发给 Leader
  2. Leader 把数据同步给所有 Follower
  3. 超过一半节点同步成功 → 提交数据
  4. 所有节点最终一致
  5. Leader 挂了 → 自动重新选举

五、K8s 为什么必须用 etcd 集群?

因为:


六、一句话总结(面试背诵版)

etcd 是 Kubernetes 的分布式键值存储,etcd 集群就是多个 etcd 节点通过 Raft 协议组成的高可用集群,保证数据强一致、自动容错,是 Kubernetes 高可用架构的核心基础。