kubeadm HA master(v1.14.0)离线包 + 自动化脚本 + 常用插件 For Centos/Fedora

2023年 7月 9日 91.4k 0

0x00 文章楔子

工作原因,本系列不再更新后续版本,抱歉

关于kubernetes v1.14.0:

  • kubeadm开始建议使用systemd作为节点的cgroup控制器,因此建议读者参考本文流程配置docker为使用systemd,而非默认的Cgroupfs。
  • kubelet额外的引入了对conntrack的依赖。
  • Linux 5.0.x版内核已被支持。

关于其他plugins:

  • 本次release集成的是calico3.5.3版本,使用host-local模式ipam。最新版的calico(3.6.0)中,calico-ipam功能已经成熟并在官方manifest中默认启用,然而3.6.0存在一些问题因而没能通过我的部署测试。
  • 本次release集成的traefik是最新的稳定版本1.7.9,traefik:2.0已经发布,但尚处于alpha2测试阶段。
  • 我在项目的feature-prom-rook分支添加了Rook和Prometheus的测试yaml,读者有兴趣的话可以试用一下。

理论上升级内核并不是必要的,为私有仓库单独准备一台机器也并不是必要的,但本指导为了简化步骤,将假设读者会按照本文步骤升级内核,并为私有仓库准备了一台单独的机器。如果读者跳过这些步骤后出现问题,本文不会提供解决这些问题所需要进行的额外配置。

本文中出现的全部下载连接见下表:

文件名 下载链接 提取码 MD5
helm-v2.13.1-linux-amd64.tar.gz 百度盘 crv5 ffbe37fe328d99156d14a950bbd8107c
k8s-v1.14.0-rpms.tgz 百度盘 okdg 7cccc6b10e17a6c640baced768aab274
k8s-repo-v1.14.0 百度盘 88ua 96af3a2da51460f8e51321e15094fdd2
kernel-ml-5.0.4.tgz 百度盘 twl3 8e546a243f6fd5ca3ebe1d30079d2bac

本文中的自动化部署脚本可以在Lentil1016/kubeadm-ha找到,欢迎Star/Fork/提issue和PR。

升级过程的录像可以在本链接查看

集群方案:

  • 发行版:CentOS 7 & Fedora 29
  • 容器运行时:Docker-18.09.3-ce
  • 内核: 5.0.3-200.fc29.x86_64
  • 版本:Kubernetes: 1.14.0
  • 网络方案: Calico v3.5.3
  • kube-proxy mode: IPVS
  • master高可用方案:keepalived LVS
  • DNS插件: CoreDNS 1.3.1
  • metrics插件:metrics-server v0.3.1
  • dashboard:kubernetes-dashboard v1.10.1
  • ingress控制器:traefik 1.7.9
  • helm & tiller:v2.13.1

0x01 Kubernetes集群搭建

集群结构摘要

此处为举列说明,假定各个机器的主机信息以及IP分布如下,需要额外说明的是,由于私有仓库需要占用80端口,与ingress controller冲突,因此为私有仓库单独准备一台机器是必要的:

Host Name Role IP
registry image registry 10.130.38.80
centos-7-x86-64-29-80 master-1 10.130.29.80
centos-7-x86-64-29-81 master-2 10.130.29.81
centos-7-x86-64-29-82 master-3 10.130.29.82
Virtual IP 10.130.29.83
node1 worker 10.130.38.105
node2 worker 10.130.38.106
node3 worker 10.130.38.107

进行系统配置

在所有机器上下载内核rpm包,并且执行下面的脚本,配置注记:

  • 关闭防火墙、selinux
  • 关闭系统的Swap,Kubernetes 1.8开始要求。
  • 关闭linux swap空间的swappiness
  • 配置L2网桥在转发包时会被iptables的FORWARD规则所过滤,该配置被CNI插件需要,更多信息请参考Network Plugin Requirements
  • 升级内核到最新,原因见issue#19
  • 开启IPVS

如果发现elrepo-kernel源中的内核版本过高或过低,无法满足要求,可以使用下面测试过的5.0.4版本rpm包:

kernel-ml-5.0.4.tgz 百度盘 twl3 8e546a243f6fd5ca3ebe1d30079d2bac
# 所有主机:基本系统配置

# 关闭Selinux/firewalld
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
 
# 关闭交换分区
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
 
# 设置网桥包经IPTables,core文件生成路径
echo """
vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
""" > /etc/sysctl.conf
sysctl -p
 
# 同步时间
yum install -y ntpdate
ntpdate -u ntp.api.bz
 
# 升级内核
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm ;yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
 
# 检查默认内核版本是否大于4.14,否则请调整默认启动参数
grub2-editenv list
 
#重启以更换内核
reboot
 
# 确认内核版本后,开启IPVS
uname -a
cat > /etc/sysconfig/modules/ipvs.modules &1
 if [ $? -eq 0 ]; then
 /sbin/modprobe ${kernel_module}
 fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

