本文约2100字,阅读约10分钟。 这一篇不是“安装说明书”,而是把 Kubernetes 高可用控制平面的访问链路彻底拆出来。 搞明白三件事:
kubectl到底连的是谁?之前的实验环境,我已经一步步搭完了:
看起来已经很“企业级”了。
但随着实验越来越深入,一个问题开始越来越明显:
故障场景 | 直接后果 |
|---|---|
Master 宕机 | kubectl彻底不可用 |
kube-apiserver挂掉 | 控制平面瘫痪 |
节点意外重启 | 集群变成“无人驾驶” |
etcd损坏 | 集群状态高风险,甚至不可恢复 |
虽然:
但 Kubernetes 已经失去了:
你无法:
所以这次,我正式进入:
最终架构:
3 Master + 3 Worker + HAProxy + Keepalived
通过 VIP 统一 API Server 入口,让控制平面真正扛住单点故障。
角色 | IP |
|---|---|
VIP(Keepalived 漂移) | 192.168.114.134 |
Master01 | 192.168.114.145 |
Master02 | 192.168.114.146 |
Master03 | 192.168.114.147 |
Worker01 | 192.168.114.148 |
Worker02 | 192.168.114.149 |
Worker03 | 192.168.114.150 |
注意:VIP 并不属于任何一台 Master,它是“漂浮”在负载均衡器上的。

一开始我也踩过坑:
“VIP 是不是直接登录 Master 用的?”
实际上完全不是。
VIP:
它不是:
对我而言:
https://192.168.114.134:6443
本质上代表:
理解这一点之后:
整个 Kubernetes HA 架构才会真正串起来。
这一部分我特意没有脚本化。
而是:
原因很简单:
我想真正理解: Kubernetes 前面的“高可用层”到底在干什么。
很多时候:
教程会告诉你:
apt install haproxy
但不会告诉你:

Keepalived 解决的是:
我在两台 LB 节点都部署了:
Keepalived
通过:
VRRP
让 VIP 永远只在一台 LB 上激活。
例如:
场景 | VIP 所在 |
|---|---|
LB01 正常 | VIP 在 LB01 |
LB01 宕机 | VIP 漂移到 LB02 |
因此:
客户端永远访问:
192.168.114.134
完全无感知。

HAProxy 工作在:
它根本不理解 Kubernetes。
它只做一件事:
收到 6443 请求
→ 转发到后端 API Server
例如:
134:6443
↓
145:6443
146:6443
147:6443
HAProxy 的核心:
其实就是一组:
server master01 192.168.114.145:6443 check

kubectl到底连接的是谁?完整数据流拆解这一部分。
是我这次实验里最大的收获。
以前虽然会:
kubectl get nodes
但从来没有真正理解:
kubectl 到底在连接谁?
直到做完 HA。
整个 Kubernetes 的访问链路才真正清晰。
是的。
我甚至专门用了:
作为 Kubernetes 管理终端。
原因很简单:
kubectl 本质只是 API Client。
和系统老不老关系并不大。

我的 kubeconfig:
server: https://192.168.114.134:6443
也就是:
VIP
因此:
kubectl get pods
真正的数据流如下:

kubectl 本质是:
例如:
kubectl get pods
底层其实是:
GET /api/v1/pods
它并不关心:
只要:
有 API Server 响应即可
VIP 保证:
即使:
LB01 宕机
VIP 也会自动漂移。
客户端完全无感知。
HAProxy 负责:
并检测:
后端 kube-apiserver 是否健康
只把请求发给:
健康节点
真正的:
整个 Kubernetes:
本质上:
etcd 是:
所有:
kubectl create deployment
最终都会写入:
etcd
因为:
所以:
Master 数量 | 容错能力 |
|---|---|
1 | 0 |
2 | 不推荐 |
3 | 容忍 1 台故障 |
5 | 容忍 2 台故障 |
因此:
这并不是巧合。
因为 Worker:
即使:
worker01 宕机
Pod 也会:
这是 Kubernetes 天生具备的:
不过这里有一个容易被误解的点:
“无状态”并不代表 Worker 上不能运行有状态应用。
例如:
这些都属于:
它们:
因此:
Kubernetes 会通过:
来解决:
Pod 漂移后数据如何保留
的问题。
也就是说:
真正不能挂的是:
因为:
一旦控制平面失效:
即使 Worker 还活着:
整个 Kubernetes 也已经“失控”
虽然:
HAProxy + Keepalived
我选择手动部署。
但:
我已经全部脚本化。
包括:
这样做最大的价值:
能力 | 价值 |
|---|---|
可重复 | 一键重建实验环境 |
可维护 | 配置统一标准化 |
可迁移 | 更换环境成本极低 |
工程化 | 更接近企业真实运维 |


我已经把 Kubernetes HA 部署脚本整理好了。
包括:
需要参考的同学:
K8SHA
即可获取。
目前仅支持debian 13系列,12、11应该也支持,但是并未做测试。
以前我总觉得:
Kubernetes = 一堆 Pod
但真正做完 HA 后,认识完全变了。
Kubernetes 本质上是:
真正重要的是:
而:
kubectl
只是:
当你真正看到:
之后。
你才会真正理解:
这一篇主要解决:
下一篇开始:
包括:
这部分会真正进入:
也是整个私有云实验里: