pve clusterk8s cluster重建

背景

dev环境新买了一块固态,插到pve主板的第二个M.2槽位不能识别,通过其他机器排查后确定是这台pve的槽位问题。
同时这台pve还有一些其他的lvm历史遗留问题,具体表现是每次开机很长,因为要扫描那块机械硬盘做的lvm
所以决定将这台pve重新安装到新买的固态盘中,并重新加入集群

实施

制作PVE启动盘,查到机器上安装,常规操作,没对pve的启动grub等做定制化。
配置IP,掩码,域名,主机名,重启机器,进入网页,一切正常,配置允许ssh远程连接,修改root密码

踢出集群

将旧的pve踢出集群,
登录集群中任意一台存活的pve

# 查看pve的版本
root@dev-pve-node2:~# pveversion -v
root@dev-pve-node2:~# pveversion -v
proxmox-ve: 7.1-1 (running kernel: 5.13.19-2-pve)
pve-manager: 7.1-7 (running version: 7.1-7/df5740ad)
# 由于操作的过程中未记录,这里是操作完成后记录
root@dev-pve-node2:~# pvecm status
Cluster information
-------------------
Name:             dev-pve-group
Config Version:   7
Transport:        knet
Secure auth:      on

Quorum information
------------------
Date:             Tue May 14 17:31:59 2024
Quorum provider:  corosync_votequorum
Nodes:            3
Node ID:          0x00000002
Ring ID:          1.ee0
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   3
Highest expected: 3
Total votes:      3
Quorum:           2  
Flags:            Quorate 

Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 192.168.1.74 # 这台是新家的
0x00000002          1 192.168.1.75 (local)
0x00000003          1 192.168.3.222

# 从集群中删除
root@dev-pve-node2:~# pvecm delnode dev-pve-node01
# 删除node01的密钥
root@dev-pve-node2:~# vim /etc/pve/priv/authorized_keys
root@dev-pve-node2:~# vim /etc/pve/priv/known_hosts

# 移除配置文件
root@dev-pve-node2:~# cd /etc/pve/nodes/
root@dev-pve-node2:~# mv dev-pve-node01/ /tmp/

然后登陆网页端过一会刷新一下,可以看到退出集群的pve node消失不见

配置新的pve

将遗留问题 机械硬盘中的lvm删除,

root@pve-node01:~# lvdisplay
root@pve-node01:~# lvchange -ay  vmdata/vmstore01
root@pve-node01:~# lvremove /dev/vmdata/vm-113-disk-1
root@pve-node01:~# lvremove /dev/vmdata/vm-113-disk-1
root@pve-node01:~# lvremove /dev/vmdata/vm-113-disk-2
root@pve-node01:~# lvremove /dev/vmdata/base-124-disk-0
root@pve-node01:~# lvremove /dev/vmdata/vm-201-disk-0
root@pve-node01:~# lvremove /dev/vmdata/vm-101-disk-0
# 移除vg
root@pve-node01:~# vgremove vmdata
# 移除pv
root@pve-node01:~# pvremove /dev/sda1
# 关闭swap
swapoff -a

重启机器测试开机是否仍然会卡在lvm扫描阶段,预期结果:不会;事实:不会。

将新的pve节点加入集群

在旧的pve集群web界面点击datacen,点击cluster,点击join information
在这里插入图片描述
点击复制按钮,到新节点的web界面粘贴,过一会就加入成功了。root密码可以验证一下再粘贴进去

重建k8s集群中的位于pve-node1上的master节点

由于k8s的其中一个master节点是放在pve-node1上的,重新安装了pve,所以需要重新部署master节点

下载免安装镜像配合pve的cloud init用于在pve中安装ubuntu系统,这里同集群保持一致,使用1804版本
https://cloud-images.ubuntu.com/

下载好的镜像xftp上传至pve
web界面新建机器,删掉磁盘,删掉cdrom,
进入命令行导入下载的img文件

qm importdisk 101 bionic-server-cloudimg-amd64.img local-lvm

导入之后,web界面的101虚拟机会显示有一块unused的磁盘,双击启用,
在这里插入图片描述
配置启动顺序,
在这里插入图片描述
添加硬件cloud init
在这里插入图片描述
配置cloud init注入内容.
在这里插入图片描述开机
如果cloud init未添加ssh公钥,则需要用控制台修改一下机器的sshd服务配置允许root用户远程密码登录

注意:默认导入的只有2G的磁盘文件,关机之后选中磁盘点击resize disk进行扩容,再到机器中扩容分区及文件系统

