百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

nanshan 2024-11-18 15:13 9 浏览 0 评论

一、前言

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

二、配置 多个master 节点

如果直接部署单master或者多master k8s环境,可以参考我这篇文章:「云原生」Kubernetes(k8s)最完整版环境部署(V1.24.1)

1)节点信息

hostname

IP

节点类型

local-168-182-110,cluster-endpoint

192.168.182.110,VIP:192.168.182.220

master

local-168-182-111

192.168.182.111

node

local-168-182-112

192.168.182.112

node

local-168-182-113

192.168.182.112

master backup1

local-168-182-130

192.168.182.112

master 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

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

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

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

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

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

查看节点

kubectl get nodes
kubectl get nodes -owide

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

1)节点信息

hostname

IP

节点类型

local-168-182-110,cluster-endpoint

192.168.182.110,VIP:192.168.182.220

master

local-168-182-111

192.168.182.111

node

local-168-182-112

192.168.182.112

node

local-168-182-113

192.168.182.112

master backup1

local-168-182-130

192.168.182.112

master backup2

2)master节点安装keepalived

1、安装 keepalived

yum install keepalived -y

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

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

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

3、启动并设置开机启动

systemctl daemon-reload
systemctl restart keepalived && systemctl enable keepalived && systemctl status keepalived

# 查看
ip a

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

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' *

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

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":设置了这个,之后加入节点验证证书阶段就不会报错了。

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

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

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/

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

3、重启docker或者containerd,kubelet

systemctl restart docker containerd kubelet

四、故障模式测试

1)模拟VIP漂移

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


查看节点信息

kubectl get nodes

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

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

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

查看节点信息

kubectl get nodes

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

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

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

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

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

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

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

【错误】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

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

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

相关推荐

HTTP 和 HTTPS 有何不同?一文带你全面了解

随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...

HTTP和HTTPS的区别?

本文主要讲解http和https的关系与区别,分辨不清区别的同学要注意朝下看完,Web面试中最常问的已到面试题~~一.HTTP和HTTPS的相同点:大多数情况下,HTTP和HTTPS是相同的,...

详解HTTP协议与RESTFUL

1.HTTP简介http协议是一种超文本传输协议,主要应用在浏览器与服务器之间的通信,可以传输文本,图片,视频等。它是一种应用层协议,也是基于TCP协议,当然现在流行的Https协议是在TLS或SSL...

http与https的区别,读完之后,大部分程序员收藏了...

在URL前加https://前缀表明是用SSL加密的。你的电脑与服务器之间收发的信息传输将更加安全。Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。http和ht...

JMeter测试HTTP GET请求(附实例)

一、HTTPRequest配置项解析●WebServer:1.Protocol[http]:○若为HTTP协议可以不填写(默认为HTTP);○若为HTTPS协议可以填写“https”;还可...

2019山东高考分数线公布:本科文503 理443

刚刚,2019年山东高考各批次录取最低分数线公布了!6月24日下午,山东省教育厅举行2019年山东高考第二场新闻发布会。山东省教育招生考试院在发布会上公布了山东今年高招各批次录取控制分数线。其中,本科...

Linux系统网站出现503错误提示怎么解决?

当Linux系统上的网站出现503ServiceUnavailable错误时,通常表示服务器暂时无法处理请求,可能由后端服务崩溃、资源耗尽或配置错误导致。以下是系统化的排查和解决方案:一、...

三石说:一文带你了解Https

今天我们继续深入http,本篇将介绍Https的内容,相信你看过之后对https有一定的了解。HTTPSHTTPS(全称:HyperTextTransferProtocoloverSecu...

HTTP与HTTPS的区别

首先,需要知道HTTP和HTTPS是什么。HTTP是超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,是互联网上应用最为广泛的一种网络协议。也...

Caddy服务器开启HTTP/3:如何让你的网站快如闪电?

Caddy服务器开启HTTP/3:如何让你的网站快如闪电?在互联网技术飞速迭代的今天,HTTP/3正以革命性的姿态颠覆传统网络传输模式。作为首个基于QUIC协议的HTTP标准,它不仅能大幅提升网站加载...

HTTP/1.1、HTTP/2、HTTP/3 演变

HTTP基本概念HTTP是超文本传输协议,也就是HyperTextTransferProtocol。HTTP常见的状态码有哪些?1xx类状态码属于提示信息,是协议处理中的一种中间状态,实际...

HTTP/3 黑科技:三次握手如何进阶 QUIC?30 年通信细节揭秘

大家好,我是“极客运维社”的飞哥,点击右上方“关注”,每天和大家分享关于网络设备及系统和企业组网方面干货。码字不易,如果您觉得文章还可以,就点赞+关注+收藏吧,也许在以后某个时间能够用得到。H...

总结HTTP/HTTPS协议基础的有那些漏洞,怎么检查,怎么防范

以下是基于黑盒测试、白盒测试和灰盒测试视角对HTTP/HTTPS协议漏洞检查与防范的分类整理:一、黑盒测试(外部视角,无内部权限)定义:模拟攻击者视角,仅通过外部网络接口进行测试,不依赖系...

什么是HTTP? HTTP 和 HTTPS 的区别?

HTTP(HyperTextTransferProtocol),即超文本运输协议,是实现网络通信的一种规范。HTTP是一个传输协议,即将数据由A传到B或将B传输到A,并且A与B之间能够存...

一篇文章搞懂HTTP和HTTPS的的本质区别

http协议是基于tcp协议,默认是80端口。它的特点是什么?它是基于请求和响应的,大家抓个包能看到http协议有一个请求报文有一个响应报文,还有它是一个无状态的协议,还有一个无连接的协议。无连接是指...

取消回复欢迎 发表评论: