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 集群搭建完毕