• Kubeadm部署K8s


    Kubeadm部署K8s

    集群规划:
    在这里插入图片描述

    Master节点规划:

    在这里插入图片描述
    Node节点规划:

    在这里插入图片描述
    安装要求

    在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
    操作系统 CentOS7.x-86_x64
    硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
    集群中所有机器之间网络互通
    可以访问外网,需要拉取镜像
    禁止swap分区
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此实验机器规划如下:

    k8s-master  42.51.227.113    Centos 7.x-X86_64
    k8s-node1   42.51.227.114  Centos 7.x-X86_64
    k8s-node2   42.51.227.115  Centos 7.x-X86_64
    k8s-node3   42.51.227.116  Centos 7.x-X86_64
    
    • 1
    • 2
    • 3
    • 4

    在各节点执行—修改主机名

    hostnamectl --static set-hostname k8s-master
    hostnamectl --static set-hostname k8s-node1
    hostnamectl --static set-hostname k8s-node2
    hostnamectl --static set-hostname k8s-node3
    
    • 1
    • 2
    • 3
    • 4

    在各节点执行—修改hosts文件

    cat <<EOF > /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    42.51.227.113  k8s-master
    42.51.227.114  k8s-node1
    42.51.227.115  k8s-node2
    42.51.227.116  k8s-node3
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在各节点执行—修改DNS

    cat <<EOF> /etc/resolv.conf
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    EOF
    
    • 1
    • 2
    • 3
    • 4

    在各节点执行—设置个性主机名:

    带时间的个性主机名
    echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\t\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc
    
    不带时间的个性主机名
    echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在各节点执行—关闭CentOS7自带的防火墙服务

    systemctl disable firewalld && systemctl stop firewalld
    
    • 1

    在各节点执行—关闭selinux

    sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0
    
    • 1

    在各节点执行—互相信任

    ssh-keygen
    ssh-copy-id xxx
    
    • 1
    • 2

    在各节点都采用网络时间服务器

    安装时间服务器软件

    yum install -y chrony
    
    • 1

    修改配置文件/etc/chrony.conf

    sed -i -e '/^server/d' -e '1aserver ntp.aliyun.com iburst\nserver tw.pool.ntp.org iburst' -e '/local stratum 10/clocal stratum 10\nbindcmdaddress 127.0.0.1\nbindcmdaddress ::1' /etc/chrony.conf
    
    • 1

    chronyd服务启动并自启

    systemctl enable chronyd --now && systemctl restart chronyd
    
    • 1

    检查323 udp端口的监听是否是*:323

    ss -ntlup | grep 323
    
    • 1

    检查时间同步状态

    chronyc sources
    
    • 1

    在各节点执行—安装基础软件:ebtables ethtool否则执行 kubeadm init会报错

    yum install vim wget yum-utils device-mapper-persistent-data lvm2 ebtables ethtool -y
    
    • 1

    在各节点执行—添加阿里yum源

    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache
    
    • 1

    在各节点执行—添加docker阿里yum源–选一项即可

    1.
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    2.
    wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo && yum makecache fast
    
    • 1
    • 2
    • 3
    • 4

    在各节点执行—配置kubernetes国内阿里yum源

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo 
    [kubernetes] 
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
    enabled=1 
    #gpgcheck=1 
    #repo_gpgcheck=1 
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在各节点执行—生成缓存

    yum makecache fast -y
    
    • 1

    在各节点执行—生成系统及软件包

    yum update -y
    
    • 1

    在各节点执行—安装docker-ce—不指定版本将安装最新版本

    yum -y install docker-ce
    
    • 1

    如果指定版本:

    1.列出所有版本的 Docker CE
    yum list docker-ce --showduplicates | sort -r
    2.可以安装特定版本
    yum install docker-ce-18.06.2.ce-3.el7 containerd.io -y
    
    • 1
    • 2
    • 3
    • 4

    在各节点执行—启动docker并设置为开机启动

    systemctl enable docker --now
    
    • 1

    在各节点执行—配置镜像加速器和日志驱动和修改docker cgroup驱动,与k8s一致,使用systemd方式

    sudo tee /etc/docker/daemon.json <<-'EOF' 
    { 
        "registry-mirrors": ["https://nty7c4os.mirror.aliyuncs.com"],
        "live-restore":true,
        "exec-opts":["native.cgroupdriver=systemd"],
        "log-driver":"json-file",
        "log-opts":{
             "max-size":"100m",
             "max-file":"3"
        }
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Ps:备注:systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.cgroupfs是docker自带的

    热加载配置和重启docker

    systemctl daemon-reload && systemctl restart docker
    
    • 1

    在各节点执行—升级内核到5.7

    自带3.10内核存在BUG,建议升级到4.10.x及以上版本
    BUG介绍:https://myit.icu/index.php/archives/389/
    rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
    rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    在各节点执行---安装kernel-ml内核   lt:长期维护版本,ml:长期稳定版本
    yum -y --enablerepo=elrepo-kernel install kernel-ml.x86_64 kernel-ml-devel.x86_64
    在各节点执行---查看启动器
    awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
    在各节点执行---设置默认启动为新内核---0后边内核为5.x,根据实际情况选择
    grub2-set-default 0
    在各节点执行---重启系统
    reboot
    Ps:重启后查看内核是否为:5.8.xxx,按当时装的最新版本为准
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在各节点执行—永久关闭swap

    swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
    
    • 1

    kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换,设计者不想交换,因为它会减慢速度,所以关闭swap主要是为了性能考虑。

    在各节点执行—加载 ipvs 模块,保证在节点重启后能自动加载所需模块—kube-proxy开启ipvs的前置条件

    yum install ipset ipvsad -y
    
    
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    #开启ipvs,最新支持的负载均衡(SLB)
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4   # 内核新版本改为nf_conntrack
    modprobe -- br_netfilter
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在各节点执行—赋值权限并执行生效

    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
    
    • 1

    加载生效出现报错,请修改

    内核使用最新版本4.19.1,无法加载nf_conntrack_ipv4模块 
    4.19.1最新版本的内核,nf_conntrack_ipv4已经修改为nf_conntrack。
    
    • 1
    • 2

    在各节点执行—查看是否已经正确加载所需的内核模块

    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
    • 1

    在各节点执行—关闭邮箱服务(节省内存,根据自己实际来定)

    systemctl stop postfix.service && systemctl disable postfix.service
    
    • 1

    在各节点执行—查看kubernetes源当前状态

    yum repolist all | grep kubernetes
    
    • 1

    如果源状态为disable则需要开启—执行如下命令使kubernetes源生效。

    对于CentOS,执行yum-config-manager --enable 时,“repo_name”是执行yum repolist all | grep kubernetes时回显的第二个字段“Kubernetes”,“K”为大写

    在各节点执行—安装kubelet,不指定版本将安装最新版本

    yum -y install kubelet kubeadm kubectl --disableexcludes=kubernetes
    
    • 1

    参数解析:“–disableexcludes=kubernetes”表示在查找包的时候禁止排除kubernetes这个源
    查看当前系统存在的kubernetes的版本号

    yum list all | grep kubernetes
    
    • 1

    可选:也可以指定版本号:kubelet-1.18.2

    yum -y install kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes
    
    • 1

    链接:https://github.com/kubernetes/kubernetes/releases

    在各节点执行—查看k8s版本号

    kubelet --version
    
    • 1

    在各节点执行—查看配置文件目录

    # rpm -ql kubelet
    /etc/kubernetes/manifests  #清单目录
    /etc/sysconfig/kubelet  #配置文件
    /usr/bin/kubelet  #主程序
    /usr/lib/systemd/system/kubelet.service
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在各节点执行—设置开机自启

    systemctl enable kubelet
    
    • 1

    查看kubenets需要哪些镜像

    [root@k8s-master ~]# kubeadm config images list
    k8s.gcr.io/kube-apiserver:v1.18.2
    k8s.gcr.io/kube-controller-manager:v1.18.2
    k8s.gcr.io/kube-scheduler:v1.18.2
    k8s.gcr.io/kube-proxy:v1.18.2
    k8s.gcr.io/pause:3.2
    k8s.gcr.io/etcd:3.4.3-0
    k8s.gcr.io/coredns:1.6.7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们可以先提前下载这些镜像—但是要确认是否使用了代理,因为国内无法访问k8s.gcr.io

    kubeadm config images pull
    
    • 1

    如果没有国外代理机器,就使用以下脚本来使用阿里源镜像仓库下载后更改标签为k8s.gcr.io

    方法:

    vim /root/pullimages.sh
    #!/bin/bash
    #https://deanit.cn
    #使用阿里镜像仓库
    #查看版本号并替换为阿里镜像仓库源下载
    kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh -x
    #将镜像名字更改为原来的k8s.gcr.io
    docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh -x
    #将从阿里镜像仓库下载的镜像删除
    docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh -x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    赋值脚本权限并执行

    chmod a+x /root/pullimages.sh && sh /root/pullimages.sh
    
    • 1

    Node节点:

    Node节点仅需要这两个镜像,所以使用上边办法单独下载这两个镜像即可。

    k8s.gcr.io/kube-proxy:v1.18.2
    k8s.gcr.io/pause:3.2
    
    • 1
    • 2

    在k8s-master节点执行—使用kubeadm初始化集群

    指定版本:需要与我们上边安装的版本一致:–kubernetes-version=v1.18.2

    不指定版本:不指定版本,不添加–kubernetes-version=v1.18.2参数即可

    kubeadm init  --kubernetes-version=v1.18.2 --apiserver-advertise-address=42.51.227.113 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --dry-run
    
    • 1

    重要提示:–dry-run:试运行不应用任何变化;输出将要完成的工作,测试没问题后将该参数去掉执行即可!

    Ps:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。如果使用以上的两个方法拉取镜像,这里就不用再次指定镜像仓库地址就行了。

    在k8s-master节点执行—初始化完成后,根据提示执行以下三步

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    • 1
    • 2
    • 3

    保存以下内容:用于添加节点时需要

    kubeadm join 42.51.227.113:6443 --token p1vfu6.qt4hypzpvoyxfuaf \
    --discovery-token-ca-cert-hash sha256:6534570565aa1a8b66539287f2e478201bad41fa8c0fe2811533442e51f882f5 
    
    • 1
    • 2

    在k8s-master节点执行安装Pod网络插件—加入flannel

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    • 1

    Ps:确保能够访问到quay.io这个registery,有时会出现连接失败,我们可以先通过wget下载yml文件,再进行安装。
    在k8s-master节点执行—查看flannel镜像

    可以通过docker image list镜像列表看到quay.io/coreos/flannel镜像被下载,大小为52.8MB,因网络原因下载镜像慢可以等一会即可查看到flannel镜像

    [root@k8s-master ~]# docker images
    在这里插入图片描述
    执行了加入flannel命令并不代表就可以使用,我们可以通过kubectl get pods -n kube-system来获取当前系统上正在运行的pods,我们看到flannel处于正在运行的状态才算正常

    待测试方法:

    使用pod的网络通讯(这里使用七牛云镜像,七牛云相当于CDN资源)
    #下载flannel
    curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    #替换为七牛云镜像
    sed -i "s/quay.io\/coreos\/flannel/quay-mirror.qiniu.com\/coreos\/flannel/g" kube-flannel.yml
    #加入
    kubectl apply -f kube-flannel.yml
    #删除
    rm -f kube-flannel.yml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在k8s-master节点执行—验证pod信息—查看system名称空间下的所有pod**

    [root@k8s-master ~]# kubectl get pod -n kube-system

    kubectl get pods -o wide -A  #查看所有pod详细信息
    
    • 1

    在这里插入图片描述
    以上信息我们看到kube-flannel-ds-amd64-ckp6m已经处于运行中

    验证集群节点

    上面执行完命令后,集群不会马上变成ready状态,因为系统需要去下载docker镜像,稍等片刻后我们可以执行一下命令验证集群状态。

    -o wide:表示查看消息信息

    kubectl get node效果等于kubectl get nodes
    
    [root@k8s-master ~]# kubectl get node -o wide
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述
    验证pod信息查看system命名空间下的所有pods

    [root@k8s-master ~]# kubectl get pod -n kube-system
    
    • 1

    在这里插入图片描述

    Ps:当所有节点都变成ready后,所有pod的ready都变成1/1,表示集群搭建完成!!!

  • 相关阅读:
    数据分析 第二周 (条形图,散点图,直方图,numpy运算和数组广播机制)笔记
    【HTML】表格行和列的合并
    cad怎么转pdf格式
    负载均衡取消后的记录
    Python反射机制
    虚拟化逻辑架构: 创建KVM中的VM与实现VNC远程登录
    手动部署LNMP环境(Ubuntu 20)
    【鸿蒙(HarmonyOS)】List列表、ArkUI资源组数据类型
    (转)SpringCloud网关的解决方案
    MinIO 图片转文件的分界线RELEASE.2022-05-26T05-48-41Z
  • 原文地址:https://blog.csdn.net/qq_24442273/article/details/136523643