Skip to main content

Command Palette

Search for a command to run...

搭建高可用 Kubernetes 集群

Updated
2 min read

领导说,只要机器够多,故障是个很平常的事情。

Kubernetes 能很好的管理容器和节点,所以正常的节点故障或者个别应用的故障是不会影响集群运作的。一旦 apiserver 或者所依赖的 etcd 出现问题,情况就不再乐观了。幸好这两个核心服务都提供了高可用相关能力。同时 controller-manager 以及 scheduler 也都具备通过选举产生 leadership 的机制,这就提供了高可用的基础。下面讲讲 Master 组件的高可用部署方式。

部署目标

  • 每个 apiserver 都使用不同的负载均衡端点访问整个 etcd 集群。

  • 每个 controller-manager 和 scheduler 使用各自的 apiserver 进行工作。

  • 客户端通过负载均衡机访问 apiserver。

前提条件

这里我们假设,ETCD 集群已经成功建立,包含三个节点,采用 https 访问进行访问;Master 节点只有一个。也同样的使用 https 进行访问,集群能够正常工作。

另外准备若干台服务器安装 haproxy 充当负载均衡。

ETCD

众所周知的是,apiserver 的 --etcd-servers 参数是可以输入一整个 etcd 集群的,然而在使用中我们发现,一些特定版本的 apiserver 在 第一台 etcd 服务所在节点的特殊故障情况下,虽然 etcd 本身已经能够发现集群健康状态异常,却依然会陷入假死状态,,具体症状是多数 kubectl 的 Workload 相关操作都能完成,然而却不会真正生效。因此我们需要更可靠的对 etcd 集群的访问方式,降低 apiserver 缺陷造成的集群不可用的风险。

因为采用了 https 方式进行访问,所以这里我们 haproxy 的配置需要使用 tcp 方式。

不用 https 端点(也就是对外 https 对内 http 的部署)的方式,纯属个人习惯。 在启用 haproxy 之前,注意要把服务端证书的 IP 进行扩展,令其支持新增的负载均衡地址。

简单粗暴上代码:

frontend in-etcd
    bind *:12379
    mode tcp
    default_backend etcd-cluster

backend etcd-cluster
    mode tcp
    balance roundrobin
    option httpchk GET /health
    http-check expect string true
    server app1 10.211.55.9:2379 check check-ssl verify none
    server app2 10.211.55.10:2379 check check-ssl verify none
    server app3 10.211.55.11:2379 check check-ssl verify none
  • 使用负载均衡节点的 12379 端口对外提供服务。

  • 前后端均使用 tcp 方式。

  • 利用 etcd 节点的 /health 端点进行健康检查,健康标准是返回字符串 true

  • 不校验 etcd 服务端证书。

启用 haproxy 之后,访问 haproxy 的状态页面,可以看到 etcd 集群的代理已经建立。

任意停止其中一台,会看到在检测窗口过后,对应的服务器状态切换为 DOWN

用同样的方式部署其他两台 haproxy 服务器。

Master 组件

和 etcd 情况一样,apiserver 的服务证书,也需要更新,加入新的 Master 节点以及前端负载均衡的地址。

首先更改 apiserver 的 etcd 参数,从原来的三台 etcd 变更为单一的 haproxy 地址,例如 https://haproxy1:12379。修改之后,重新启动服务,可以看到服务正常启动成功。

接下来,我们将 apiserver、controller-manager 以及 scheduler 的可执行文件、服务定义、相关证书以及配置文件复制到新加入的服务器中,并启用服务。

  • 每个 apiserver 需要配置各自的 etcd haproxy。

  • 每个 scheduler 和 controller-manager 都访问各自的 apiserver 服务,并使用参数--leader-elect启用选举(这一参数是缺省启用的)。

和 etcd 类似,为 apiserver 配置 haproxy:

frontend in-apiserver
    bind *:16443
    mode tcp
    default_backend apiserver-cluster

backend apiserver-cluster
    mode tcp
    balance roundrobin
    option httpchk GET /healthz
    http-check expect string ok
    server app1 10.211.55.9:6443  check check-ssl verify none
    server app2 10.211.55.10:6443 check check-ssl verify none
    server app3 10.211.55.11:6443 check check-ssl verify none

这里我们访问 apiserver 的 /healthz 端点,如果得到返回内容为 ok,则判断集群为健康。

配置后启动 haproxy,查看状态页面,可以看到 apiserver 集群也已经就绪。

最后可以修改 kubectl 以及各个 Node 的 kubelet/kube-proxy apiserver 参数到负载均衡地址。

测试

停止任意一台 Master 的服务,包括 apiserver/controller-manager/scheduler,会看到 controller-manager 或 scheduler 的选举过程。如果停掉的是 apiserver,则可以在 haproxy 状态页上看到集群可用性的变化。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts