zoukankan      html  css  js  c++  java
  • K8s高可用集群部署(四)

    k8s官网高可用部署参考:https://kubernetes.io/docs/setup/independent/high-availability/

                    目录

    一 ,k8s高可用集群搭建原理

    二 ,k8s高可用搭建步骤


                                                    一, k8s高可用集群搭建原理
     在k8s集群中,pod节点挂掉还不用担心,它会有恢复,但是如果是单节点master挂掉了,那情况就危险了,会导致
    集群全部挂点,所以,需要给k8s集群做高可用,消除master的单点故障

    对于k8s,要做高可用,要考虑一下几点
    在kubernetes-1.15.以后的版本有些改变,如下:
    ****Apiserver****Apiserver****Apiserver****                                       (如果有三个,并不会影响与etcd的沟通)   
            ****ETCD****ETCD****ETCD****                                                 (当配置多主集群时,etcd会扩展)
    ****controller-manager****controller-manager****controller-manager         (在高可用集群中,是休眠状态,就是一个运行,其他休眠)
    ****scheduler****scheduler****scheduler****                                                (在高可用集群中,是休眠状态,就是一个运行,其他休眠)
                          ****kubelet****                                                                     (不需要做高可用)
                             ****Proxy****                                                                      (不需要做高可用)



    上图就是要搭建的集群架构

                                        二 , k8s高可用搭建步骤

    搭建目录:

    注:一定要慢慢来,按步骤做,不然出差不好找问题

    • 集群的准备
    • 集群各各节点初始化
    • 安装docker-ce
    • kubeadm安装搭建主从
    • 加入主节点,和从节点
    • ETCD集群查看
    • 部署网络Flannfly(集群内)

     (1)                                                                                                  集群的准备

    系      统 主  机   名 I P
    Centos7.6 matser01 192.168.30.145
    Centos7.6 master02 192.168.30.144
    Centos7.6 master03 192.168.30.143

                                                                                               三台master节点做高可用

    要求:三台master的cpu虚拟核数要>=4个  |    三台master节点机器要可以上网,可以相互连通。(确保每一台master都是一样的配置)


    (2)                                                                                           集群各各节点初始化

     这里初始化参看我的笔记部署k8s集群(二)

    这里初始化最后有一点不同

    部署k8s集群(二)   中部署到升级完内核后,重启reboor后,需要关闭NUMA

    如图:(这里是一定要是重启完后做)

    其中#vim grub 修改的是:"GRUB_CMDLINE_LINUX" 这一行最后添加numa=off (关闭的意思)添加完后,是这样的:GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off"  (每个人做可能quiet前不同,只要在最后添加即可)

     按图中步骤做完后,要再次重启机器*****


     (3)                                                                                             安装docker-ce

    *****所有节点都安装docker-ce*****

    安装需要的依赖包

    #yum install -y yum-utils   device-mapper-persistent-data lvm2

    下载docker-ce源

    #yum-config-manager     --add-repo      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    更新软件包并安装docker-ce

    #yum update -y && yum install -y docker-ce

    创建docker目录

    #mkdir /etc/docker

    #mkdir -p /etc/systemd/system/docker.service.d

    *上传文件daemon.json 到/etc/docker/   (如图:)

    启动docker-ce并开机自启

    #systemctl start docker && systemctl enable docker


    (4)                                                                                      kubeadm安装搭建主从

    开始搭建前,先部署调度

    部署调度(所有节点都要做)
    #modprobe br_netfilter
    #cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    #chmod 755 /etc/sysconfig/modules/ && bash /etc/sysconfig/modules/ipvs.modules
    #lsmod | grep -e ip_vs -e nf_conntrack_ipv4


    调度做完,开始部署kubeadm

    这里每个节点都采用的是睿云的镜像包,下载以下包 如图

     导入docker

    #docker load -i haproxy.tar

    #dcoker load -i keepalived.tar

    解压

    #tar zxvf kubeadm-basic.images.tar .gz

    修改load-images.sh

    如图:通过pwd这里先找到解压后的路径,并复制粘贴到load-images.sh中“cd”和“ls” 这两行

     

     完成后,对这个文件加权限

    #chmod a+x load-images.sh

    加完权限后,开始执行权限

    #./load-images.sh

    每个节点都做完以上操作后,解压start文件

    #tar zxvf start.keep.tar.gz

    #mv data /

    #cd /data/lb/  

     这里的yaml文件是Kubeadm的配置文件,另外两个sh文件是启动脚本

    进入etc目录下,有一个haproxy的文件,修改,再最后一行加入本负载节点IP与端口

    保存退出后,修改start-haproxy,sh文件,如下图(修改前几行,加入节点IP)

     

     启动haproxy

    #./start-haproxy.sh

    查看一下是否成功监听

    修改keepalived文件 如下图(定义一个VIP在第一行添加修改,第二行是当前网卡名)

     其他不做修改,保存退出即可

    启动#./start-keepalived.sh

    查看一下是否开启

    #ip a


    (4)                                                                加入主节点,和从节点

    ************以上做完后,就可以 创建集群了(开始安装kubeadm)

    加入源

     #yum -y install kubeadm-1.15.1  kubectl-1.15.1  kubelet-1.15.1

    #systemc  enable  kubelet.service

    Kub,生成yaml文件 如图

    #cd /usr/local/kubernetes/install

    #kubeadm config print init-defaults > kubeadm-config.yaml

     修改kubeadm-config.yaml (红色为必要修改内容)

    cat

    *******************************************************************

    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:2
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.30.145
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: k8s-master01
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: "192.168.30.140:6444"
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.15.1
    networking:
      dnsDomain: cluster.local
      podSubnet: "10.244.0.0/16"
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    featureGates:
      SupportIPVSProxyMode: true
    mode: ipvs

    ***********************************************************************************

    修改完成后,可以初始化了

    #kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs  |tee kubeadm-init.log

    这里初始化完成后,跟以前单节点不一样,会多出一些信息,如图

     先按文件要求走三步,如图,

     #mkdir -p $HOME/.kube

    #sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

    #sudo chown $(id -u):$(id -g) $HOME/.kube/config

    做完后,查看是否生效

    #kubelct  get  node

     此时,一个节点就部署完成

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    加入其他主节点,要和这个节点安装的包要一致

    首先在此节点上

    #scp -r /data 192.168.30.144:/

    #scp -r /data 192.168.30.143:/

    导入docker

    #docker load -i haproxy.tar

    #dcoker load -i keepalived.tar

    安装kubadm(跟上面一样)注意不要初始化,到改完配置文件即可

    #systemctl  enable  kubelet.service 

    最后,也是最重要一步:在主节点上找到Log文件,复制粘贴到其他节点并运行,如图

     这里注意,要添加的节点要做完三步后,再拷贝主节点的配置文件内容到本节点初始化如图

    复制以下部分到其他要加入节点(192.168.30.144)

     此时,加入完成后,在主节点需改haproxy.cfg文件

     在最后加入节点IP(注意:这里最好是在节点部署都完成后,最后加入节点IP,如果是提前加,可能启动会识别不到,会报错)

     在第一台主机上重新做一下docker镜像

    #docker ps -a 

    #docker  rm -f HAProxy-K8S && bash  /data/lb/start-haproxy.sh

     然后把haproxy.cfg文件拷贝到要加入的节点机器,并也运行以上命令,如图

    最后,查询是否加入成功

    # kubectl get pod -n kube-system

     到这里基本上部署已经完成了,再加入节点和以上方法一样


    (5)                                                                   ETCD集群查看

     查看状态:

    #kubectl get endpoints kube-controller-manager --namespace=kube-system -o yaml

    #kubectl get endpoints kube-scheduler --namespace=kube-system -o yaml


    (6)                                                                  部署网络Flannfly(集群内)

    部署网络:这里部署网络让每一个节点可以通网(方法和单机部署一样,都是部署Flannly)

    #mkdir k8s-flannly

    #cd  k8s-flannly

    #wget  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    #kubectl create -f kube-flannel.yml

    *******在这里可能下载不稳定,做一下域名映射到ip*********

    查询IP:https://site.ip138.com/raw.githubusercontent.com/

    会出现出个IP,选择离我们最近的,目前最近的是中国香港 :   151.101.76.133

    然后在/etc/hosts文件里加入:   151.101.76.133  raw.githubusercontent.com

    保存退出后,再次尝试wget下载,就可以了

    *******************************************************************

    启动网络部署

    #kubectl apply -f   kube-flannel.yml

    查看是否运行成功

    #kubectl get pod -n kube-system

    #kubectl  get nodes   

     此刻网络状态便通了

  • 相关阅读:
    ThreadPoolExecutor线程池和ProcessPoolExecutor进程池
    canvas画一个时钟
    js中一些注意点 ps不断更新中....
    javascript文档节点
    Go网络编程
    Goroutine和Channel
    Go单元测试
    简单了解Go语言JSON包
    Go的命令行参数
    Go语言文件操作
  • 原文地址:https://www.cnblogs.com/123456likun/p/13903163.html
Copyright © 2011-2022 走看看