• 【云原生】K8S master节点更换IP以及master高可用故障模拟测试


    一、前言

    根据小伙伴提的问题,这里专门出一篇文章分析master节点挂了不可用的场景分析,希望这篇文章对小伙伴有用;其实VIP的方案实现高可用,还有更可靠的方案,也是我们目前生成环境在使用的高可用方案,后面也会分享出来,请小伙伴耐心等待~

    二、配置 多个master 节点

    如果直接部署单master或者多master k8s环境,可以参考我这篇文章:Kubernetes(k8s)最新版最完整版环境部署+master高可用实现

    1)节点信息

    hostnameIP节点类型
    local-168-182-110,cluster-endpoint192.168.182.110,VIP:192.168.182.220master
    local-168-182-111192.168.182.111node
    local-168-182-112192.168.182.112node
    local-168-182-113192.168.182.112master backup1
    local-168-182-130192.168.182.112master backup2

    1)安装docker或containerd

    # 配置yum源
    cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
    # centos7
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    # centos8
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
    
    # 安装yum-config-manager配置工具
    yum -y install yum-utils
    # 设置yum源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 安装docker-ce版本
    yum install -y docker-ce
    # 启动
    systemctl start docker
    # 开机自启
    systemctl enable docker
    # 查看版本号
    docker --version
    # 查看版本具体信息
    docker version
    
    # Docker镜像源设置
    # 修改文件 /etc/docker/daemon.json,没有这个文件就创建
    # 添加以下内容后,重启docker服务:
    cat >/etc/docker/daemon.json<<EOF
    {
       "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    EOF
    # 加载
    systemctl reload docker
    
    # 查看
    systemctl status docker containerd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2)安装kubeadm,kubelet和kubectl

    1、配置k8s yum源
    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [k8s]
    name=k8s
    enabled=1
    gpgcheck=0
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2、修改sandbox_image 镜像源
    # 导出默认配置,config.toml这个文件默认是不存在的
    containerd config default > /etc/containerd/config.toml
    grep sandbox_image  /etc/containerd/config.toml
    sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml
    # 或者
    sed -i "s#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml
    # 检查
    grep sandbox_image  /etc/containerd/config.toml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3、配置containerd cgroup 驱动程序systemd

    kubernets自v1.24.0后,就不再使用docker.shim,替换采用containerd作为容器运行时端点。因此需要安装containerd(在docker的基础下安装),上面安装docker的时候就自动安装了containerd了。这里的docker只是作为客户端而已。容器引擎还是containerd

    sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
    # 应用所有更改后,重新启动containerd
    systemctl restart containerd
    
    • 1
    • 2
    • 3
    4、开始安装kubeadm,kubelet和kubectl
    # 不指定版本就是最新版本,当前最新版就是1.25.4
    yum install -y kubelet-1.25.4  kubeadm-1.25.4  kubectl-1.25.4 --disableexcludes=kubernetes
    # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
    # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
    systemctl enable --now kubelet
    
    # 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
    systemctl status kubelet
    
    # 查看版本
    
    kubectl version
    yum info kubeadm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    5、master节点加入k8s集群
    # 证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificate key,后面会用到
    CERT_KEY=`kubeadm init phase upload-certs --upload-certs|tail -1`
    
    # 其中 --ttl=0 表示生成的 token 永不失效. 如果不带 --ttl 参数, 那么默认有效时间为24小时. 在24小时内, 可以无数量限制添加 worker.
    echo `kubeadm token create --print-join-command --ttl=0` " --control-plane --certificate-key $CERT_KEY --v=5"
    
    # 拿到上面打印的命令在需要添加的节点上执行
    
    # --control-plane 标志通知 kubeadm join 创建一个新的控制平面。加入master必须加这个标记
    # --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadm init phase upload-certs --upload-certs)打印出的key。
    
    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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    查看节点

    kubectl get nodes
    kubectl get nodes -owide
    
    • 1
    • 2

    在这里插入图片描述

    三、更换 K8S master 节点 IP(master 高可用)

    1)节点信息

    hostnameIP节点类型
    local-168-182-110,cluster-endpoint192.168.182.110,VIP:192.168.182.220master
    local-168-182-111192.168.182.111node
    local-168-182-112192.168.182.112node
    local-168-182-113192.168.182.112master backup1
    local-168-182-130192.168.182.112master backup2

    2)master节点安装keepalived

    1、安装 keepalived
    yum install keepalived -y
    
    • 1
    2、配置 keepalived

    master

    cat > /etc/keepalived/keepalived.conf << EOF
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from fage@qq.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id NGINX_MASTER
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
        priority 100    # 优先级,备服务器设置 90
        advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        # 虚拟IP
        virtual_ipaddress {
            192.168.182.220/24
        }
        track_script {
            check_nginx
        }
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    master backup1

    cat > /etc/keepalived/keepalived.conf << EOF
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from fage@qq.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id NGINX_MASTER
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
        priority 90    # 优先级,备服务器设置 90
        advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        # 虚拟IP
        virtual_ipaddress {
            192.168.182.220/24
        }
        track_script {
            check_nginx
        }
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    master backup2

    cat > /etc/keepalived/keepalived.conf << EOF
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from fage@qq.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id NGINX_MASTER
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
        priority 80    # 优先级,备服务器设置 80
        advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        # 虚拟IP
        virtual_ipaddress {
            192.168.182.220/24
        }
        track_script {
            check_nginx
        }
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    3、启动并设置开机启动
    systemctl daemon-reload
    systemctl restart keepalived && systemctl enable keepalived && systemctl status keepalived
    
    # 查看
    ip a
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    3)配置hosts

    192.168.182.110 local-168-182-110
    192.168.182.111 local-168-182-111
    192.168.182.112 local-168-182-112
    192.168.182.113 local-168-182-113
    # VIP
    192.168.182.220 cluster-endpoint
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4)修改配置

    到K8S master节点/etc/kubernetes/manifests目录下,我们主要修改etcd.yamlkube-apiserver.yaml这两个配置文件。

    # 这里使用sed批量替换
    cd /etc/kubernetes/
    # 先查
    grep -rn '192.168.182' *
    # 替换ip
    sed -i 's/192.168.182.110/192.168.182.220/g' `grep -rl  ./`
    # 替换域名
    sed -i 's/local-168-182-110/cluster-endpoint/g' `grep -rl  ./`
    
    # 检查
    grep -r '192.168.182' *
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    5)生成新的admin用config文件

    cd /etc/kubernetes
    
    mv admin.conf admin.conf_bak
    
    # 使用如下命令生成新的admin.conf
    kubeadm init phase kubeconfig admin --apiserver-advertise-address 192.168.182.220 
    # cluster-endpoint-》192.168.182.220
    sed -i 's/192.168.182.220/cluster-endpoint/g' admin.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6)删除旧的证书,生成新证书

    cd /etc/kubernetes/pki
    
    # 先备份
    mv apiserver.key apiserver.key.bak
    mv apiserver.crt apiserver.crt.bak
    
    # 使用如下命令生成
    kubeadm init phase certs apiserver --apiserver-advertise-address 192.168.182.220 --apiserver-cert-extra-sans "192.168.182.220,cluster-endpoint"
    #  --apiserver-cert-extra-sans "192.168.182.220,cluster-endpoint":设置了这个,之后加入节点验证证书阶段就不会报错了。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    7)重启docker或者containerd,kubelet

    systemctl restart docker containerd kubelet
    
    # 查看,可以看到master节点现在已经起来了
    cd /etc/kubernetes
    kubectl get nodes --kubeconfig=admin.conf
    
    # 修改配置,后续可以使用kubectl get nodes查看K8S集群状态了
    cd /etc/kubernetes
    cp admin.conf ~/.kube/config
    
    kubectl get nodes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    8)查看ETCD

    # 查看etcd pod
    kubectl get pods -n kube-system |grep etcd
    
    # 登录
    POD_NAME=`kubectl get pods -n kube-system |grep etcd|head -1|awk '{print $1}'`
    kubectl exec -it $POD_NAME -n kube-system -- sh
    
    ## 配置环境
    alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'
     
    ## 查看 etcd 集群成员列表
    etcdctl member list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    9)解决 node 节点 NotReady状态

    1、从master节点拷贝ca.crt到node节点对应的目录
    scp /etc/kubernetes/pki/ca.crt local-168-182-111:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/ca.crt local-168-182-112:/etc/kubernetes/pki/
    
    • 1
    • 2
    2、修改node节点的kubelet.conf

    server: https://local-168-182-110:6443修改为现在master节点的地址server: https://cluster-endpoint:6443

    sed -i 's/local-168-182-110/cluster-endpoint/g' /etc/kubernetes/kubelet.conf
    
    • 1
    3、重启docker或者containerd,kubelet
    systemctl restart docker containerd kubelet
    
    • 1

    四、故障模式测试

    1)模拟VIP漂移

    # 将master节点上的keepalived 停掉
    systemctl stop keepalived
    
    • 1
    • 2

    在这里插入图片描述
    查看节点信息

    kubectl get nodes
    
    • 1

    在这里插入图片描述

    从上图可知VIP已经漂移到master backup1节点了,不影响集群,接下来恢复故障。

    # 将master节点上的keepalived 启动
    systemctl start keepalived
    
    • 1
    • 2

    在这里插入图片描述

    【结论】master节点故障恢复后,VIP会从新漂移回到原先的master节点。

    查看节点信息

    kubectl get nodes
    
    • 1

    在这里插入图片描述

    2)节点故障测试(一台master故障)

    模拟master节点故障(手动关机)

    # 关机192.168.182.110
    showdown -h now
    # 在192.168.182.113	backup master节点查看集群节点状态
    kubectl get nodes
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    【结论】一台master故障,不影响集群。

    3)master节点故障模拟(两台master故障)

    2、模拟master节点故障(手动关机)

    # 关机192.168.182.113
    showdown -h now
    # 在192.168.182.130	backup master节点查看集群节点状态
    kubectl get nodes
    
    • 1
    • 2
    • 3
    • 4

    【错误】The connection to the server cluster-endpoint:6443 was refused - did you specify the right host or port?

    发现两个master节点,挂了一个master节点是不可用的。原因:当两个master节点还是需要2个节点可用。只有大于2个master节点才允许挂master节点,我们可以查一下允许的容器。会发现api-server的容器一直在重启或者直接挂了,小伙伴也可以去查看一下日志。stackoverflow答案

    crictl ps 2>/dev/null
    
    • 1

    在这里插入图片描述

    【建议】所以我们部署多master高可用节点数量必须大于等于3,这样才能保证挂一个master节点,集群不会受影响。

    K8S master节点更换IP以及master高可用故障模拟测试就先到这里,有任何疑问欢迎给我留言,后续会持续更新【云原生+大数据】相关的文章~

  • 相关阅读:
    eBPF书籍和教程良心推荐
    aliyun-oss-react-native 安卓使用报错的问题
    前端Mock神器-Apifox
    MySQL - 为什么索引结构默认使用B+树,而不是其他?
    低时延、高可靠、华为云CDN赋能中小企业
    JS实现数组去重的八种方法(实用)
    好心情平台:30分钟就可改善抑郁情绪的运动处方
    强化学习 导论
    【Python笔记-设计模式】状态模式
    安全开发运维必备,如何进行Nginx代理Web服务器性能优化与安全加固配置,看这篇指南就够了
  • 原文地址:https://blog.csdn.net/qq_35745940/article/details/127954623