验证注入的内容

root@k8s-gpu-node5:~# cat /etc/netplan/50-cloud-init.yaml 
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    version: 2
    ethernets:
        eth0:
            addresses:
            - 192.168.1.39/21
            match:
                macaddress: 16:f1:00:78:98:9d
            nameservers:
                addresses:
                - 192.168.1.220
            routes:
            -   to: 0.0.0.0/0
                via: 192.168.1.1
            set-name: eth0

调优master节点

timedatectl set-timezone Asia/Shanghai

root@dev-k8s-master02:~# tail -n 20 /etc/sysctl.conf 
#kernel.sysrq=1

###################################################################
# Protected links
#
# Protects against creating or following links under certain conditions
# Debian kernels have both set to 1 (restricted) 
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
#fs.protected_hardlinks=0
#fs.protected_symlinks=0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.tcp_tw_reuse = 0
net.core.somaxconn = 32768
net.netfilter.nf_conntrack_max = 1000000
vm.swappiness = 0
vm.max_map_count = 655360
fs.file-max = 6553600

# 加载内核中的模块
modprobe br_netfilter
modprobe ip_conntrack
# 配置生效
sysctl -p

配置docker,由于内网中配置了全局科学上网代理工具,此处直接把网关暂时指向机器即可按照docker官方配置来复制粘贴

apt -y install apt-transport-https ca-certificates curl software-properties-common
# 添加apt证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg |sudo apt-key add -
# 若机器有安装,则先卸载
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 验证源
root@dev-k8s-master02:~# cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   bionic stable
# 执行更新
sudo apt-get update
# 查看版本
apt-cache madison docker-ce
apt-cache madison containerd.io
# 安装指定版本
apt install docker-ce=5:20.10.11~3-0~ubuntu-bionic docker-ce-cli=5:20.10.11~3-0~ubuntu-bionic containerd.io=1.6.4-1 docker-buildx-plugin docker-compose-plugin

# 开机自启
systemctl enable --now docker.service
# 配置 Cgroup Driver驱动为systemd,这个配置也可以写到/etc/docker/daemon.json中
root@dev-k8s-master02:~# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
## 验证正常启动
systemctl daemon-reload && systemctl restart docker && systemctl status docker.service
## 验证驱动
root@dev-k8s-master02:~# docker info |grep -i Cgroup
 Cgroup Driver: systemd
 Cgroup Version: 1

配置k8s 1.22版本

# 安装源 可自行搜索curl -x参数使用代理 密钥是通用的
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 官方及ustc的仓库中未找到1.22版本,阿里云有
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
root@dev-k8s-master02:~# cat /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

# 安装
apt install kubeadm=1.22.4-00  kubelet=1.22.4-00 kubectl=1.22.4-00 -y

这里有一个比较坑的地方是
由于我们的集群运行了2年了,最早有一个master,后面扩展到5个master,后面又缩到3个master,导致集群中的主节点的信息跟现有的不一致,进一步导致了master节点加入集群的时候的报错。

就是比如搭建集群时候的master节点1也就是kubeadm执行init命令时指定的IP地址是192.168.1.14,现在这台机器已经不在集群中了,但是集群的配置信息没有更改过,导致执行kubeadm添加节点到集群中的时候仍然会去找1.14这个IP去链接api server。而且还有一个诡异的现象,我在交换机上查看arp解析记录是没有1.14这条记录的,但是在k8s集群中是能够ping通这个IP的。

具体的报错信息由于未保存ssh连接导致报错信息丢失

执行加入集群命令

kubeadm join 192.168.7.173:6443 --token 8tuq2n.rwxxxxdfa --discovery-token-ca-cert-hash sha256:b4c244215e5x6cf397255ff13c179e --control-plane --certificate-key 2d88deaxxxxxxafd04f4 --v=6

