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   

     此刻网络状态便通了

  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/123456likun/p/13903163.html
Copyright © 2011-2022 走看看