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

news2024/10/5 18:26:09

文章目录

    • 一、前言
    • 二、配置 多个master 节点
      • 1)节点信息
      • 1)安装docker或containerd
      • 2)安装kubeadm,kubelet和kubectl
        • 1、配置k8s yum源
        • 2、修改sandbox_image 镜像源
        • 3、配置containerd cgroup 驱动程序systemd
        • 4、开始安装kubeadm,kubelet和kubectl
        • 5、master节点加入k8s集群
    • 三、更换 K8S master 节点 IP(master 高可用)
      • 1)节点信息
      • 2)master节点安装keepalived
        • 1、安装 keepalived
        • 2、配置 keepalived
        • 3、启动并设置开机启动
      • 3)配置hosts
      • 4)修改配置
      • 5)生成新的admin用config文件
      • 6)删除旧的证书,生成新证书
      • 7)重启docker或者containerd,kubelet
      • 8)查看ETCD
      • 9)解决 node 节点 NotReady状态
        • 1、从master节点拷贝ca.crt到node节点对应的目录
        • 2、修改node节点的kubelet.conf
        • 3、重启docker或者containerd,kubelet
    • 四、故障模式测试
      • 1)模拟VIP漂移
      • 2)节点故障测试(一台master故障)
      • 3)master节点故障模拟(两台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

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)节点信息

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

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://www.coloradmin.cn/o/37633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot SpringBoot 原理篇 1 自动配置 1.7 bean 的加载方式【五】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.7 bean 的加载方式【五】1.7.1 register1 自动配置 1.7 bean 的…

FAIRNESS IN MACHINE LEARNING: A SURVEY 阅读笔记

论文链接 刚读完一篇关于机器学习领域研究公平性的综述&#xff0c;这篇综述想必与其有许多共通之处&#xff0c;重合部分不再整理笔记&#xff0c;可详见上一篇论文的笔记&#xff1a; A Survey on Bias and Fairness in Machine Learning 阅读笔记_Catherine_he_ye的博客 S…

红队隧道加密之MSF流量加密(二)

前言 如今大多数企业的内网都部署了流量审计服务, 用来专门分析流量特征, 比如后门特征和行为特征 若直接使用Metasploit对内网进行横向渗透, 其产生的流量会很容易被内网防护工具检测出来, 因此需对流量进行加密来绕过检测 这里介绍使用OpenSSL对MSF流量进行加密 演示步骤 …

这么高颜值的Kubernetes管理工具Lens,难道还不能C位出道吗

一直使用官方的Kubernetes Dashboard来管理k8s&#xff0c;也算很友好的一款UI工具&#xff0c;但显示的资源不全、查看日志有限、时间久了要重要登陆&#xff0c;所以找了一款外观漂亮&#xff0c;用户体验很好的管理平台Lens。 2 特性与安装 2.1 特性 Lens的优势主要有&…

齐聚绿城 | 锦江都城酒店聚焦中高端酒店投资新方向

提起广西&#xff0c;不少人能想到 “桂林山水甲天下”的桂林&#xff0c;亦或因一碗螺蛳粉闻名全国的柳州。又或荣登《国家地理》的涠洲岛。但在你不知晓的时候&#xff0c;南宁这座城在静静的等你发掘。南宁——南疆安宁&#xff0c;是山环水绕的“绿城”&#xff0c;也是北回…

windows系统cmake生成动态库无lib文件解决方法

作为cmake初学者&#xff0c;在windows系统下使用cmake生成c动态库时出现了下图所示问题&#xff0c;是关于lib文件。找了一圈&#xff0c;也没发现生成有lib文件。 在google上查&#xff0c;才发现windows系统下动态库生成lib文件&#xff0c;还需要添加以下命令&#xff1a; …

java 同步锁synchronized 解决线程共享数据重复操作问题