I0514 17:08:00.503834 3476 token.go:80] [discovery] Created cluster-info discovery client, requesting info from “192.168.1.38:6443”
I0514 17:08:00.518160 3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s 200 OK in 13 milliseconds
I0514 17:08:00.520059 3476 token.go:118] [discovery] Requesting info from “192.168.1.38:6443” again to validate TLS against the pinned public key
I0514 17:08:00.526153 3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s 200 OK in 5 milliseconds
I0514 17:08:00.526423 3476 token.go:135] [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server “192.168.1.38:6443”
I0514 17:08:00.526436 3476 discovery.go:52] [discovery] Using provided TLSBootstrapToken as authentication credentials for the join process
I0514 17:08:00.526449 3476 join.go:489] [preflight] Fetching init configuration
I0514 17:08:00.526457 3476 join.go:534] [preflight] Retrieving KubeConfig objects
[preflight] Reading configuration from the cluster…
[preflight] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -o yaml’
I0514 17:08:00.528095 3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s 200 OK in 1 milliseconds
I0514 17:08:00.530254 3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-system/configmaps/kube-proxy?timeout=10s 200 OK in 1 milliseconds
I0514 17:08:00.532541 3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-system/configmaps/kubelet-config-1.22?timeout=10s 200 OK in 1 milliseconds
I0514 17:08:00.533583 3476 interface.go:431] Looking for default routes with IPv4 addresses

代码块版本

I0514 17:08:00.503834    3476 token.go:80] [discovery] Created cluster-info discovery client, requesting info from "192.168.1.38:6443"
I0514 17:08:00.518160    3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s 200 OK in 13 milliseconds
I0514 17:08:00.520059    3476 token.go:118] [discovery] Requesting info from "192.168.1.38:6443" again to validate TLS against the pinned public key
I0514 17:08:00.526153    3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s 200 OK in 5 milliseconds
I0514 17:08:00.526423    3476 token.go:135] [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.1.38:6443"
I0514 17:08:00.526436    3476 discovery.go:52] [discovery] Using provided TLSBootstrapToken as authentication credentials for the join process
I0514 17:08:00.526449    3476 join.go:489] [preflight] Fetching init configuration
I0514 17:08:00.526457    3476 join.go:534] [preflight] Retrieving KubeConfig objects
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
I0514 17:08:00.528095    3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s 200 OK in 1 milliseconds
I0514 17:08:00.530254    3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-system/configmaps/kube-proxy?timeout=10s 200 OK in 1 milliseconds
I0514 17:08:00.532541    3476 round_trippers.go:454] GET https://192.168.1.38:6443/api/v1/namespaces/kube-system/configmaps/kubelet-config-1.22?timeout=10s 200 OK in 1 milliseconds
I0514 17:08:00.533583    3476 interface.go:431] Looking for default routes with IPv4 addresses

根据日志浅析使用kubeadm将master&node节点加入现有集群的过程

  1. 通过指定的master节点的api信息及token认证信息创建client连接api server
  2. 获取ns kube-public下的cm信息cluster-info中的集群的master信息
  3. 连接获取的master信息去找kube-system下的cm kubeadm-config信息执行加入集群操作

根据加入集群时候加的–v=6参数提示出来的报错信息一直让我以为是这个kubeadm-config配置文件有问题。

root@dev-k8s-master03:~# kubectl get cm -n kube-system|grep kubeadm-config
kubeadm-config                       1      2y69d

改了这里信息之后发现一样的报错,跟这里的controlPlaneEndpoint并无关系
在这里插入图片描述

root@dev-k8s-master03:~# kubectl get cm -n kube-public
NAME               DATA   AGE
cluster-info       2      2y69d

这里看到这个cm文件已经2y没有动过了。执行kube edit发现坑
在这里插入图片描述
将这里改为现有存在的master节点之后,再执行加入节点即正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/625962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu编译pcl时报错

报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…

【C++】string类的使用①(默认成员函数 || 迭代器接口begin,end,rbegin和rend)

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🌈关于string类🌈string类的成员函数🔥默认成员函数string类对象的构造(constructor)string类对象的析构string类对象的赋值运算符…

MySQL数据库核心面试题

数据库中的引擎 常用的引擎有InnoDB、MyIsam、Memory三种。 MyIsam:组织形式分为三种: frm文件存储表结构、MyData文件存储表中的数据、MyIndex文件存储表的索引数据。是分开存储的。 Memory:基于内存的,访问速度快&#xff0…

【C++】 C++ 编写 鸡兔同笼程序

文章目录 “鸡兔同笼”问题是一个经典的数学问题,要求根据总头数和总腿数来计算鸡和兔的数量。假设鸡有 2 条腿,兔有 4 条腿。可以通过以下步骤求解这个问题: 1 .设鸡的数量为 x,兔的数量为 y。2.根据题意,我们有以下…

#私密朋友圈被吐槽有bug?官方致歉!网友:尴尬了......

1月7日,话题#微信私密朋友圈被吐槽有bug#,冲上微博热搜第一。 据了解,近日有网友发现,即使自己发布私密朋友圈,好友也可以在朋友圈页面看到自己的头像红点,随即此话题引发热议。 有网友表示,怪…

