0x00 文章楔子
本文旨在通过最简易的方式指导读者搭建HA kubernetes 1.12.1集群
通过部署脚本驱动kubeadm工具进行自动化部署,自动启动keepalived负载均衡,calico网络插件,并且开启kube-proxy的IPVS模式。
本文中的自动化部署脚本可以在Lentil1016/kubeadm-ha找到,欢迎Star/Fork/提issue和PR。
在我的环境上进行示例自动化部署的录像可以在该链接查看
0x01 Kubernetes集群搭建
集群结构摘要
集群结构摘要
Master是集群的管理者,负责监控应用运行状态,维护应用运行,如发布工作任务、重启应用、部署升级应用等
Worker(节点),也被称为Minion,即从属主机,是Kubernetes集群中的一台工作机器。每一个节点都包含了Pod运行所需的必要服务,例如docker/kubelet/kube-proxy。
Kubernetes集群的基本部署步骤:
- 所有节点安装docker
- harbor节点安装harbor
- 所有master和minion节点安装kubelet kubeadm kubectl
- 初始化master节点,并启动Calico容器
- 将worker节点join到集群中
各个机器的主机信息以及IP分布如下:
- Distribute: CentOS 7
- Docker: 17.03.2-ce
- Kernel: 4.18.12-1.el7.elrepo.x86_64
- Kubernetes: 1.12.1
- NetPlugin: Calico
- Proxy-Mode: IPVS
- Master-Mode: HA Master
- DNS: CoreDNS
Host Name | Role | IP |
---|---|---|
harbor | 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 |
进行系统配置
在所有机器上执行下面的脚本,配置注记:
- 关闭防火墙、selinux
- 关闭系统的Swap,Kubernetes 1.8开始要求。
- 关闭linux swap空间的swappiness
- 配置L2网桥在转发包时会被iptables的FORWARD规则所过滤,该配置被CNI插件需要,更多信息请参考Network Plugin Requirements
- 开启IPVS
# 所有主机:基本系统配置
# 关闭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-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 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.18,否则请调整默认启动参数
grub2-editenv list
#重启以更换内核
reboot
# 确认内核版本
uname -a
# 确认内核高于4.1后,开启IPVS
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&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
# 启动docker
systemctl daemon-reload
systemctl enable docker
systemctl start docker
安装私有镜像库
如果不能翻墙,需要使用本文提供的私有镜像源,则还需要为docker做如下配置,将K8s官方镜像库的几个域名设置为insecure-registry,然后设置hosts使它们指向私有源。
# 所有主机:http私有源配置
# 为Docker配置一下私有源
mkdir -p /etc/docker
echo -e '{\n"insecure-registries":["k8s.gcr.io", "gcr.io", "quay.io"]\n}' > /etc/docker/daemon.json
systemctl restart docker
# 此处应当修改为harbor所在机器的IP
HARBOR_HOST="10.130.38.80"
# 设置Hosts
yes | cp /etc/hosts /etc/hosts_bak
cat /etc/hosts_bak|grep -vE '(gcr.io|harbor.io|quay.io)' > /etc/hosts
echo """
$HARBOR_HOST gcr.io harbor.io k8s.gcr.io quay.io """ >> /etc/hosts
下载链接:链接:https://pan.baidu.com/s/10qwKtvVCeCRHccLrN-zQHg 提取码:ip4z,随后将该文件放置到harbor机器上,并在harbor主机上加载、启动该镜像
# harbor:启动私有镜像库
docker load -i /path/to/k8s-repo-1.12.1
docker run --restart=always -d -p 80:5000 --name repo harbor.io:1180/system/k8s-repo:v1.12.1
该镜像库中包含如下镜像,全部来源于官方镜像站。
1.12.1版本镜像列表
安装配置kubernetes
基本安装
首先下载链接:链接:https://pan.baidu.com/s/1ETQoH6RmcZ34n5IscR9RLQ 提取码:ntc6,并放置在k8s各个master和worker主机上
# master & worker:安装kubernetes
yum install -y socat keepalived ipvsadm
cd /path/to/downloaded/file
tar -xzvf k8s-v1.12.1-rpms.tgz
cd k8s-v1.12.1
rpm -Uvh *
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和Hostname
# 部署HA master
cd ~/
# 创建集群信息文件
echo """
CP0_IP=10.130.29.80
CP0_HOSTNAME=centos-7-x86-64-29-80
CP1_IP=10.130.29.81
CP1_HOSTNAME=centos-7-x86-64-29-81
CP2_IP=10.130.29.82
CP2_HOSTNAME=centos-7-x86-64-29-82
VIP=10.130.29.83
NET_IF=eth0
CIDR=172.168.0.0/16
""" > ./cluster-info
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.12.1/kubeha-gen.sh)"
# 该步骤将可能持续2到10分钟,在该脚本进行安装部署前,将有一次对安装信息进行检查确认的机会
可以在该链接查看我在自己的环境上安装全过程的录像,安装结束后会打印出如下的信息,最后一行为加入集群的命令,其中加入集群的IP已经被更换为了高可用的VIP。
安装helm
如果需要安装helm,请先下载离线包链接:https://pan.baidu.com/s/1RZ8WOHQHQ951h2qlna85ig 提取码:02ni
cd /path/to/helm-v2.11.0-linux-amd64.tar/
tar -xzvf helm-v2.11.0-linux-amd64.tar
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|sed 's/${LOCAL_IP}/${VIP}/g'
随后到worker节点执行刚刚生成的join command即可将该节点编入集群。
至此,HA master Kubernetes 集群搭建完毕
Lentil Sun
Channelsoft Software Engineer
Mail: lentil1016@gmail.com
Site: lentil1016.cn
Github: github.com/Lentil1016