kubeadm HA master(v1.12.1)集群搭建指南(离线包 + 自动化脚本 + ipvs + keepalived + calico + helm) For Centos/Fedora

2023年 7月 9日 63.9k 0

0x00 文章楔子

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

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

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

通过部署脚本驱动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.18.12-1.el7.elrepo.x86_64
    • Kubernetes: 1.12.1
    • 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

    进行系统配置

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

    • 关闭防火墙、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/10qwKtvVCeCRHccLrN-zQHg 提取码:ip4z,随后将该文件放置到harbor机器上,并在harbor主机上加载、启动该镜像

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

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

    1.12.1版本镜像列表

    安装配置kubernetes

    基本安装

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

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

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

    访问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,请先下载离线包链接:https://pan.baidu.com/s/1RZ8WOHQHQ951h2qlna85ig 提取码:02ni

    cd /path/to/helm-v2.11.0-linux-amd64.tar/
    tar -xzvf helm-v2.11.0-linux-amd64.tar
    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|sed 's/${LOCAL_IP}/${VIP}/g'

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

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

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论