k8s高可用方案系列---集群多master搭建
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s高可用方案系列---集群多master搭建相关的知识,希望对你有一定的参考价值。
参考技术A 在执行平台CTE使用面越来越扩大,底层的k8s集群就越来越需要得到可靠性的保证之前的执行服务CTE,环境申请服务matrix,调度服务apollo是在一台单节点的k8s集群上,集群是由虚拟机组成,而虚拟机又是由服务器提供的计算资源,存储阵列提供的存储资源虚拟化出的虚拟机。
所以,一旦集群主所在的虚拟机的网络或者存储出现了问题,将会导致整个集群的不可用。因此,多master集群的搭建成了迫在眉睫的方案
搭建多master集群
坑点:新master当前有大网网段:10.86,小网网段:8.46,如果不加--apiserver-advertise-address,那么默认和源master通信的是10网段,但源master又是8.46网段,因此会加入失败,所以在此必须指定apiserver的通信地址是小网网段
-v2 是获取详细日志打印,方便定位
kubeadm 搭建多 master 高可用 K8S 集群(亲测)
1.kubernetes 简介
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.架构图
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
#修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
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
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
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
[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 时出现:
解决办法:
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
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
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
以上是关于k8s高可用方案系列---集群多master搭建的主要内容,如果未能解决你的问题,请参考以下文章
搭建高可用mysql系列-- Percona XtraDB Cluster介绍