执行sysctl -p报错请参考centos7添加bridge-nf-call-ip6tables出现No such file or directory

Kubernetes要求集群中所有机器具有不同的Mac地址、产品uuid、Hostname。可以使用如下命令查看Mac和uuid

# 所有主机:检查UUID和Mac

cat /sys/class/dmi/id/product_uuid
ip link

安装配置Docker

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,因此docker安装完成后,还需要手动修改iptables规则。

# 所有主机:安装配置docker

# 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager 
 --add-repo 
 https://download.docker.com/linux/centos/docker-ce.repo
 
yum makecache fast
yum install -y docker-ce
 
# 编辑systemctl的Docker启动文件和配置文件
sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service
mkdir -p /etc/docker
cat > /etc/docker/daemon.json  /etc/hosts

下载地址:

k8s-repo-v1.14.0 百度盘 88ua 96af3a2da51460f8e51321e15094fdd2

随后将该文件放置到registry机器上,并在registry主机上加载、启动该镜像

# registry:启动私有镜像库
docker load -i /path/to/k8s-repo-1.14.0
docker run --restart=always -d -p 80:5000 --name repo harbor.io:1180/system/k8s-repo:v1.14.0

该镜像库中包含如下镜像,全部来源于官方镜像站。

镜像列表

安装配置kubernetes

基本安装

下载文件:

k8s-v1.14.0-rpms.tgz 百度盘 okdg 7cccc6b10e17a6c640baced768aab274

并放置在k8s各个master和worker主机上

# master & worker:安装kubernetes

yum install -y socat keepalived ipvsadm conntrack
cd /path/to/downloaded/file
tar -xzvf k8s-v1.14.0-rpms.tgz
cd k8s-v1.14.0
rpm -Uvh * --force
systemctl enable kubelet
kubeadm version -o short

配置免密码登陆

# master-1:生成ssh密钥对

ssh-keygen
# 三次回车后,密钥生成完成
cat ~/.ssh/id_rsa.pub
# 得到该机器的公钥如下图

将该公钥复制,并分别登陆到master-1 master-2 master-3的root用户,将它令起一行粘贴到 ~/.ssh/authorized_keys 文件中,包括master-1自己

复制完成后,从master-1上分别登陆master-1 master-2 master-3测试是否可以免密码登陆(请不要跳过这一步),可以的话便可以继续执行下一步

部署HA Master

HA Master的部署过程已经自动化,请在master-1上执行如下命令,并注意修改IP

# 部署HA master

cd ~/
 
# 创建集群信息文件
echo """
CP0_IP=10.130.29.80
CP1_IP=10.130.29.81
CP2_IP=10.130.29.82
VIP=10.130.29.83
NET_IF=eth0
CIDR=10.244.0.0/16
""" > ./cluster-info
 
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.14.0/kubeha-gen.sh)"
# 该步骤将可能持续2到10分钟,在该脚本进行安装部署前,将有一次对安装信息进行检查确认的机会

可以在本链接查看我在自己的环境上安装全过程的录像,安装结束后会打印出如下的信息,最后一行为加入集群的命令。

访问dashboard

如果需要访问kubernetes dashboard或traefik dashboard,只需要在浏览器所在机器上配置到任意master的hosts解析,然后访问对应域名即可。

echo """
10.130.29.80 dashboard.multi.io ingress.multi.io""" >> /etc/hosts

测试发现有时kubernetes dashboard容器会不响应请求,如果出现该情况请尝试删除dashboard的pod以重新启动该pod,即可解决该问题。

安装helm

如果需要安装helm,请先下载离线包:

helm-v2.13.1-linux-amd64.tar.gz 百度盘 crv5 ffbe37fe328d99156d14a950bbd8107c
cd /path/to/helm-v2.13.1-linux-amd64.tar.gz/
tar -xzvf helm-v2.13.1-linux-amd64.tar.gz
cd linux-amd64
cp helm /usr/local/bin
helm init --service-account=kubernetes-dashboard-admin --skip-refresh --upgrade
helm version

加入work node

现在可以将各节点入编到集群中。join command是由kubeadm动态生成的,其基本形式如下

# worker:将worker编入集群
kubeadm join 10.130.29.83:6443 --token 4n3hvt.sb8qjmno6l47tsww --discovery-token-ca-cert-hash sha256:a7f1de577bd8677a5d7fe4d765993645ae25d8b52a63a1133b74a595a7bb2e0f

其中包含了节点入编集群所需要携带的验证token,以防止外部恶意的节点进入集群。每个token自生成起24小时后过期。届时如果需要加入新的节点,则需要重新生成新的join token,请使用下面的命令生成,注意改写IP:

# master-1:生成指向VIP的Join Command
kubeadm token create --print-join-command

随后到worker节点执行刚刚生成的join command即可将该节点编入集群。

至此,HA master Kubernetes 集群搭建完毕

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论