kubeadm 搭建多 master 高可用 K8S 集群(亲测)

Posted Imzhuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubeadm 搭建多 master 高可用 K8S 集群(亲测)相关的知识,希望对你有一定的参考价值。

1.kubernetes 简介

kubeadm

kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制,是一个可移植、可扩展的、开源的容器管理平台。

可移植:在 kubernetes 中部署的应用都是基于镜像的,镜像是可移植的,可以被多个环境使用,可以从一个环境迁移到另一个环境。不受操作系统限制。

可扩展:安装 k8s 的物理节点可以根据业务规模动态扩缩容、k8s 中的 pod 应用也可以实现自动扩缩容。

开源的:源代码已经公开了,有很多技术人员在开发维护,可以被用户免费使用。

Kubernetes 提供了应用程序的快速部署、升级和回滚的能力。

利用 service 可以实现服务注册、发现;

通过 kube-proxy 可以实现负载均衡;

通过 cordns 可实现域名解析;

通过 Ingress 可以实现七层负载均衡等功能;

可以对容器自动化部署、自动化扩缩容、跨主机管理等;

可以对代码进行灰度发布金丝雀发布蓝绿发布滚动更新等;

具有完整的监控系统和日志收集平台,具有故障自恢复的能力。

2.Kubernetes 组件

kubectl:管理 k8s 的命令行工具,可以操作 k8s 中的资源对象。

etcd: 是一个高可用的键值数据库,存储 k8s 的资源状态信息和网络信息的,etcd 中的数据变更

是通过 api server 进行的。

apiserver: 提供 k8s api,是整个系统的对外接口,提供资源操作的唯一入口,供客户端和其它组

件调用,提供了 k8s 各类资源对象(pod,deployment,Service 等)的增删改查,是整个系统的数据总

线和数据中心,并提供认证、授权、访问控制、API 注册和发现等机制,并将操作对象持久化到 etcd

中。相当于“营业厅”。

scheduler:负责 k8s 集群中 pod 的调度的 , scheduler 通过与 apiserver 交互监听到创建 Pod

副本的信息后,它会检索所有符合该 Pod 要求的工作节点列表,开始执行 Pod 调度逻辑。调度成功后将

Pod 绑定到目标节点上,相当于“调度室”。

controller-manager:作为集群内部的管理控制中心,负责集群内的 Node、Pod 副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

kubelet: 每个 Node 节点上的 kubelet 定期就会调用 API Server 的 REST 接口报告自身状态,API Server 接收这些信息后,将节点状态信息更新到 etcd 中。kubelet 也通过 API Server 监听 Pod信息,从而对 Node 机器上的 POD 进行管理:如创建、删除、更新 Pod

kube-proxy:提供网络代理和负载均衡,是实现 service 的通信与负载均衡机制的重要组件,kube-proxy 负责为 Pod 创建代理服务,从 apiserver 获取所有 service 信息,并根据 service 信息创建代理服务,实现 service 到 Pod 的请求路由和转发,从而实现 K8s 层级的虚拟转发网络,将到service 的请求转发到后端的 pod 上。

Calico:Calico 是一个纯三层的网络插件,calico 的 bgp 模式类似于 flannel 的 host-gw,calico在 kubernetes 中可提供网络功能和网络策略

Cordns:k8s1.11 之前使用的是 kube dns,1.11 之后才有 coredns,coredns 是一个 DNS 服务器,能够为 Kubernetes services 提供 DNS 记录

Docker:是一个容器引擎,用于运行容器

附加组件:

Web UI(Dashboard):Dashboard 是 k8s 集群的一个 web ui 界面,通过这个界面可以对 k8s资源进行操作,如创建 pod,创建存储,创建网络等,也可以监控 pod 和节点资源使用情况。

prometheus+alertmanager+Grafana:监控系统,可以对 kubernetes 集群本身的组件监控,也可对物理节点,容器做监控,对监控到的超过报警阀值的数据进行报警,这个报警会发送到指定的目标,如钉钉,微信,qq,slack 等。

efk-(全称 elasticsearch、fluentd、kibana):日志管理系统,可以对物理节点和容器的日志进行统一收集,把收集到的数据在 kibana 界面展示,kibana 提供按指定条件搜索和过滤日志。

Metrics:用于收集资源指标,hpa 需要基于 metrics 实现自动扩缩容

3.Kubernetes功能说明

1)Kubernetes 支持多种网络插件,如 flannel,calico,canel 等,每个插件都有独特的性能,可以分别适用于多种场景,我们可以利用 calico 的 network policy(网络策略)解决 k8s 中的网络隔离,对于多租户场景,可以每一个用户一个名称空间(namespace),然后对这个名称空间设置网络隔离。

