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

0x00 文章楔子

本文停止后续维护,请转至:

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

本文旨在通过最简易的方式指导读者搭建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集群的基本部署步骤:

  • 所有节点安装docker
  • harbor节点安装harbor
  • 所有master和minion节点安装kubelet kubeadm kubectl
  • 初始化master节点,并启动Calico容器
  • 将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
     
    # 安装4.18版本内核
    # 由于最新稳定版4.19内核将nf_conntrack_ipv4更名为nf_conntrack,目前的kube-proxy不支持在4.19版本内核下开启ipvs
    # 详情可以查看:https://github.com/kubernetes/kubernetes/issues/70304
    # 对于该问题的修复10月30日刚刚合并到代码主干,所以目前还没有包含此修复的kubernetes版本发出
    # 读者可以选择安装我提供的4.18版本内核,或者不开启IPVS
    # 4.18版本内核RPM下载链接:https://pan.baidu.com/s/1dCeozuMRQ96MBBjGpf0cjA 提取码:3nqg
    cd /path/to/kernel-ml.tgz/
    tar -xzvf kernel-ml.tgz
    rpm -Uvh kernel-ml/*
     
    # 检查默认内核版本为4.18,否则请调整默认启动参数
    grub2-editenv list
     
    #重启以更换内核
    reboot
     
    # 确认内核版本
    uname -a
     
    # 确认内核为4.18后,开启IPVS
    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
     
    # 启动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
    CIDR=172.168.0.0/16
    """ > ./cluster-info
     
    bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.11.0/kubeha-gen.sh)"
    # 该步骤将可能持续2到10分钟,在该脚本进行安装部署前,将有一次对安装信息进行检查确认的机会

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

    加入work node

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

    # worker:将worker编入集群
    kubeadm join --token fae76b.88ae6b2ad052b67f 10.130.29.83:6443 --discovery-token-ca-cert-hash sha256:9ed673962fd437dc556ccab07d02d718da01cf5db1b6eeaf443ecadd891a73e8

    其中包含了节点入编集群所需要携带的验证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 集群搭建完毕