zoukankan      html  css  js  c++  java
  • kubeadm HA master(v1.14.0)离线包 + 自动化脚本 + 常用插件 For Centos/Fedora

    关于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 百度盘 crv5 ffbe37fe328d99156d14a950bbd8107c
    k8s-v1.14.0-rpms.tgz    百度盘    okdg    7cccc6b10e17a6c640baced768aab274
    k8s-repo-v1.14.0    百度盘    88ua    96af3a2da51460f8e51321e15094fdd2
    kernel-ml-5.0.4.tgz    百度盘    twl3    8e546a243f6fd5ca3ebe1d30079d2bac

    本文中的自动化部署脚本可以在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 Name    Role    IP
    centos-7-x86-64-29-80    master-1    172.18.128.132
    centos-7-x86-64-29-81    master-2    172.18.128.133
    centos-7-x86-64-29-82    master-3    172.18.128.134
    –    Virtual IP    172.18.128.119
    node1    worker    172.18.128.129
    node2    worker    172.18.128.130
    node3    worker    172.18.128.131

    进行系统配置

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

    关闭防火墙、selinux
    关闭系统的Swap,Kubernetes 1.8开始要求。
    关闭linux swap空间的swappiness
    配置L2网桥在转发包时会被iptables的FORWARD规则所过滤,该配置被CNI插件需要,更多信息请参考Network Plugin Requirements(https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements)

    升级内核到最新,原因见issue#19(https://github.com/Lentil1016/kubeadm-ha/issues/19)
    开启IPVS
    如果发现elrepo-kernel源中的内核版本过高或过低,无法满足要求,可以使用下面测试过的5.0.4版本rpm包:

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

    # 关闭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}
    fi
    done
    EOF
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
    
    
    安装配置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
    
    安装私有镜像库
    如果不能FQ,需要使用本文提供的私有镜像源,则还需要为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
    
    # 下载镜像,我把相关镜像上传到dockhub上,执行下面脚本
    cat > pull_images.sh <<EOF
    #! /bin/sh
    for i in kube-proxy:v1.14.0 kube-controller-manager:v1.14.0 kube-scheduler:v1.14.0 kube-apiserver:v1.14.0 coredns:1.3.1 etcd:3.3.10 pause:3.1 traefik:1.7.9 addon-resizer:1.8.4 metrics-server-amd64:v0.3.1 kubernetes-dashboard-amd64:v1.10.1
    do 
    docker pull kangkangluma/k8s-v1.14.0-$i
    docker tag kangkangluma/k8s-v1.14.0-$i k8s.gcr.io/$i
    docker rmi kangkangluma/k8s-v1.14.0-$i
    done
    
    for i in node:v3.5.3 cni:v3.5.3
    do
    docker pull kangkangluma/k8s-v1.14.0-$i
    docker tag kangkangluma/k8s-v1.14.0-$i quay.io/calico/$i
    docker rmi kangkangluma/k8s-v1.14.0-$i
    done
    EOF
    sh pull_images.sh
    
    
    安装配置kubernetes
    基本安装
    下载文件:
    
    k8s-v1.14.0-rpms.tgz    百度盘    okdg    7cccc6b10e17a6c640baced768aab274
    并放置在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=172.18.128.132
    CP1_IP=172.18.128.133
    CP2_IP=172.18.128.134
    VIP=172.18.128.119
    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 """
    172.18.128.119 dashboard.multi.io ingress.multi.io""" >> /etc/hosts


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

    安装helm
    如果需要安装helm,请先下载离线包:

    helm-v2.13.1-linux-amd64.tar.gz    百度盘    crv5    ffbe37fe328d99156d14a950bbd8107c
    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 Command
    kubeadm token create --print-join-command


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

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

  • 相关阅读:
    asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
    C#中DataTable中的Compute方法使用收集
    c#的DateTime.Now函数详解
    附加数据库失败,拒绝访问
    xml文件绑定chenckbox选择框
    Maximum Xor Secondary(单调栈好题)
    Y(类树形DP)
    Average distance(类树形DP)
    Balls and Boxes (模拟题)
    Party at Hali-Bula(树形DP+判断方案数是否唯一)
  • 原文地址:https://www.cnblogs.com/malukang/p/11428870.html
Copyright © 2011-2022 走看看