STL----resize

resize的作用 设置容器元素个数和初始值。 resize和reserve resize即改变容器元素个数,也改变容器容量。 reserve只改变容器容量,不改变容器元素个数。 reserve有什么用 reserve---存储,容量,保留。 1,设置容器容…

分布式系统的一致性与共识算法(二)

Consitency 背景 如买最后一张车票,两个售票处分别通过某种方式确认过这张票的存在。这时,两家售票处几乎同时分别来了一个乘客要买这张票,从各自"观察"看来,自己一方的乘客都是先到的,这种情况下&#xf…

原子学习笔记7——FrameBuffer 应用编程

Frame 是帧的意思,buffer 是缓冲的意思,所以 Framebuffer 就是帧缓冲,这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。 应用程序通过对 LCD 设备节点/dev/fb0(假设 LCD 对应的设备节点是/dev/fb0)…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听(提高了信道利用率)以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

同为科技详解智能PDU所应用的通信协议与接口

现如今,信息服务、AI人工智能的飞速发展与增长,全球正经历信息数据的爆炸。不仅数据量以惊人的速度增长,而且全球社会各行业对数据的依赖的程度也在日益增加。这些趋势使数据中心在全球都享有关键基础架构的地位。假设某个数据中心发生严重的…

【知识拓展】大白话说清楚:IP地址、子网掩码、网关、DNS等

前言 工作中常听别人说的本地网络是什么意思?同一网段又是什么意思?它俩有关系吗? 在工作中内经常会遇到相关的网络问题,涉及网络通信中一些常见的词汇,如IP地址、子网掩码、网关和DNS等。具体一点:经常会…

JavaEE之线程(5)——Java内存模型、内存可见性、volatile关键字

前言 volatile可以理解成轻量级的 synchronized, 它在多CPU开发中保证了共享变量的“可见性”,可见性我们可以理解成是:当一个线程修改一个共享变量时,另一个线程可以读到这个修改的值。由于它不会引起线程的上下文切换和调度&am…

【JavaWeb】Day77.Spring——SpringBoot原理(一)

SpringBoot原理 Spring是目前世界上最流行的Java框架,它可以帮助我们更加快速、更加容易的来构建Java项目。而在Spring家族当中提供了很多优秀的框架,而所有的框架都是基于一个基础框架的SpringFramework(也就是Spring框架)。而如果我们直接基于Spring框…

【Shell】Shell编程之函数

目录 1.Shell函数定义 2.Shell函数的作用 3.函数返回值 4.函数传参 5.函数变量的作用范围 案例 1.Shell函数定义 格式1 function 函数名 { 命令序列 } 格式2 函数名() { 命令序列 } 2.Shell函数的作用 使用函数可以避免代码重复 使用函数可以将大的工程分割为若…

springcloud简单了解及上手

springcloud微服务框架简单上手 文章目录 springcloud微服务框架简单上手一、SpringCloud简单介绍1.1 单体架构1.2 分布式架构1.3 微服务 二、SpringCloud与SpringBoot的版本对应关系2022.x 分支2021.x 分支2.2.x 分支 三、Nacos注册中心3.1 认识和安装Nacos3.2 配置Nacos3.3 n…

【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 Cortex-M7 Debug eventDebug events Cortex-M7 Debug event 在ARM Cortex-M7架构中,调试事件(Debug Event)是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生: 进…

部署管理征信链码

一 . 链码准备 需要删除上面后面标记的文件,之后拖入 二. 打包链码 注意需要先启动链 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/credit_chaincode --lang n…

vue3.0(五) reactive全家桶

文章目录 1 reactive1.1 reactive的应用1.2 reactive的特点1.3 reactive的注意1.4 reactive的局限性 2 toRefs3 isReactive4 shallowReactive5 readonly5.1 readonly 详细信息5.2 readonly函数创建一个只读的响应式对象5.3 如何修改嵌套在只读响应式对象中的对象? 6 isReadonl…

考研数学|李林《880》做不动,怎么办!?看这一篇!

在考研数学的备考过程中,遇到难题是很常见的情况,尤其是当你尝试解决李林880习题集中的问题时。他以其难度和深度著称,旨在帮助考生深入理解数学分析的复杂概念。 如果你在解题过程中感到困难,这并不是你个人的问题,而…

《无畏契约》游戏画面出现“撕裂感“,你清楚背后的原理吗?

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …