我用Kubernetes集群高可用搭建这事儿干过十几次,最值钱的经验是:别靠一个master节点扛着整个集群,得把master节点做多节点。你要是没做,哪怕你用etcd做高可用,也扛不住流量高峰。而且,高可用不是说装几个节点就完事了,得搞清楚每个组件的高可用机制,比如apiserver要多实例,etcd要集群,kubelet要能自动升级,网络插件要支持多节点通信。一旦有节点挂掉,自动切换才是真本事。
我见过太多人把高可用当成高配置,结果悲剧不断。比如,apiserver没开负载均衡,etcd没用集群,kube-proxy没用ipvs,这些都容易出问题。更糟的是,他们没配置kubectl的负载均衡配置,导致连不上集群。高可用搭建不是装个工具了事,必须每个组件都配置得当。比如kubelet的--node-ip指定,node的--kubeconfig配置,这些细节一场灾难就能毁掉。
真实运维中的几个关键点:apiserver的负载均衡必须用反向代理,比如nginx或haproxy;etcd必须是集群模式,至少三个节点;docker的镜像仓库要能跨节点访问;Controller Manager和Scheduler的高可用得靠集群配置,不能单点。还有,网络插件要是calico,得用BGP模式,否则节点隔离问题会坑你。这些点都是踩坑之后才明白的。
真正做高可用要从底层开始,比如host的防火墙策略,节点的系统时间同步,IP地址的静态分配。这些问题没处理好,后续再怎么折腾也没用。像我之前用的是bonding网络策略,结果某台节点突然断网,导致整个集群挂掉。后来才发现bonding配置没开启failover功能,那段时间真是焦头烂额。这种细节能救你一命。
高可用搭建过程中的几个关键工具:etcd集群、kubeadm、kops、kubeadm init、kubeadm join、kubelet配置文件、kube-proxy配置、网络插件配置文件。这些工具和配置项不能少。我之前用kops做的集群,结果某个节点的证书没更新,导致整个集群无法访问。这说明每个节点的证书更新策略必须写入到定时任务里。
真实操作中,得先用kubeadm init初始化,再通过kubeadm join加节点。这个过程不能偷懒,必须检查每个节点的加入状态。比如用kubeadm token create生成token,再用kubeadm token list确认有效期。etcd的配置要写cluster参数,指定每个成员的地址和端口。像我之前就因为etcd成员地址写错,导致集群无法正常选举。
还有,kubectl的配置文件必须有多个,不能只依赖一个。比如用kubectl config set-cluster命令设置多个集群,再通过kubectl config use-context切换。这样即使某个集群信息出错,也不会影响整个操作。不过我之前用过一个错误配置,导致某个节点看不到其他节点,结果花了几个小时才排查出来。
kubeadm init的时候,记得指定--control-plane-endpoint参数,这样后续加节点时就不会出现连接问题。这个参数我之前没用,结果节点加入失败,提示连接超时。后来才明白,这个参数决定了apiserver的对外访问地址。还有,kubelet的配置文件里要写好--node-ip和--kubeconfig参数,否则节点无法正常启动。
技术参考
▌ 技术引导
高可用Kubernetes集群的搭建不是简单的多节点部署,而是每个组件的高可用机制都要考虑清楚。比如apiserver必须用负载均衡,etcd必须是集群,Controller Manager和Scheduler得用集群模式。我的经验是:不要用单节点master,而是用多个master节点组成集群,每个节点都承载apiserver、Controller Manager和Scheduler的组件。这样即使某台master挂掉,其他节点也能接管服务,不会导致集群宕机。
让我告诉你几个关键点:kubelet的配置要指定--node-ip为真实IP,否则节点无法识别自己的地址。kube-proxy如果用ipvs模式,得确保内核版本支持,否则会报错。网络插件要是Calico,得配置BGP模式,否则节点之间无法通信。还有,etcd必须用集群模式,至少三个节点,这样就能实现故障转移。这些细节我都是踩坑之后才明白的,不能指望别人帮你搞定。
真实操作中,一个常见的问题是etcd的成员地址配置错误。比如我之前在搭建的时候,把etcd的成员地址写成本地IP,导致集群无法选举。后来才明白,etcd的地址必须是公网可访问的,否则其他节点无法连接。此外,apiserver的负载均衡配置必须正确,否则节点切换时会出现连接失败的问题。这些经验可不能少。
如果你用kubeadm搭建集群,记得用kubeadm init --config配置文件,而不是直接命令。配置文件里要写好control-plane-endpoint,这样后续加节点的时候才能正常。还有,网络插件的配置必须和kubelet的配置匹配,否则中间会出问题。像我之前用的是Calico,但没写好CNI配置,结果节点无法启动。
最让我烦的是,某些工具的默认配置不支持高可用。比如kubelet默认是单节点模式,得手动改成多节点模式。还有,Controller Manager和Scheduler的高可用不能只靠多节点,还得用集群配置。这些细节我都踩过坑,不能忽视。
▌ 技术参考
Kubernetes高可用集群的核心在于多节点部署和组件冗余。apiserver必须在多个节点上运行,且对外暴露的地址通过负载均衡解决。etcd的高可用需要至少三个节点构成集群,每个节点之间通过心跳机制维持数据一致性。Controller Manager和Scheduler也必须部署在多个节点上,避免单点故障。这些组件的高可用配置是整个集群稳定性的基石。
使用kubeadm初始化高可用集群时,需要明确指定control-plane-endpoint参数。这个参数决定了apiserver的对外访问地址,通常是一个负载均衡器的IP。例如,运行kubeadm init --config config.yaml命令,其中config.yaml要包含control-plane-endpoint的配置。如果没有这个参数,节点加入时会提示连接超时。此外,必须确保所有master节点的etcd配置一致,包括成员地址和端口。多个etcd成员通过--peer-urls参数连接,形成一个集群。
在节点加入过程中,使用kubeadm join命令时,必须确保每个节点的证书和token都正确。证书的有效期必须足够长,否则节点会自动退出。token的有效期也需要注意,默认是24小时,如果节点加入超时,需要重新生成。例如,运行kubeadm token create --print-join-token命令生成新的token。此外,kubelet的配置文件需要指定--node-ip参数为节点的真实IP,否则节点无法识别自己的网络信息。
kube-proxy的高可用配置要根据网络插件选择。如果使用Calico,推荐使用BGP模式,这样节点间的通信更稳定。如果使用ipvs,需要确保内核版本支持,并且启用了ipvs模块。例如,运行modprobe -r ip_vs和modprobe ip_vs命令加载模块。同时,kube-proxy的配置文件需要指定--proxy-mode为ipvs,这样它才能正常工作。这些配置项我之前都踩过坑,流程必须熟练。
网络插件的配置不能忽视,尤其是Calico和Flannel。Calico支持BGP模式,可以实现节点间的自动路由,而Flannel默认使用vxlan模式,可能在高可用场景下不够稳定。例如,Calico的配置文件要包含--datastore-type=etcd参数,并且指定etcd的地址和端口。这些细节决定了网络的稳定性,不能掉以轻心。
etcd的高可用必须通过集群模式实现。每个etcd节点需要指定--name参数,比如etcd1、etcd2、etcd3。同时,每个节点的--initial-cluster参数要包含其他节点的地址。例如,运行etcd --name=etcd1 --initial-cluster=etcd1=http://192.168.1.10:2380,etcd2=http://192.168.1.11:2380,etcd3=http://192.168.1.12:2380。这些配置确保etcd集群正常运行,否则节点会无法启动。
负载均衡的配置是高可用的核心。常见的方案是使用nginx或haproxy,将apiserver的端口转发到多个master节点。比如,在nginx配置中添加upstream kube-apiserver { server 192.168.1.10:6443; server 192.168.1.11:6443; server 192.168.1.12:6443; },然后将80端口指向这个upstream。一旦某个master节点挂掉,负载均衡器会自动将流量分配到其他节点。这个配置我之前没做,结果长时间无法访问apiserver。
Controller Manager和Scheduler的高可用需要通过集群配置实现。它们的配置文件中必须指定--leader-elect参数为true,这样可以在某个节点挂掉时自动选举主节点。同时,所有Controller Manager和Scheduler的服务必须注册到apiserver,确保它们的高可用性。否则,某个节点失败后,其他节点无法接管服务,导致整个集群失效。
在整个高可用搭建过程中,证书管理是一个容易被忽视的环节。每个节点的证书必须正确,否则会提示无法连接。例如,etcd的证书需要包含--cert-file和--key-file参数,指向正确的证书和私钥文件。这些证书必须在所有节点上同步,否则会引发连接问题。我之前就因为没同步证书,导致整个集群无法正常工作。
Kubernetes的高可用不仅仅依赖于组件冗余,还需要确保节点之间的通信稳定。每个节点的网络配置必须正确,防火墙策略要允许所有必要的端口,比如6443、2379、2380等。如果某个节点的网络配置错误,就会导致其他节点无法访问它,进而影响整个集群的可用性。这些细节我之前都踩过,不能大意。
在实际操作中,我会通过kubectl命令检查集群的状态。例如,运行kubectl get nodes命令确认所有节点在线。同时,使用kubectl get componentstatuses命令检查Controller Manager、Scheduler和apiserver的状态。如果某个组件显示NotReady,就得立即排查。这些检查我之前每天都做,确保集群的健康状态。
节点的自动升级也是一个关键点。如果某个节点需要升级,必须确保kubelet的配置支持自动更新。例如,在kubelet的配置文件中添加--feature-gates=RotateKubeletClientCertificate=true参数,这样在升级时会自动旋转证书。否则,证书过期后,节点会自动退出集群,导致服务中断。这个经验我之前就吃过亏。
高可用集群的监控必不可少。使用Prometheus和Grafana可以实时监控各个组件的状态。例如,Prometheus的配置需要包含所有master节点的metrics端口,这样就能看到apiserver的负载情况。监控系统能提前发现异常,避免大规模故障。我之前因为没有监控,导致某个节点异常时没能及时处理。
Kubernetes的高可用部署需要确保所有组件都能自动重启。比如,在etcd的配置中添加--restart=false参数,这样即使服务挂掉,也会自动重启。Controller Manager和Scheduler也必须设置为守护进程模式,否则会因为意外中断导致服务失效。这些细节我之前都没注意,后来才补上。
某些工具的默认配置不支持高可用,必须手动调整。比如,kubectl配置文件需要保存多个上下文,这样即使某个集群信息出错,也不会影响整个操作。例如,运行kubectl config set-context --current-context=cluster1 --cluster=cluster1 --user=admin命令,设置多个上下文。这些配置我之前都踩过坑,不能马虎。
手把手教程 | Kubernetes集群高可用搭建
我用Kubernetes集群高可用搭建这事儿干过十几次,最值钱的经验是:别靠一个master节点扛着整个集群,得把master节点做多节点。你要是没做,哪怕你用etcd做高可用,也扛不住流量高峰。而且,高可用不是说装几个节点就完事了,得搞清楚每个组件的高可用机制,比如apiserver要多实例,etcd要集群,kubelet要能自动升级,网络插件要支持多节点
DevOps实战AI1 次阅读
Related
延伸阅读

VS Code Copilot性能优化:4个快捷键速查 | 2026最新版VS Code指南 · 2026-07-13

VS Code代码评审性能优化:7个完全配置指南 | 全栈必备VS Code指南 · 2026-07-11

纯干货 | Angular Signals的17种样式方案前端工程 · 2026-07-14

缓存设计:DynamoDB,建议收藏数据库 · 2026-07-10

保姆级教程 | PostgreSQL优化:性能优化实战数据库 · 2026-07-10

4个MongoDB索引SQL调优,性能提升10倍数据库 · 2026-07-14