查看原文
其他

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

Lentil Sun K8S中文社区 2019-12-18

0x00 文章楔子

本文面向具有基本K8s使用经验的读者
项目作者在业余时间看心情维护,不求你用,爱用不用。
建议那些有钱的,懒得动脑子的,有甲方病的,出门左转找个收费的装,花点,不丢人。

关于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百度盘crv5ffbe37fe328d99156d14a950bbd8107c
k8s-v1.14.0-rpms.tgz百度盘okdg7cccc6b10e17a6c640baced768aab274
k8s-repo-v1.14.0百度盘88ua96af3a2da51460f8e51321e15094fdd2
kernel-ml-5.0.4.tgz百度盘twl38e546a243f6fd5ca3ebe1d30079d2bac

本文中的自动化部署脚本可以在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 NameRoleIP
registryimage registry10.130.38.80
centos-7-x86-64-29-80master-110.130.29.80
centos-7-x86-64-29-81master-210.130.29.81
centos-7-x86-64-29-82master-310.130.29.82
Virtual IP10.130.29.83
node1worker10.130.38.105
node2worker10.130.38.106
node3worker10.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百度盘twl38e546a243f6fd5ca3ebe1d30079d2bac
# 所有主机:基本系统配置# 关闭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 <<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"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}
fidone
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 <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

# 启动docker
systemctl daemon
-reload
systemctl enable docker
systemctl start docker

安装私有镜像库

如果不能翻墙,需要使用本文提供的私有镜像源,则还需要为docker做如下配置,将K8s官方镜像库的几个域名设置为insecure-registry,然后设置hosts使它们指向私有源。

# 所有主机:http私有源配置# 额外为Docker配置私有源
cat
> /etc/docker/daemon.json <<EOF
{
"insecure-registries":["harbor.io", "k8s.gcr.io", "gcr.io", "quay.io"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker

# 此处应当修改为registry所在机器的IP
REGISTRY_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
"""
$REGISTRY_HOST gcr.io harbor.io k8s.gcr.io quay.io """
>> /etc/hosts

下载地址:

k8s-repo-v1.14.0百度盘88ua96af3a2da51460f8e51321e15094fdd2

随后将该文件放置到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百度盘okdg7cccc6b10e17a6c640baced768aab274

并放置在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百度盘crv5ffbe37fe328d99156d14a950bbd8107c
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 Commandkubeadm token create --print-join-command

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

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

说明文章内容所有超链接(百度网盘等)可以到网页端查看,网页留言可与作者互动;地址:https://www.kubernetes.org.cn/5213.html


作者

  • Lentil Sun 

  • Channelsoft Software Engineer 

  • Mail: lentil1016@gmail.com 

  • Site: https://lentil1016.cn 

  • Github: https://github.com/Lentil1016


K8S培训推荐

Kubernetes线下实战培训,采用3+1+1新的培训模式(3天线下实战培训,1年内可免费再次参加,每期前10名报名,可免费参加价值3600元的线上直播班;),资深一线讲师,实操环境实践,现场答疑互动,培训内容覆盖:Docker方面:Docker架构、镜像、数据存储、网络、以及最佳实践。Kubernetes实战内容,Kubernetes设计、Pod、常用对象操作,Kuberentes调度系统、QoS、Helm、网络、存储、CI/CD、日志监控等。

  • 北京:5月10-12日

    报名链接:https://www.bagevent.com/event/2376547

  • 上海:5月17-19日

    报名链接:https://www.bagevent.com/event/2409655

  • 深圳:5月24-26日

    报名链接:https://www.bagevent.com/event/2409699


推荐阅读



点击阅读原文直达报名链接!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存