如何使用 kubeadm 初始化高可用 Kubernetes 集群架构?

文章导读
使用 kubeadm 初始化高可用 Kubernetes 集群架构的核心在于部署多个控制平面节点(至少 3 台)并配置负载均衡器。通常有两种拓扑选择:堆叠 etcd 拓扑(控制平面与 etcd 共存)或外部 etcd 集群。首先需要准备满足硬件要求的机器,关闭 Swap、SELinux 和防火墙,安装容器运行时及 kubeadm 组件。接着为 kube-apiserver 创建负载均衡器(如 HA
📋 目录
  1. 利用 kubeadm 创建高可用集群
  2. 用 kubeadm 搭建 Kubernetes1.13 高可用集群
  3. kubeadm 部署高可用 kubernetes
  4. FAQ
A A

使用 kubeadm 初始化高可用 Kubernetes 集群架构的核心在于部署多个控制平面节点(至少 3 台)并配置负载均衡器。通常有两种拓扑选择:堆叠 etcd 拓扑(控制平面与 etcd 共存)或外部 etcd 集群。首先需要准备满足硬件要求的机器,关闭 Swap、SELinux 和防火墙,安装容器运行时及 kubeadm 组件。接着为 kube-apiserver 创建负载均衡器(如 HAProxy+Keepalived),分配 VIP。然后初始化第一个控制节点,并将其他控制节点加入集群,最后加入工作节点并安装网络插件。

利用 kubeadm 创建高可用集群

本文讲述了使用 kubeadm 设置一个高可用的 Kubernetes 集群的两种不同方式:使用具有堆叠的控制平面节点。这种方法所需基础设施较少。etcd 成员和控制平面节点位于同一位置。使用外部 etcd 集群。这种方法所需基础设施较多。控制平面的节点和 etcd 成员是分开的。在下一步之前,你应该仔细考虑哪种方法更好地满足你的应用程序和环境的需求。高可用拓扑选项讲述了每种方法的优缺点。如果你在安装 HA 集群时遇到问题,请在 kubeadm 问题跟踪里向我们提供反馈。你也可以阅读升级文档。注意:这篇文档没有讲述在云提供商上运行集群的问题。在云环境中,此处记录的方法不适用于类型为 LoadBalancer 的服务对象,也不适用于具有动态 PersistentVolume 的对象。准备开始 根据集群控制平面所选择的拓扑结构不同,准备工作也有所差异:堆叠 (Stacked) etcd 拓扑 外部 etcd 拓扑 需要准备:配置满足 kubeadm 的最低要求的三台机器作为控制面节点。控制平面节点为奇数有利于机器故障或者分区故障时重新选举。机器已经安装好容器运行时,并正常运行 配置满足 kubeadm 的最低要求的三台机器作为工作节点 机器已经安装好容器运行时,并正常运行 在集群中,确保所有计算机之间存在全网络连接 (公网或私网) 在所有机器上具有 sudo 权限 可以使用其他工具;本教程以 sudo 举例 从某台设备通过 SSH 访问系统中所有节点的能力 所有机器上已经安装 kubeadm 和 kubelet 拓扑详情请参考堆叠 (Stacked)etcd 拓扑。

用 kubeadm 搭建 Kubernetes1.13 高可用集群

部署结构和环境 首先要做 Kubernetes 集群的高可用,必然需要多个控制主节点,从而防止主节点的单点故障,一般建议至少有三个控制节点来组建高可用的集群。每个控制节点都独立运行着 kube-apiserver,kube-scheduler,kube-controller-manager,apiserver 组件,其中和工作节点交互的 apiserver 是通过负载均衡暴露出去的。Kubernetes 使用的是分布式数据库 etcd 来存储集群所有的元数据,用 kubeadm 工具来安装集群时,默认情况下会自动在控制节点上创建 etcd 数据库。最终的部署拓扑图如下图所示:搭建了 6 台 CentOS7.6 64 位的虚拟机,其中三台作为控制节点,另外三台配置强一点的作为工作节点,具体的主机名和 IP 如下表所示:Centos7 的主机名可以通过来进行配置 并且将如下的主机名配置添加到每台虚拟的文件中,这样这 5 台节点之间就可以通过主机名来互相通信了 基本准备 使用 kubeadm 创建高可用集群,要求 kubernetes 必须是 1.12 及以上的版本,这里我们使用的是目前最新的 1.13.1 版本 1. 条件检查 在开始部署前,需要检查部署环境是否满足 kubeadm 搭建高可用集群的基本条件:系统要求:Ubuntu16.04+ CentOS7 RHEL 7 Fedora 25/26 系统硬件配置要求:大于 2GB 的内存 通过指令检查 大于 2 个 CPU 个数 通过指令检查 每个节点都有自己唯一的主机名,MAC 地址和 product_uuid 可以通过查看 MAC 地址以及通过查看 product_uuid 每台虚拟机的 Swap 必须被关闭 每个节点之间都可以通过 SSH 进行通信,并且在每个 master 节点上,配置到其他节点的无需密码登录。

如何使用 kubeadm 初始化高可用 Kubernetes 集群架构?

kubeadm 部署高可用 kubernetes

1.1 主机列表 1.2 关闭防火墙 代码语言:javascript 复制 systemctl disable firewalld --now 1.3 关闭 selinux 代码语言:javascript 复制 setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 1.4 关闭 swap 分区 代码语言:javascript 复制 swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 1.5 升级内核 (1) 更新 yum 源仓库 代码语言:javascript 复制 yum -y update (2) 启用 ELRepo 仓库 ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL 的 Linux 发行版(CentOS、Scientific、Fedora 等)的支持。ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。导入 ELRepo 仓库的公共密钥 代码语言:javascript 复制 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 安装 ELRepo 仓库的 yum 源 代码语言:javascript 复制 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm (3) 查看可用的系统内核包 可以看到 5.4 和 5.18 两个版本 代码语言:javascript 复制 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * elrepo-kernel: hkg.mirror.rackspace.com elrepo-kernel | 3.0 kB 00:00:00 elrepo-kernel/primary_db | 2.0 MB 00:00:01 可安装的软件包 elrepo-release.noarch 7.0-5.el7.elrepo elrepo-kernel kernel-lt.x86_64 5.4.157-1.el7.elrepo elrepo-kernel kernel-lt-devel.x86_64 5.4.157-1.el7.elrepo elrepo-kernel kernel-lt-doc.noarch 5.4.157-1.el7.elrepo elrepo-kernel kernel-lt-headers.x86_64 5.4.157-1.el7.elrepo elrepo-kernel kernel-lt-tools.x86_64 5.4.157-1.el7.elrepo elrepo-kernel kernel-lt-tools-libs.x86_64 5.4.157-1.el7.elrepo elrepo-kernel kernel-lt-tools-libs-devel.x86_64 5.4.157-1.el7.elrepo elrepo-kernel kernel-ml.x86_64 5.15.0-1.el7.elrepo elrepo-kernel kernel-ml-devel.x86_64 5.15.0-1.el7.elrepo elrepo-kernel kernel-ml-doc.noarch 5.15.0-1.el7.elrepo elrepo-(截至 2022 年 9 月 15 日)

FAQ

为什么要关闭 Swap 分区?

因为 kubelet 会出错,Kubernetes v1.8+ 要求关闭系统 Swap,否则会在之后的环节中出问题。

如何使用 kubeadm 初始化高可用 Kubernetes 集群架构?

高可用集群至少需要几个控制节点?

一般建议至少有三个控制节点来组建高可用的集群,控制平面节点为奇数有利于机器故障或者分区故障时重新选举。

如何使用 kubeadm 初始化高可用 Kubernetes 集群架构?

负载均衡器作用是什么?

为 kube-apiserver 创建负载均衡器,将流量分配给目标列表中所有运行状况良好的控制平面节点,API 服务器的健康检查是在 kube-apiserver 的监听端口上进行的一个 TCP 检查。