最近碰到两次,因故障需要重装主机系统。其中一次 Etcd 只剩下一个节点,导致整个集群宕机半个小时才恢复。
本篇主要记录的是新系统 Ubuntu 20.04 初始化的过程,完成初始化之后采用优秀的集群安装工具 Kubekey 的 add nodes
命令,无需修改配置文件,一键就将节点重新加入了集群。
- 恢复 Etcd
三个节点的 Etcd 集群,只有一个节点运行是无法工作的。因此,务必首先修复 Etcd 集群。这里比较幸运的是,系统重装之后 Ip 没有发生变化,否则需要重新生成证书,具体操作见另外一篇博文,《如何修复变更 IP 之后的 Kubernetes 集群》 ^[1]^。
-
在重装节点上,拷贝其他节点的 Etcd 二进制文件、配置文件、启动文件
scp etcd-node1:/usr/local/bin/etcd /usr/local/bin/ scp etcd-node1:/etc/etcd.env /etc/ scp etcd-node1:/etc/systemd/system/etcd.service /etc/systemd/system/ scp -r etcd-node1:/etc/ssl/etcd /etc/ssl/
通常,一个 Etcd 集群的所有节点启动方式一样,只需要完全拷贝另外一个节点的即可。
-
在重装节点上,编辑配置文件,替换主机信息
vim /etc/etcd.env
这里需要替换的主要是 IP、NodeName 信息,将这些信息替换为当前节点的即可。因为这些会涉及到证书、Etcd WAL 数据中的节点信息数据的有效性。保持与之前一样,有助于快速恢复 Etcd 集群。
-
启动 Etcd
systemctl start etcd
-
设置开机启动 Etcd
systemctl enable etcd
三个节点的 Etcd 有两个能运行,集群就能正常工作。剩下的就是初始化节点,并将节点重新添加到集群。这里有些特殊的是集群主要用于持续集成,需要挂载一块额外的存储盘,安装指定的 Docker 版本。
- 初始化数据盘并格式化
- 安装 SSD 盘驱动
由于采用的是宝存企业级 SSD,还需要安装驱动。根据提供的文档,安装驱动有两种安装方式,一种是 deb 安装,另一种是编译安装。但是提供的 deb 版本没有匹配上 Ubuntu 20.04,而编译安装有奇怪报错无法解决。
可行的安装方式是,先编译生成 deb 驱动包,再安装 deb 驱动包。宝存的 SSD 下面会给出一个测速以供参考。
- 查看磁盘
安装完成 SSD 驱动之后,操作系统就能识别到磁盘了。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 558.4G 0 disk
├─sda1 8:1 0 1M 0 part
└─sda2 8:2 0 558.4G 0 part /
dfa 252:0 0 2.9T 0 disk
其中的 /dev/dfa
就是额外的 SSD 数据盘。
- 使用 parted 创建 GPT 分区表
由于硬盘超过了 2TB,fdisk 无法处理,需要使用 parted
parted /dev/dfa
mklabel gpt
-
格式化分区为 btrfs
mkfs.btrfs /dev/dfa
-
挂载分区到
/data
目录mkdir /data mount /dev/dfa /data
-
修改
/etc/fstab
开启自动挂载磁盘
新增如下内容:
/dev/dfa /data btrfs defaults 0 0
修改完成之后,一定要测试以下步骤,否则可能无法开机。
-
卸载
/data
挂载的设备umount /data
-
自动挂载设备
mount -a
-
查看是否成功自动挂载
df -h
-
使用 fio 测试随机读写速度
4K 随机写: (groupid=0, jobs=1) write: IOPS=78.2k, BW=306MiB/s (320MB/s)(3072MiB/10051msec) 4K 随机读: (groupid=0, jobs=1) read: IOPS=120k, BW=468MiB/s (490MB/s)(3072MiB/6571msec)
- 设置软链接指向数据盘
-
Docker
mkdir /data/docker ln -s /data/docker /var/lib/docker ls -al /var/lib/docker
-
Kubelet
mkdir /data/kubelet ln -s /data/kubelet /var/lib/kubelet ls -al /var/lib/kubelet
-
Openebs
mkdir /data/openebs ln -s /data/openebs /var/openebs ls -al /var/openebs
-
Longhorn
mkdir /data/longhorn ln -s /data/longhorn /var/lib/longhorn ls -al /var/lib/longhorn
- 安装指定版本 Docker
-
卸载 Docker
apt-get autoremove docker docker-ce docker-engine docker.io containerd runc
-
添加 Docker 源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
-
更新系统源
apt-get update
-
查看 Docker 版本
apt-cache madison docker-ce
docker-ce | 5:20.10.22~3-0~ubuntu-focal | https://mirrors.aliyun.com/docker-ce/linux/ubuntu focal/stable amd64 Packages docker-ce | 5:20.10.12~3-0~ubuntu-focal | https://mirrors.aliyun.com/docker-ce/linux/ubuntu focal/stable amd64 Packages
-
安装指定版本
apt-get install docker-ce=5:20.10.12~3-0~ubuntu-focal
至此,新系统初始化完成,剩下的交给 Kubekey,由于 IP 未变,可以直接使用安装时的配置文件一键添加 Master 节点到集群。
sudo ./kk add nodes -f config.yaml