一、前言 根据小伙伴提的问题,这里专门出一篇文章分析master节点挂了不可用的场景分析,希望这篇文章对小伙伴有用;其实VIP的方案实现高可用,还有更可靠的方案,也是我们目前生成环境在使用的高可用方案,后面也会分享出来,请小伙伴耐心等待二、配置多个master节点 如果直接部署单master或者多masterk8s环境,可以参考我这篇文章:云原生Kubernetes(k8s)最完整版环境部署(V1。24。1) 1)节点信息 hostname IP 节点类型 local168182110,clusterendpoint 192。168。182。110,VIP:192。168。182。220 master local168182111 192。168。182。111 node local168182112 192。168。182。112 node local168182113 192。168。182。112 masterbackup1 local168182130 192。168。182。112 masterbackup21)安装docker或containerd配置yum源cdetcyum。repos。d;mvCentOSLinuxbakcentos7wgetOetcyum。repos。dCentOSBase。repohttp:mirrors。aliyun。comrepoCentos7。repocentos8wgetOetcyum。repos。dCentOSBase。repohttp:mirrors。aliyun。comrepoCentos8。repo安装yumconfigmanager配置工具yumyinstallyumutils设置yum源yumconfigmanageraddrepohttp:mirrors。aliyun。comdockercelinuxcentosdockerce。repo安装dockerce版本yuminstallydockerce启动systemctlstartdocker开机自启systemctlenabledocker查看版本号dockerversion查看版本具体信息dockerversionDocker镜像源设置修改文件etcdockerdaemon。json,没有这个文件就创建添加以下内容后,重启docker服务:catetcdockerdaemon。jsonEOF{registrymirrors:〔http:hubmirror。c。163。com〕}EOF加载systemctlreloaddocker查看systemctlstatusdockercontainerd2)安装kubeadm,kubelet和kubectl1、配置k8syum源catetcyum。repos。dkubernetes。repoEOF〔k8s〕namek8senabled1gpgcheck0baseurlhttps:mirrors。aliyun。comkubernetesyumreposkubernetesel7x8664EOF2、修改sandboximage镜像源导出默认配置,config。toml这个文件默认是不存在的containerdconfigdefaultetccontainerdconfig。tomlgrepsandboximageetccontainerdconfig。tomlsedisk8s。gcr。iopauseregistry。aliyuncs。comgooglecontainerspausegetccontainerdconfig。toml或者sedisregistry。k8s。iopauseregistry。aliyuncs。comgooglecontainerspausegetccontainerdconfig。toml检查grepsandboximageetccontainerdconfig。toml3、配置containerdcgroup驱动程序systemd kubernets自1。24。0后,就不再使用docker。shim,替换采用containerd作为容器运行时端点。因此需要安装containerd(在docker的基础下安装),上面安装docker的时候就自动安装了containerd了。这里的docker只是作为客户端而已。容器引擎还是containerd。sedisSystemdCgroupfalseSystemdCgrouptruegetccontainerdconfig。toml应用所有更改后,重新启动containerdsystemctlrestartcontainerd4、开始安装kubeadm,kubelet和kubectl不指定版本就是最新版本,当前最新版就是1。25。4yuminstallykubelet1。25。4kubeadm1。25。4kubectl1。25。4disableexcludeskubernetesdisableexcludeskubernetes:禁掉除了这个kubernetes之外的别的仓库设置为开机自启并现在立刻启动服务now:立刻启动服务systemctlenablenowkubelet查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢systemctlstatuskubelet查看版本kubectlversionyuminfokubeadm5、master节点加入k8s集群证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificatekey,后面会用到CERTKEYkubeadminitphaseuploadcertsuploadcertstail1其中ttl0表示生成的token永不失效。如果不带ttl参数,那么默认有效时间为24小时。在24小时内,可以无数量限制添加worker。echokubeadmtokencreateprintjoincommandttl0controlplanecertificatekeyCERTKEYv5拿到上面打印的命令在需要添加的节点上执行controlplane标志通知kubeadmjoin创建一个新的控制平面。加入master必须加这个标记certificatekey。。。将导致从集群中的kubeadmcertsSecret下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadminitphaseuploadcertsuploadcerts)打印出的key。mkdirpHOME。kubesudocpietckubernetesadmin。confHOME。kubeconfigsudochown(idu):(idg)HOME。kubeconfig 查看节点kubectlgetnodeskubectlgetnodesowide 三、更换K8Smaster节点IP(master高可用)1)节点信息 hostname IP 节点类型 local168182110,clusterendpoint 192。168。182。110,VIP:192。168。182。220 master local168182111 192。168。182。111 node local168182112 192。168。182。112 node local168182113 192。168。182。112 masterbackup1 local168182130 192。168。182。112 masterbackup22)master节点安装keepalived1、安装keepalivedyuminstallkeepalivedy2、配置keepalived mastercatetckeepalivedkeepalived。confEOFglobaldefs{notificationemail{acassenfirewall。locfailoverfirewall。locsysadminfirewall。loc}notificationemailfromfageqq。comsmtpserver127。0。0。1smtpconnecttimeout30routeridNGINXMASTER}vrrpinstanceVI1{stateMASTERinterfaceens33virtualrouterid51VRRP路由ID实例,每个实例是唯一的priority100优先级,备服务器设置90advertint1指定VRRP心跳包通告间隔时间,默认1秒authentication{authtypePASSauthpass1111}虚拟IPvirtualipaddress{192。168。182。22024}trackscript{checknginx}}EOF masterbackup1catetckeepalivedkeepalived。confEOFglobaldefs{notificationemail{acassenfirewall。locfailoverfirewall。locsysadminfirewall。loc}notificationemailfromfageqq。comsmtpserver127。0。0。1smtpconnecttimeout30routeridNGINXMASTER}vrrpinstanceVI1{stateMASTERinterfaceens33virtualrouterid51VRRP路由ID实例,每个实例是唯一的priority90优先级,备服务器设置90advertint1指定VRRP心跳包通告间隔时间,默认1秒authentication{authtypePASSauthpass1111}虚拟IPvirtualipaddress{192。168。182。22024}trackscript{checknginx}}EOF masterbackup2catetckeepalivedkeepalived。confEOFglobaldefs{notificationemail{acassenfirewall。locfailoverfirewall。locsysadminfirewall。loc}notificationemailfromfageqq。comsmtpserver127。0。0。1smtpconnecttimeout30routeridNGINXMASTER}vrrpinstanceVI1{stateMASTERinterfaceens33virtualrouterid51VRRP路由ID实例,每个实例是唯一的priority80优先级,备服务器设置80advertint1指定VRRP心跳包通告间隔时间,默认1秒authentication{authtypePASSauthpass1111}虚拟IPvirtualipaddress{192。168。182。22024}trackscript{checknginx}}EOF3、启动并设置开机启动systemctldaemonreloadsystemctlrestartkeepalivedsystemctlenablekeepalivedsystemctlstatuskeepalived查看ipa 3)配置hosts192。168。182。110local168182110192。168。182。111local168182111192。168。182。112local168182112192。168。182。113local168182113VIP192。168。182。220clusterendpoint4)修改配置 到K8Smaster节点etckubernetesmanifests目录下,我们主要修改etcd。yaml,kubeapiserver。yaml这两个配置文件。这里使用sed批量替换cdetckubernetes先查greprn192。168。182替换ipsedis192。168。182。110192。168。182。220ggreprl。替换域名sedislocal168182110clusterendpointggreprl。检查grepr192。168。182 5)生成新的admin用config文件cdetckubernetesmvadmin。confadmin。confbak使用如下命令生成新的admin。confkubeadminitphasekubeconfigadminapiserveradvertiseaddress192。168。182。220clusterendpoint》192。168。182。220sedis192。168。182。220clusterendpointgadmin。conf6)删除旧的证书,生成新证书cdetckubernetespki先备份mvapiserver。keyapiserver。key。bakmvapiserver。crtapiserver。crt。bak使用如下命令生成kubeadminitphasecertsapiserverapiserveradvertiseaddress192。168。182。220apiservercertextrasans192。168。182。220,clusterendpointapiservercertextrasans192。168。182。220,clusterendpoint:设置了这个,之后加入节点验证证书阶段就不会报错了。 7)重启docker或者containerd,kubeletsystemctlrestartdockercontainerdkubelet查看,可以看到master节点现在已经起来了cdetckuberneteskubectlgetnodeskubeconfigadmin。conf修改配置,后续可以使用kubectlgetnodes查看K8S集群状态了cdetckubernetescpadmin。conf。kubeconfigkubectlgetnodes 8)查看ETCD查看etcdpodkubectlgetpodsnkubesystemgrepetcd登录PODNAMEkubectlgetpodsnkubesystemgrepetcdhead1awk{print1}kubectlexecitPODNAMEnkubesystemsh配置环境aliasetcdctletcdctlendpointshttps:127。0。0。1:2379cacertetckubernetespkietcdca。crtcertetckubernetespkietcdserver。crtkeyetckubernetespkietcdserver。key查看etcd集群成员列表etcdctlmemberlist9)解决node节点NotReady状态1、从master节点拷贝ca。crt到node节点对应的目录scpetckubernetespkica。crtlocal168182111:etckubernetespkiscpetckubernetespkica。crtlocal168182112:etckubernetespki2、修改node节点的kubelet。conf 把server:https:local168182110:6443修改为现在master节点的地址server:https:clusterendpoint:6443sedislocal168182110clusterendpointgetckuberneteskubelet。conf3、重启docker或者containerd,kubeletsystemctlrestartdockercontainerdkubelet四、故障模式测试1)模拟VIP漂移将master节点上的keepalived停掉systemctlstopkeepalived 查看节点信息kubectlgetnodes 从上图可知VIP已经漂移到masterbackup1节点了,不影响集群,接下来恢复故障。将master节点上的keepalived启动systemctlstartkeepalived 【结论】master节点故障恢复后,VIP会从新漂移回到原先的master节点。 查看节点信息kubectlgetnodes 2)节点故障测试(一台master故障) 模拟master节点故障(手动关机)关机192。168。182。110showdownhnow在192。168。182。113backupmaster节点查看集群节点状态kubectlgetnodes 【结论】一台master故障,不影响集群。3)master节点故障模拟(两台master故障) 2、模拟master节点故障(手动关机)关机192。168。182。113showdownhnow在192。168。182。130backupmaster节点查看集群节点状态kubectlgetnodes 【错误】Theconnectiontotheserverclusterendpoint:6443wasrefuseddidyouspecifytherighthostorport? 发现两个master节点,挂了一个master节点是不可用的。原因:当两个master节点还是需要2个节点可用。只有大于2个master节点才允许挂master节点,我们可以查一下允许的容器。会发现apiserver的容器一直在重启或者直接挂了,小伙伴也可以去查看一下日志。stackoverflow答案crictlps2devnull 【建议】所以我们部署多master高可用节点数量必须大于等于3,这样才能保证挂一个master节点,集群不会受影响。 K8Smaster节点更换IP以及master高可用故障模拟测试就先到这里,有任何疑问欢迎给我留言,后续会持续更新【云原生大数据】相关的文章