2)高可用,高可扩展性

kubernetes 中支持多种高可用解决方案,如 keepalive+nginx,keepalived+haproxy 等,可以使访问流量分发到不同的主机节点,减轻节点压力,如果某个节点出现故障,可以实现秒级切换,达到高可用,保证业务不中断。

3)用户数据的持久化存储

kubernetes 支持多种持久化存储解决方案,保证数据可以得到很好的备份,降低用户数据丢失的风险,kubernetes 中可使用的存储方案如下:

本地存储:emptyDir,hostPath

网络连接类存储:

SAN(存储局域网络):iSCSI

NAS(网络附加存储):nfs,cifs

分布式存储:glusterfs,ceph-块级别的存储,cephfs-文件系统级别的存储

云存储:Azure Disk 等

4)拥有多种更新回滚策略

通过管理 kubernetes 的控制器和 service 等,可以实现灰度发布,蓝绿部署,金丝雀发布等,达到业务的快速部署和回滚等操作,用以满足不同客户的不同升级需求。

5)弹性伸缩

根据访问的流量压力,可以实现 pod 的水平扩容和缩减,达到秒级扩容,让 pod 始终处于满足业务正常运行时所需的数量即可,避免了资源的浪费。

6)节省资源,优化硬件资源的使用

根据流量进行业务组件的扩缩容,可节省机器资源。

4.实验开始


1.环境说明(centos7.9)

IP

主机名

角色

内存

CPU

192.168.3.200

master1

master1

4G

4vCPU

192.168.3.201

master2

master2

4G

4vCPU

192.168.3.202

work1

node1

4G

4vCPU

192.168.3.222


虚拟负载



2.架构图

kubeadm

3.配置静态 IP

把虚拟机或者物理机配置成静态 ip 地址,这样机器重新启动后 ip 地址也不会发生改变。以master1主机为例,修改静态 IP:

修改/etc/sysconfig/network-scripts/ifcfg-ens33 文件,变成如下:

cat /etc/sysconfig/network-scripts/ifcfg-ens33  

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=none

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=ens33

UUID=c1b3a69b-0dcc-44cd-847c-c3681ff5eb16

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.3.200

NETMASK=255.255.255.0

GATEWAY=192.168.3.1

DNS1=192.168.3.1

kubeadm

#修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:

systemctl restart network

注:/etc/sysconfig/network-scripts/ifcfg-ens33 文件里的配置说明:

NAME=ens33 #网卡名字,跟 DEVICE 名字保持一致即可

DEVICE=ens33 #网卡设备名,大家 ip addr 可看到自己的这个网卡设备名,每个人的机器可能

这个名字不一样,需要写自己的

BOOTPROTO=none #static或者none 表示静态 ip 地址

ONBOOT=yes #开机自启动网络,必须是 yes

IPADDR=192.168.3.200 #ip 地址,需要跟自己电脑所在网段一致

NETMASK=255.255.255.0 #子网掩码,需要跟自己电脑所在网段一致

GATEWAY=192.168.3.1 #网关,在自己电脑打开 cmd,输入 ipconfig /all 可看到

DNS1=192.168.3.1 #DNS,在自己电脑打开 cmd,输入 ipconfig /all 可看到

4.配置主机名

在 192.168.3.200 上执行如下:

hostnamectl set-hostname master1 && bash

在 192.168.3.201 上执行如下:

hostnamectl set-hostname master2 && bash

在 192.168.3.202 上执行如下:

hostnamectl set-hostname work1 && bash

5.配置 hosts 文件

修改每台机器的/etc/hosts 文件,增加如下三行:

192.168.3.200 master1

192.168.3.201 master2

192.168.3.202 work1

kubeadm

6.配置主机之间无密登录

生成 ssh 密钥对

[root@master1 ~]# ssh-keygen #一路回车,不输入密

把本地的 ssh 公钥文件安装到远程主机对应的账户

[root@master1 ~]# ssh-copy-id master1

[root@master1 ~]# ssh-copy-id master2

[root@master1 ~]# ssh-copy-id work1

[root@master2 ~]# ssh-keygen #一路回车,不输入密

把本地的 ssh 公钥文件安装到远程主机对应的账户

[root@master2 ~]# ssh-copy-id master1

[root@master2 ~]# ssh-copy-id master2

[root@master2 ~]# ssh-copy-id work1

[root@work1 ~]# ssh-keygen #一路回车,不输入密