我们先来写一个买票程序 我们先创建一个包 在包下创建两个类 customException 线程类 负责编写抢票的主要逻辑 参考代码如下 public class customException implements Runnable {private int tickets 100;public void run () {while (tickets > 0){if(tickets > 0) {…

【语音增强】多维谱自适应小波语音信号去噪【含Matlab源码 1972期】

⛄一、自适应小波语音信号去噪 1 引言 语音信号在传输过程中&#xff0c;容易受到环境噪声和其他语音的干扰&#xff0c;降低了语音通信质量&#xff0c;影响了语音处理系统工作。所以&#xff0c;语音的净化处理技术&#xff0c;在现代语音通信和数字音频广播系统中起到愈来愈…

特殊的转义字符—— \b 退格字符 ASCII 08

引入 我们在写 C 语言题目时&#xff0c;经常会碰见这样的输出 11 123 1236 123410如果用循环的话&#xff0c;这个加号是个大问题&#xff0c;如果直接用 printf("%d")&#xff0c;最后会多一个加号&#xff0c;用 printf("%d") 则前面会多一个加号。想…

Qt编写视频监控管理平台(支持海康/大华/宇视/华为/天地伟业/H264/H265等)

一、前言 海康大华等厂家自己的客户端软件&#xff0c;基本上都是支持自家的设备&#xff0c;不支持其他家的摄像机和硬盘录像机&#xff0c;并不是因为技术上做不到&#xff0c;这些大厂要实现支持兼容其他的家的&#xff08;他们家的服务端或者收费的都是支持其他家的&#…

写个rpc调用,试试自己了解多少

什么是rpc rpc即是远程过程调用&#xff0c;简单来说就是调用其他服务的接口像调用自己的本地方法一样&#xff0c;通常我们的调用的时候不需要关心调用过程和底层的通信即可实现调用其他的服务&#xff1b; 大概流程就是服务模块双方都会向注册中心注册自己的服务&#xff0c…

开发工具vim

一、开发工具vim vim的安装&#xff1a;yum install -y vim 指令&#xff1a;vim --version可以查看当前的版本信息&#xff0c;没有弹出信息就是没有安装。 装的vim是没有相关配置文件的&#xff0c;配置文件需要后面自己装。 之前说过&#xff0c;vs2019是集成软件编译…

【畅购商城】购物车模块之修改购物车以及结算

目录 购物车操作&#xff1a;修改 分析 接口 后端实现&#xff1a;更新 前端实现&#xff1a;修改 前端实现&#xff1a;全选 后端实现&#xff1a;删除数据 结算 跳转页面 购物车操作&#xff1a;修改 分析 接口 PUT http://localhost:10010/cart-service/carts 后…

python数学基础——单词统计

这个练习使用的是英文的单词统计&#xff0c;使用split通过单词中间的空格来做区分&#xff0c;在遍历的过程中通过对【字典】类型进行【字典推导式】的处理来计算每个单词出现的频次。但是由于过程中我们通过re的正则表达式来替换掉了很多的符号&#xff0c;并没有替换成空&am…

【网页设计】web前端期末大作业html+css

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Day12--自定义组件-渲染my-search组件的基本结构

1.自定义搜索组件 我的操作&#xff1a; 1》在uni_modules中右键新建uni_modules插件&#xff1a; 2》看看效果图&#xff1a; ************************************************************************************************************** 2.在分类页面的 UI 结构中&…

工作中常用的设计模式--策略模式

一般做业务开发&#xff0c;不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java&#xff0c;基于Spring框架。 1 策略模式(Strategy Pattern) 一个类的行为或方法&#xff0c;在运行时可以根据条件的不同&#xff0c;有不同的…

verilog练习——基础语法

目录 基础语法 VL1 四选一多路器 VL2 异步复位的串联T触发器 VL3 奇偶校验 VL4 移位运算与乘法 VL5 位拆分与运算 VL6 多功能数据处理器 VL7 求两个数的差值 VL8 使用generate…for语句简化代码 VL9 使用子模块实现三输入数的大小比较 VL10 使用函数实现数据大小端转…

数据结构题目收录(二十五)

1、排序趟数与序列的原始状态无关的排序方法是&#xff08;&#xff09;。 Ⅰ、直接插入排序 Ⅱ、简单选择排序 Ⅲ、冒泡排序 Ⅳ、基数排序 A&#xff1a;Ⅰ、ⅢB&#xff1a;Ⅰ、Ⅱ、ⅣC&#xff1a;Ⅰ、Ⅱ、ⅢD&#xff1a;Ⅰ、Ⅳ 解析 交换类的排序&#xff0c;其趟数和…

GUI编程--PyQt5--QDiaglog

文章目录QDialogQFontDialogQColorDialogQFileDialogQInputDialogQDialog 对话框基类&#xff0c;继承QWidget&#xff1b;用于短期任务&#xff0c;分为模态、非模态 模态&#xff0c;阻塞在当前窗口&#xff1b;分为应用程序级别&窗口级别&#xff08;仅阻塞关联的窗口&…