kubeadm HA master(v1.11.0)集群搭建指南(离线包 + ipvs + keepalived + calico)

by lentil1016

Kubernetes中文社区 / 2018-09-17 22:37

0x00 文章楔子

本文旨在通过最简易的方式指导读者搭建HA kubernetes 1.11集群

通过部署脚本驱动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集群的基本部署步骤:

  1. 所有节点安装docker
  2. harbor节点安装harbor
  3. 所有master和minion节点安装kubelet kubeadm kubectl
  4. 初始化master节点,并启动Calico容器
  5. 将worker节点join到集群中

各个机器的主机信息以及IP分布如下:

  • Distribute: CentOS 7
  • Docker: 17.03.2-ce
  • Kernel: 4.4.152-1.el7.elrepo.x86_64
  • Kubernetes: 1.11.0
  • 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-lt-devel kernel-lt -y     # 检查默认内核版本高于4.1,否则请调整默认启动参数  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/17PV_VRYIbfmPz1qiiR_yGg 密码:newp,随后将该文件放置到harbor机器上,并在harbor主机上加载、启动该镜像

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

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

镜像列表

安装配置kubernetes

基本安装

首先下载链接:https://pan.baidu.com/s/1tOIFgnexs25XWHxitLmmVQ 密码:lqth,并放置在k8s各个master和worker主机上

# master & worker:安装kubernetes    yum install -y socat keepalived ipvsadm  cd /path/to/downloaded/file  tar -xzvf k8s-v1.11.0-rpms.tgz  cd k8s-v1.11.0  rpm -ivh *  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  """ > ./cluster-info     bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/master/kubeha-gen.sh)"  # 该步骤将可能持续2到10分钟,在该脚本进行安装部署前,将有一次对安装信息进行检查确认的机会

可以在该链接查看我在自己的环境上安装全过程的录像,安装结束后会打印出如下的信息,最后一行为加入集群的命令,其中加入集群的IP已经被更换为了高可用的VIP。

加入work node

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

# worker:将worker编入集群  kubeadm join