把本地的 ssh 公钥文件安装到远程主机对应的账户

[root@work1 ~]# ssh-copy-id master1

[root@work1 ~]# ssh-copy-id master2

[root@work1 ~]# ssh-copy-id work1

6.关闭 firewalld 防火墙

centos7.9默认只有firewalld,没有IPtable,如果开启了IPtable也需要禁用掉

[root@master1 ~]# systemctl stop firewalld ; systemctl disable firewalld

[root@master2 ~]# systemctl stop firewalld ; systemctl disable firewalld

[root@work1 ~]# systemctl stop firewalld ; systemctl disable firewalld

7.关闭 selinux

[root@master1 ~]# sed -i s/SELINUX=enforcing/SELINUX=disabled/g

/etc/selinux/config

[root@master2 ~]# sed -i s/SELINUX=enforcing/SELINUX=disabled/g

/etc/selinux/config

[root@work1 ~]# sed -i s/SELINUX=enforcing/SELINUX=disabled/g

/etc/selinux/config

注意:修改 selinux 配置文件之后,reboot重启机器,selinux 才能永久生效

[root@master1 ~]#getenforce

Disabled

[root@master2 ~]#getenforce

Disabled

[root@work1 ~]#getenforce

Disabled

8.关闭交换分区 swap

[root@master1 ~]# swapoff -a

[root@master2 ~]# swapoff -a

[root@work1 ~]# swapoff -a

永久关闭:注释 swap 挂载

当内存不足时,linux 会自动使用 swap,将部分内存数据存放到磁盘中,这个这样会使性能下降。

关闭 swap 主要是为了性能考虑。设计者在设计 k8s 的时候,初衷就是解决性能问题

如果没有关闭 swap,可以指定--ignore-preflight-errors=Swap 忽略报错。

[root@master1 ~]# vim /etc/fstab 

kubeadm

systemctl restart network重启3台主机网络

9.修改内核参数

三台主机同样方法

[root@master1~]# modprobe br_netfilter

[root@master1~]# lsmod | grep br_netfilter

br_netfilter 22256 0

bridge 151336 1 br_netfilter

kubeadm

[root@master1 ~]# vi /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

[root@master1 ~]# sysctl -p /etc/sysctl.d/k8s.conf 

​为什么要要开启 ip_forward

如果容器的宿主机上的 ip_forward 未打开,那么该宿主机上的容器则不能被其他宿主机访问

为什么要开启 net.bridge.bridge-nf-call-ip6tables

默认情况下,从容器发送到默认网桥的流量,并不会被转发到外部。要开启转发:

net.bridge.bridge-nf-call-ip6tables = 1

为什么要加载 br_netfilter 模块?

在/etc/sysctl.conf 中添加:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

执行 sysctl -p 时出现:

kubeadm

解决办法:

modprobe br_netfilter

10.配置阿里云 repo 源

三台主机通配

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

11.配置阿里云安装 k8s 需要的 repo 源

三台主机通配

[root@master1 ~]# vi  /etc/yum.repos.d/kubemetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

enabled=1

gpgcheck=0

kubeadm

12.安装基础软件包

三台主机安装

​yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlibdevel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet

13.配置服务器时间跟网络时间同步

三台主机通配

[root@master1 ~]# ntpdate cn.pool.ntp.org

* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org

[root@master1 ~]# systemctl restart crond

14.开启 ipvs

三台通配

开启 IPVS,不开启 ipvs 将会使用 iptables,但是效率低,所以官网推荐需要开通 ipvs 内核

#上传 ipvs.modules 到 master1机器的/etc/sysconfig/modules/目录下

[root@master1 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

ip_vs_ftp 13079 0

nf_nat 26583 1 ip_vs_ftp

ip_vs_sed 12519 0

ip_vs_nq 12516 0

ip_vs_sh 12688 0

ip_vs_dh 12688 0

kubeadm

15.安装 docker-ce

三台通配

[root@master1 ~]# yum install docker-ce -y

[root@master1 ~]# systemctl start docker && systemctl enable docker

[root@master1 ~]# tee /etc/docker/daemon.json << EOF

"registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.dockercn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hubmirror.c.163.com"],

"exec-opts": ["native.cgroupdriver=systemd"]

 

EOF

[root@master1 ~]# systemctl daemon-reload

[root@master1 ~]# systemctl restart docker

[root@master1]# systemctl enable docker

[root@master1]# systemctl status docker

● docker.service - Docker Application Container Engine

Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset:  

disabled)

Active: active (running) since Sun 2022-01-20 22:22:40 CST; 7s ago

Docs: https://docs.docker.com

Main PID: 16748 (dockerd)

Active 是 running,表示 docker 运行正常

为什么要指定 native.cgroupdriver=systemd?

在安装 kubernetes 的过程中,会出现:

failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

文件驱动默认由 systemd 改成 cgroupfs, 而我们安装的 docker 使用的文件驱动是 systemd, 造成不一致, 导致镜像无法启动

docker info 查看

Cgroup Driver: systemd

修改 docker:

修改或创建/etc/docker/daemon.json,加入下面的内容:

"exec-opts": ["native.cgroupdriver=systemd"]

重启 docker 即可

16.安装初始化 k8s 需要的组件

三台通配

在 master 和 node 上安装 kubeadm、kubelet、kubectl 组件,用于后期安装 k8s 使用:

[root@master1 ~]# yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1

[root@master1 ~]# systemctl enable kubelet

注:每个软件包的作用

kubelet :运行在集群所有节点上,用于启动 Pod 和容器等对象的工具

kubeadm :用于初始化集群,启动集群的命令工具

kubectl :用于和集群通信的命令行,通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

17.通过 keepalive+nginx 实现 k8s apiserver 节点高可用

1.安装 nginx 主备

在 master1 和 master2 上做 nginx 主备安装

[root@master1 ~]# yum install nginx keepalived -y

[root@master2 ~]# yum install nginx keepalived -y  

2.修改 nginx 配置文件。主备一样

[root@master1 ~]# cat /etc/nginx/nginx.conf

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;


