查看原文
其他

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

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

0x00 文章楔子

本文面向具有一定K8s使用经验的读者

1.13.0版本的kubeadm有了一个较大的发展,kubeadm配置文件的API已经进入了beta阶段。 并且kubeadm已经实验性的启用了直接通过kubeadm join命令构建HA master的功能,很大程度上简化了HA master的构建过程。 另一方面,heapster项目已经被废弃并从1.13.0版本开始停止支持,未来建议使用metrics和Prometheus代替。

本系列从1.13.0版本开始将直接使用kubeadm join实现HA master,也不再提供heapster插件,而是使用metrics替代之。 本方案中升级内核是必要的,为私有仓库单独准备一台机器也是必要的,如果私自跳过步骤或调整结构,个人对脚本运行的结果不做保证

本文中的自动化部署脚本可以在Lentil1016/kubeadm-ha找到,欢迎Star/Fork/提issue和PR。 在我的环境上进行示例自动化部署的录像可以在该链接查看

集群方案:

  • 发行版:CentOS 7

  • 容器运行时:Docker-17.03.2-ce

  • 内核: 4.19.6-300.fc29.x86_64

  • 版本:Kubernetes: 1.13.0

  • 网络方案: Calico

  • kube-proxy mode: IPVS

  • master高可用方案:keepalived LVS

  • DNS插件: CoreDNS

  • metrics插件:metrics-server

  • 界面:kubernetes-dashboard

  • ingress控制器:traefik

0x01 Kubernetes集群搭建

集群结构摘要

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

进行系统配置

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

  • 关闭防火墙、selinux

  • 关闭系统的Swap,Kubernetes 1.8开始要求。

  • 关闭linux swap空间的swappiness

  • 配置L2网桥在转发包时会被iptables的FORWARD规则所过滤,该配置被CNI插件需要,更多信息请参考Network Plugin Requirements

  • 升级内核到最新,原因见issue#19

  • 开启IPVS

  1. # 所有主机:基本系统配置


  2. # 关闭Selinux/firewalld

  3. systemctl stop firewalld

  4. systemctl disable firewalld

  5. setenforce 0

  6. sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config


  7. # 关闭交换分区

  8. swapoff -a

  9. yes | cp /etc/fstab /etc/fstab_bak

  10. cat /etc/fstab_bak |grep -v swap > /etc/fstab


  11. # 设置网桥包经IPTables,core文件生成路径

  12. echo """

  13. vm.swappiness = 0

  14. net.bridge.bridge-nf-call-ip6tables = 1

  15. net.bridge.bridge-nf-call-iptables = 1

  16. """ > /etc/sysctl.conf

  17. sysctl -p


  18. # 同步时间

  19. yum install -y ntpdate

  20. ntpdate -u ntp.api.bz


  21. # 升级内核

  22. 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


  23. # 检查默认内核版本是否大于4.14,否则请调整默认启动参数

  24. grub2-editenv list


  25. #重启以更换内核

  26. reboot


  27. # 确认内核版本后,开启IPVS

  28. uname -a

  29. cat > /etc/sysconfig/modules/ipvs.modules <<EOF

  30. #!/bin/bash

  31. 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"

  32. for kernel_module in \${ipvs_modules}; do

  33. /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1

  34. if [ $? -eq 0 ]; then

  35. /sbin/modprobe \${kernel_module}

  36. fi

  37. done

  38. EOF

  39. 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

  1. # 所有主机:检查UUID和Mac


  2. cat /sys/class/dmi/id/product_uuid

  3. ip link

安装配置Docker

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

  1. # 所有主机:安装配置docker


  2. # 安装docker

  3. yum install -y yum-utils device-mapper-persistent-data lvm2

  4. yum-config-manager \

  5. --add-repo \

  6. https://download.docker.com/linux/centos/docker-ce.repo


  7. yum makecache fast

  8. yum install -y docker-ce


  9. # 编辑systemctl的Docker启动文件

  10. sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service


  11. # 启动docker

  12. systemctl daemon-reload

  13. systemctl enable docker

  14. systemctl start docker

安装私有镜像库

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

  1. # 所有主机:http私有源配置


  2. # 为Docker配置一下私有源

  3. mkdir -p /etc/docker

  4. echo -e '{\n"insecure-registries":["k8s.gcr.io", "gcr.io", "quay.io"]\n}' > /etc/docker/daemon.json

  5. systemctl restart docker


  6. # 此处应当修改为registry所在机器的IP

  7. REGISTRY_HOST="10.130.38.80"

  8. # 设置Hosts

  9. yes | cp /etc/hosts /etc/hosts_bak

  10. cat /etc/hosts_bak|grep -vE '(gcr.io|harbor.io|quay.io)' > /etc/hosts

  11. echo """

  12. $REGISTRY_HOST gcr.io harbor.io k8s.gcr.io quay.io """ >> /etc/hosts

下载链接:链接:https://pan.baidu.com/s/1ZdmgnrYGVobc22FX__vYwg 提取码:69gq ,随后将该文件放置到registry机器上,并在registry主机上加载、启动该镜像

  1. # registry:启动私有镜像库

  2. docker load -i /path/to/k8s-repo-1.13.0

  3. docker run --restart=always -d -p 80:5000 --name repo harbor.io:1180/system/k8s-repo:v1.13.0

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

1.13.0版本镜像列表

安装配置kubernetes

基本安装

首先下载链接:链接:https://pan.baidu.com/s/1t3EWAt4AET7JaIVIbz-zHQ 提取码:djnf ,并放置在k8s各个master和worker主机上

  1. # master & worker:安装kubernetes


  2. yum install -y socat keepalived ipvsadm

  3. cd /path/to/downloaded/file

  4. tar -xzvf k8s-v1.13.0-rpms.tgz

  5. cd k8s-v1.13.0

  6. rpm -Uvh * --force

  7. systemctl enable kubelet

  8. kubeadm version -o short

配置免密码登陆

  1. # master-1:生成ssh密钥对


  2. ssh-keygen

  3. # 三次回车后,密钥生成完成

  4. cat ~/.ssh/id_rsa.pub

  5. # 得到该机器的公钥如下图

将该公钥复制,并分别登陆到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

  1. # 部署HA master


  2. cd ~/


  3. # 创建集群信息文件

  4. echo """

  5. CP0_IP=10.130.29.80

  6. CP1_IP=10.130.29.81

  7. CP2_IP=10.130.29.82

  8. VIP=10.130.29.83

  9. NET_IF=eth0

  10. CIDR=10.244.0.0/16

  11. """ > ./cluster-info


  12. bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.13.0/kubeha-gen.sh)"

  13. # 该步骤将可能持续2到10分钟,在该脚本进行安装部署前,将有一次对安装信息进行检查确认的机会

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

访问dashboard

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

  1. echo """

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

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

安装helm

如果需要安装helm,请先下载离线包链接:链接:https://pan.baidu.com/s/1B7WHuomXOmZKhHai4tV5MA 提取码:kgzi

  1. cd /path/to/helm-v2.12.0-linux-amd64.tar/

  2. tar -xzvf helm-v2.12.0-linux-amd64.tar

  3. cd linux-amd64

  4. cp helm /usr/local/bin

  5. helm init --service-account=kubernetes-dashboard-admin --skip-refresh --upgrade

  6. helm version

加入work node

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

  1. # worker:将worker编入集群

  2. kubeadm join 10.130.29.83:6443 --token 4n3hvt.sb8qjmno6l47tsww --discovery-token-ca-cert-hash sha256:a7f1de577bd8677a5d7fe4d765993645ae25d8b52a63a1133b74a595a7bb2e0f

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

  1. # master-1:生成指向VIP的Join Command

  2. kubeadm token create --print-join-command|sed 's/${LOCAL_IP}/${VIP}/g'

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

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

PS:点击底部阅读原文,在原文网页与作者讨论交流;


作者:Lentil Sun

Channelsoft Software Engineer
Mail: lentil1016@gmail.com
Site: https://lentil1016.cn
Github: https://github.com/Lentil1016


---END---

K8S培训推荐

Kubernetes线下实战培训,采用3+1新的培训模式(3天线下实战培训,1年内可免费再次参加),资深一线讲师,实操环境实践,现场答疑互动,培训内容覆盖:Docker架构、镜像、数据存储、网络、以及最佳实践。Kubernetes实战内容,Kubernetes设计、Pod、常用对象操作,Kuberentes调度系统、QoS、Helm、网络、存储、CI/CD、日志监控等。<了解更多详情>

北京站:12月30-31日,1月1日,或1月4-6日,深圳站:12月21-23日;上海站:1月4-6日; 咨询/报名:曹辉/15999647409


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

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