include /usr/share/nginx/modules/*.conf;


events

   worker_connections 1024;


# 四层负载均衡,为两台Master apiserver组件提供负载均衡

stream


   log_format  main  $remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent;


   access_log  /var/log/nginx/k8s-access.log  main;


   upstream k8s-apiserver

      server 192.168.3.200:6443;   # Master1 APISERVER IP:PORT

      server 192.168.3.201:6443;   # Master2 APISERVER IP:PORT

   


   server

      listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突

      proxy_pass k8s-apiserver;

   


http

   log_format  main  $remote_addr - $remote_user [$time_local] "$request"

                     $status $body_bytes_sent "$http_referer"

                     "$http_user_agent" "$http_x_forwarded_for";


   access_log  /var/log/nginx/access.log  main;


   sendfile            on;

   tcp_nopush          on;

   tcp_nodelay         on;

   keepalive_timeout   65;

   types_hash_max_size 2048;


   include             /etc/nginx/mime.types;

   default_type        application/octet-stream;


   server

       listen       80 default_server;

       server_name  _;


       location /

       

   

3.keepalive 配置

主 keepalived

[root@master1 ~]# cat /etc/keepalived/keepalived.conf

global_defs  

  notification_email  

    acassen@firewall.loc  

    failover@firewall.loc  

    sysadmin@firewall.loc  

   

  notification_email_from Alexandre.Cassen@firewall.loc  

  smtp_server 127.0.0.1  

  smtp_connect_timeout 30  

  router_id NGINX_MASTER

 


vrrp_script check_nginx

   script "/etc/keepalived/check_nginx.sh"


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.3.222/24

     

   track_script

       check_nginx

     


#vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)

#virtual_ipaddress:虚拟IP(VIP)

[root@master1 ~]# cat /etc/keepalived/check_nginx.sh  

#!/bin/bash

#1、判断Nginx是否存活

counter=`ps -C nginx --no-header | wc -l`

if [ $counter -eq 0 ]; then

   #2、如果不存活则尝试启动Nginx

   service nginx start

   sleep 2

   #3、等待2秒后再次获取一次Nginx状态

   counter=`ps -C nginx --no-header | wc -l`

   #4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移

   if [ $counter -eq 0 ]; then

       service  keepalived stop

   fi

fi

[root@master1 ~]#  chmod +x /etc/keepalived/check_nginx.sh

备 keepalive

[root@master2 ~]# cat /etc/keepalived/keepalived.conf

global_defs  

  notification_email  

    acassen@firewall.loc  

    failover@firewall.loc  

    sysadmin@firewall.loc  

   

  notification_email_from Alexandre.Cassen@firewall.loc  

  smtp_server 127.0.0.1  

  smtp_connect_timeout 30  

  router_id NGINX_BACKUP

 


vrrp_script check_nginx

   script "/etc/keepalived/check_nginx.sh"


vrrp_instance VI_1  

   state BACKUP

   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.3.222/24

     

   track_script

       check_nginx

     


#vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)

#virtual_ipaddress:虚拟IP(VIP)

[root@master2 ~]# cat /etc/keepalived/check_nginx.sh  

#!/bin/bash

#1、判断Nginx是否存活

counter=`ps -C nginx --no-header | wc -l`

if [ $counter -eq 0 ]; then

   #2、如果不存活则尝试启动Nginx

   service nginx start

   sleep 2

   #3、等待2秒后再次获取一次Nginx状态

   counter=`ps -C nginx --no-header | wc -l`

   #4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移

   if [ $counter -eq 0 ]; then

       service  keepalived stop

   fi

fi

[root@master2 ~]# chmod +x /etc/keepalived/check_nginx.sh

#注:keepalived 根据脚本返回状态码(0 为工作正常,非 0 不正常)判断是否故障转移。

报错:

Jul 11 14:33:16 master1 nginx[17367]: nginx: [emerg] unknown directive "stream" in  

/etc/ngi...:13

解决办法如下:

[root@master1 ~]# yum install nginx-mod-stream -y

[root@master1 ~]# systemctl start nginx

[root@master1 ~]# systemctl start keepalived

[root@master2 ~]# systemctl daemon-reload

[root@master2 ~]# systemctl enable nginx keepalived

[root@master2 ~]# systemctl start nginx

报错:

Jul 11 14:33:16 master1 nginx[17367]: nginx: [emerg] unknown directive "stream" in  

/etc/ngi...:13

解决办法如下:

[root@master2 ~]# yum install nginx-mod-stream -y

[root@master2 ~]# systemctl start nginx

[root@master2 ~]# systemctl start keepalived

4.测试 vip 是否绑定成功

[root@master1 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group  

default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host  

valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP  

group default qlen 1000

link/ether 00:0c:29:79:9e:36 brd ff:ff:ff:ff:ff:ff

inet 192.168.3.200/24 brd 192.168.3.255 scope global noprefixroute ens33

valid_lft forever preferred_lft forever

inet 192.168.3.222/24 scope global secondary ens33

valid_lft forever preferred_lft forever

inet6 fe80::b6ef:8646:1cfc:3e0c/64 scope link noprefixroute

valid_lft forever preferred_lft forever

停掉 master1 上的 keepalived。Vip 会漂移到 master2

[root@master1 ~]# service keepalived stop

[root@master2 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group  

default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host  

valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP  

group default qlen 1000

link/ether 00:0c:29:83:4d:9e brd ff:ff:ff:ff:ff:ff

inet 192.168.3.201/24 brd 192.168.3.255 scope global noprefixroute ens33

valid_lft forever preferred_lft forever

inet 192.168.3.222/24 scope global secondary ens33

valid_lft forever preferred_lft forever

inet6 fe80::a5e0:c74e:d0f3:f5f2/64 scope link tentative noprefixroute dadfailed  

valid_lft forever preferred_lft forever

inet6 fe80::b6ef:8646:1cfc:3e0c/64 scope link noprefixroute  

valid_lft forever preferred_lft forever

inet6 fe80::91f:d383:3ce5:b3bf/64 scope link tentative noprefixroute dadfailed  

valid_lft forever preferred_lft forever

启动 master1 上的 keepalived。Vip 又会漂移到 master1

[root@master1 ~]# service keepalived start

[root@master1 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group  

default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host  

valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP  

group default qlen 1000

link/ether 00:0c:29:79:9e:36 brd ff:ff:ff:ff:ff:ff

inet 192.168.3.200/24 brd 192.168.3.255 scope global noprefixroute ens33

valid_lft forever preferred_lft forever

inet 192.168.3.222/24 scope global secondary ens33

valid_lft forever preferred_lft forever

inet6 fe80::b6ef:8646:1cfc:3e0c/64 scope link noprefixroute  

valid_lft forever preferred_lft forever

18.初始化集群

导入 docker 镜像

把 k8s-imagesv1.23.1.tar.gz 上传到 master1 上,3 台机器都导入一下,避免 node 节点找不到镜像。

[root@master1 ~]# docker load -i k8s-images-v1.23.1.tar.gz

[root@master1 ~]# scp k8s-ima

以上是关于kubeadm 搭建多 master 高可用 K8S 集群(亲测)的主要内容,如果未能解决你的问题,请参考以下文章

使用kubeadm搭建k8s高可用集群

使用kubeadm搭建k8s高可用集群

k8s kubeadm部署高可用集群

使用kubeadm搭建高可用的K8S集群(2022年1月亲测有效)

kubeadm安装高可用k8s集群

kubernetes— 记一次用kubeadm搭建kubernetes v1.9.0集群