MacBook使用arm64架构CentOS虚拟机部署k8s集群

1,053 阅读11分钟

前置内容

本次部署学习仅供本人学习过程记录使用,非公司生产或商用环境。
使用的教程为一个BILIBILI首页推荐的教程:教程链接
因为教程是基于windows amd64(X86_64)架构,中间遇到了一些arm64的坑,故在此记录一下。
同时也感谢教程老师的教学,学习到了很多。

0.1 MAC电脑配置

型号MacBook Pro 14英寸 2021年
芯片Apple M1 Pro
内存16 GB
系统版本macOS Sequoia 15.1

0.2 虚拟机环境

软件VMWare Fusion 专业版 13.6.0 (24238079)

0.3 大概步骤

  • 虚拟机安装与基础配置:安装3台CentOS 7.9 aarch64虚拟机、配置固定IP、配置主机名和hosts DNS解析
  • 部署基础环境配置:基础配置,同步集群时间,安装基础软件IPVS
  • containerd安装与配置:更新libseccomp、配置DNS解析地址、配置安装containerd
  • k8s安装部署:安装kubeletkubeadmkubectl,配置并拉起k8s集群
  • flannel安装部署:获取kube-flannel.yml,配置阿里云镜像源,修改部署文件,部署网络插件flannel

0.4 关于arm64以及与源教程有区别的地方

  • CentOS系统arm64版本
  • VMWare Fusion虚拟机固定IP配置
  • selinux的配置
  • 配置DNS解析
  • yum源的arm64版本
  • 使用的linux arm64不需要升级内核版本
  • 更新libseccomp的方法
  • 拉取的镜像为amd64导致flannel部署出错问题

1. 虚拟机安装与基础配置

1.1 安装VMWare Fusion

安装包自行前往官网下载,macOS系统安装软件较为简单

1.2 安装CentOS虚拟机

CentOS镜像包链接中仅使用了第一步的CentOS镜像,未使用Parallels
因为要建三个虚拟机,新增文件夹k8s2(k8s1是我之前安装好的),点击左上角加号选择新建新增虚拟机-从光盘或映像中安装,选择下载的镜像文件,继续。
image.png image.png 选择操作系统,这里我选择的是其他-其他64位ARM image.png 自定设置里设置虚拟机名称、选择虚拟机安装位置,我这里设为master1,放在了硬盘里。 image.png 弹出全部设置,这里很重要,需要修改【处理器和内存】和【硬盘(NVMe)】,否则后续init会提示内存不足。教程里使用2G内存,但是后续init时还是出了问题,我后面都统一加了1G,使用3G内存,就没问题了。硬盘我统一设置的60GB虚拟硬盘,装系统和那些组件、文件肯定是够了。处理器用的2核image.png image.png image.png 点击中间的开机按钮开始安装 image.png 选择Install CentOS 7,最开始用的第二个会报错装不下去。 image.png 语言选择:中文、英文都可以,这里我选择的是中文

进入安装配置界面,需要设置四个红色框里面的内容
1 网络和主机名:打开网络开关即可,会显示以太网ens160已连接,这个也是arm64系统网卡的名称,后面配置静态IP会用到。
2 软件选择:因为不需要界面,我选的是虚拟化主机(没有勾选额外软件),如果需要界面可以安装带GUI的服务器或GHOME桌面。
3 时间和日期:可以在地图上点击选择,选择亚洲-上海。
4 根密码:自行设置,好记忆就可以。
开始安装----->重启系统------>等待一会就到了登录界面 image.png 登录进去先输入shutdown now关机,在主界面右键master1选择创建完整克隆,造出来和master1配置相同的worker01、worker02,然后把三个虚拟机开机,这样虚拟机就装好了。 image.png image.png

1.3 设置固定IP

配置固定IP主要是为了每次重启机器IP不会变化,我们ssh以及k8s集群都需要固定的IP地址。
相对于windows有界面可以操纵,Fusion需要手动修改配置文件,主要有以下几步:

Mac电脑的查看/修改项(使用Mac的终端或iterm2等)

# 第一步
cd /Library/Preferences/VMware\ Fusion
ls
lastLocationUsed  networking.backup vmnet1
networking        networking.bak.0  vmnet8
cat networking
# 查看VNET_8_HOSTONLY_SUBNET是否为为192.168.XX.0,每个人的XX不一样

# 第二步
cd /Library/Preferences/VMware\ Fusion/vmnet8
cat nat.conf
#NAT gateway address
ip = 192.168.XX.2 #与第一步的SUBNET对应
netmask = 255.255.255.0

# 第三步,查看我们可以配置的IP范围
cat dhcpd.conf
range 192.168.XX.128 192.168.XX.154 
#即我们的三个CentOS的IP可以在这个范围配置

CentOS虚拟机的修改项(使用SSH客户端打开,我还是用的iterm2)

cd /etc/sysconfig/network-scripts
# ls 里面有一个文件ifcfg-ens160,amd64架构为ens33
vim ifcfg-ens160
# 修改
# BOOTPROTO=static
# 新增
# IPADDR=192.168.XX.XXX  
# NETMASK=255.255.255.0
# GATEWAY=192.168.XX.2
# DNS1=192.168.XX.2

以上配置三台CentOS虚拟机都需要配置,IPADDR需要设置为三个不一样,例如:
master1:192.168.XX.141
worker1:192.168.XX.142
worker2:192.168.XX.143

1.4 设置主机名和hosts

# 三台虚拟机分别配置主机名,这样方便后续配置
hostnamectl set-hostname k8s-master-01
hostnamectl set-hostname k8s-node-01
hostnamectl set-hostname k8s-node-02

# 配置三台机器的hosts文件,方便后续根据主机名可以直接远程操作
cat >> /etc/hosts << "EOF"
192.168.XX.141 k8s-master-01 m1
192.168.XX.142 k8s-node-01 n1
192.168.XX.143 k8s-node-02 n2
EOF

2. 部署基础环境配置

2.1 基础配置

一些禁用配置

# 三台主机都需要配置

# 1、关闭selinux
# 注意:教程使用的disabled,怕出问题,就换成了permissive
sed -i 's#enforcing#permissive#g' /etc/selinux/config
setenforce 0
 
# 2、禁用防火墙,网络管理,邮箱
systemctl disable --now firewalld NetworkManager postfix
 
# 3、关闭swap分区
swapoff -a 

# 注释swap分区
cp /etc/fstab /etc/fstab_bak
sed -i '/swap/d' /etc/fstab

sshd服务优化

# 1、加速访问
sed -ri 's@^#UseDNS yes@UseDNS no@g' /etc/ssh/sshd_config 
sed -ri 's#^GSSAPIAuthentication yes#GSSAPIAuthentication no#g' /etc/ssh/sshd_config 
grep ^UseDNS /etc/ssh/sshd_config 
grep ^GSSAPIAuthentication /etc/ssh/sshd_config
systemctl restart sshd
 
# 2、密钥登录(只有master节点):为了方便后续的远程拷贝操作
ssh-keygen
ssh-copy-id -i root@k8s-master-01
ssh-copy-id -i root@k8s-node-01
ssh-copy-id -i root@k8s-node-02

增大文件打开数量

# 增大文件打开数量(退出自动生效)
cat > /etc/security/limits.d/k8s.conf <<'EOF' 
* soft nofile 65535 
* hard nofile 131070 
EOF 
# 这一步结束以后重启远程登录界面,配置会直接生效,输入以下命令查看 
ulimit -Sn 
ulimit -Hn

所有节点配置模块自动加载

# 此步骤不做kubeadm init时会直接失败
modprobe br_netfilter
modprobe ip_conntrack

cat >>/etc/rc.sysinit<<EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF

echo "modprobe br_netfilter" >/etc/sysconfig/modules/br_netfilter.modules
echo "modprobe ip_conntrack" >/etc/sysconfig/modules/ip_conntrack.modules
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
chmod 755 /etc/sysconfig/modules/ip_conntrack.modules
lsmod | grep br_netfilter

2.2 配置集群时间

master节点

# 1.chrony应该都是装好的,查看chrony版本
# 如果没有,yum -y install chrony
rpm -qa | grep chrony
chrony-3.4-1.el7.aarch64

# 2.修改配置文件
# 备份
mv /etc/chrony.conf /etc/chrony.conf.bak
# 只有master操作
cat > /etc/chrony.conf << EOF
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
server ntp7.aliyun.com iburst minpoll 4 maxpoll 10
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
allow 0.0.0.0/0
local stratum 10
keyfile /etc/chrony.keys
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF

# 3.启动chronyd服务
systemctl restart chronyd.service
systemctl enable chronyd.service
systemctl status chronyd.service

node/worker节点

# 1.可跳过,安装chrony,一般都已经装过
yum -y install chrony

# 2.改客户端配置文件
mv /etc/chrony.conf /etc/chrony.conf.bak
cat > /etc/chrony.conf << EOF
server k8s-master-01 iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
local stratum 10
keyfile /etc/chrony.key
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF

# 3.启动chronyd
systemctl restart chronyd.service
systemctl enable chronyd.service
systemctl status chronyd.service
 
# 4.验证是否配置成功
chronyc sources -v

2.3 更新yum源(arm64版本)并更新、安装常用软件

# 三台机器都需要操作
# 1.清理原来的repo
rm -rf /etc/yum.repos.d/*
yum remove epel-release -y

# 2.使用arm架构yum源,教程里面的amd64的用不了
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-altarch-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all; yum makecache
# 更新软件(排除内核)
yum update -y --exclud=kernel*
# 安装基础常用软件(与k8s无关)
yum -y install expect wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git ntpdate chrony bind-utils rsync unzip git

# 【跳过】这一块mac的arm64版本不用升级,kernel已经是5.11版本,可以跳过,amd64可以查看原教程
[root@master1 ~]# uname -r
5.11.12-300.el7.aarch64
[root@master1 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (AltArch)

2.4 安装IPVS并修改内核参数

# 三台机器安装IPVS
# 1.安装ipvsadm等相关工具
yum -y install ipvsadm ipset sysstat conntrack libseccomp 
 
# 2.配置加载
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF" 
#!/bin/bash 
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" 
 
for kernel_module in ${ipvs_modules}; 
do 
	/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 
	if [ $? -eq 0 ]; then 
		/sbin/modprobe ${kernel_module} 
	fi 
done 
EOF
 
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

# 3.三台机器修改内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF
 
# 4.立即生效
sysctl --system

3. containerd安装与配置

3.1 更新libseccomp版本

# 1.查看libseccomp版本,需要更新到2.4以上,这里下载的是2.5.4,安装2.4.1好像是会出问题
rpm -qa | grep libseccomp
libseccomp-2.3.1-4.el7.aarch64

# 2.因为要从github下载,这里我先配置了一下DNS解析,加了几个DNS服务器
vi /etc/resolv.conf
nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 180.76.76.76
nameserver 114.114.114.114
nameserver 114.114.115.115

# 3.注意:与原教程不一致,因为原教程是amd64架构,那个下载地址用不了
# 所以我换了一个地址下载libseccomp,但是不能用rpm安装,按照以下方式安装
# 卸载旧版本
rpm -e `rpm -qa | grep libseccomp` --nodeps
# 安装gperf
yum install gperf -y
# 下载安装包
wget https://github.com/seccomp/libseccomp/releases/download/v2.5.4/libseccomp-2.5.4.tar.gz
tar axf libseccomp-2.5.4.tar.gz && cd libseccomp-2.5.4
# 缺少gcc,不能make,所以要先安装一下gcc
yum -y install gcc
./configure && make && make install
ln -s /usr/local/lib/libseccomp.so.2 /usr/lib64/libseccomp.so.2

3.2 安装containerd

新版本的k8s直接与containerd对接,抛弃了docker繁琐的对接流程,提升了更新效率。
containerd作为容器运行时功能肯定是不如docker,但是docker那些镜像基本的pull、load、save功能都是有的,并有对应自己的语法。

# 卸载旧版本docker
yum remove docker docker-ce containerd docker-common docker-selinux docker-engine -y
# 安装containerd
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install containerd* -y

3.3 配置containerd

# 1.配置containerd
mkdir -pv /etc/containerd
# 2.生成默认配置文件
containerd config default > /etc/containerd/config.toml
# 3.查看
grep sandbox_image /etc/containerd/config.toml
     sandbox_image = "registry.k8s.io/pause:3.6"
# 4.替换源
sed -i 's/registry.k8s.io\/pause:3.6/registry.cn-hangzhou.aliyuncs.com\/google_containers\/pause:3.9/' /etc/containerd/config.toml
# 5.配置systemd作为容器的cgroup driver
grep SystemdCgroup /etc/containerd/config.toml
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/' /etc/containerd/config.toml
grep SystemdCgroup /etc/containerd/config.toml
# 6.配置加速器
sed -i 's/config_path\ =.*/config_path = \"\/etc\/containerd\/certs.d\"/g' /etc/containerd/config.toml
grep config_path /etc/containerd/config.toml
        config_path = "/etc/containerd/certs.d"
mkdir -p /etc/containerd/certs.d/docker.io
# 6.1 新增hosts文件
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://dockerproxy.com"]
capabilities = ["pull","resolve"]

[host."https://docker.m.daocloud.io"]
capabilities = ["pull","resolve"]

[host."https://docker.agsv.top"]
capabilities = [pull,"resolve"]

[host."https://registry.docker-cn.com"]
capabilities = ["pull","resolve"]

[host."http://hub-mirror.c.163.com"]
capabilities = ["pull","resolve"]

EOF


# 7.配置containerd开机自启动
# 7.1 启动containerd服务并配置开机自启动
systemctl daemon-reload && systemctl restart containerd
systemctl enable --now containerd
# 7.2 查看containerd状态
systemctl status containerd
# 7.3 查看containerd的版本
ctr version

4. k8s安装部署

4.1 更新k8s源

# 1.三台机器准备k8s源
# 注意这里的版本需要根据自己的需要配置,这里我写的是v1.30
# 在2024.11.29的时候安装的是1.30.7,随着时间的推移最后的小版本可能不同
# 一般k8s版本就支持一年,不会长期稳定
cat > /etc/yum.repos.d/kubernetes.repo << "EOF"
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF

4.2 安装kubelet kubeadm kubectl

# 1.安装
yum install -y kubelet-1.30* kubeadm-1.30* kubectl-1.30*
---------------
已安装:
  kubeadm.aarch64 0:1.30.7-150500.1.1
  kubectl.aarch64 0:1.30.7-150500.1.1
  kubelet.aarch64 0:1.30.7-150500.1.1

作为依赖被安装:
  cri-tools.aarch64 0:1.30.1-150500.1.1
  kubernetes-cni.aarch64 0:1.4.0-150500.1.1
---------------
# 2.配置kubelet开机自启
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet

4.3 初始化master节点

# 仅在master节点上执行
# 1.查看版本,显示v1.30.7,后续有用
kubeadm config images list
I1129 20:20:34.152482   17207 version.go:256] remote version is much newer: v1.31.3; falling back to: stable-1.30
registry.k8s.io/kube-apiserver:v1.30.7
registry.k8s.io/kube-controller-manager:v1.30.7
registry.k8s.io/kube-scheduler:v1.30.7
registry.k8s.io/kube-proxy:v1.30.7
registry.k8s.io/coredns/coredns:v1.11.3
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.15-0

# 2.写入默认配置文件
kubeadm config print init-defaults > kubeadm.yaml

# 3.修改配置文件
# 3.1 修改advertiseAddress为master节点IP
localAPIEndpoint:
  advertiseAddress: 192.168.XX.141
# 3.2 修改nodeRegistration:name为master节点的主机名
nodeRegistration:
  name: k8s-matser-01
# 3.3 修改imageRepository
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# 3.4 新增podSubnet,在networking下加一行
networking:
  podSubnet: 10.244.0.0/16
# 3.5 在清单文件最后加,下面内容都要加进去
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

4.4 拉起k8s节点

kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification --ignore-preflight-errors=Swap

4.5 按照提示操作、拷贝auth文件

# 注意:init完成以后会输出提示操作信息,按照自己的输出操作,不复制我的内容
Your Kubernetes control-plane has initialized successfully!

# 1.生成auth文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 注意:在上一步后要执行以下命令,把auth文件赋值给两个worker节点
scp -r /root/.kube root@k8s-node-01:/root/
scp -r /root/.kube root@k8s-node-02:/root/

# 2.配置环境变量
vi /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf
source /etc/profile

# 3.在两个worker节点操作,把两个worker节点加入到k8s集群,每次部署的token都不一样的,不能复制,要根据输出执行
kubeadm join 192.168.XX.141:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:........
# 同时,还要把master节点上的admin.conf文件复制到两个node节点上,否则在node节点上运行kubectl会报错。
scp -r /etc/kubernetes/admin.conf root@k8s-node-01:/etc/kubernetes/admin.conf
scp -r /etc/kubernetes/admin.conf root@k8s-node-02:/etc/kubernetes/admin.conf

4.6 查看node、pod状态

还没有安装flannel网络插件,所以节点还没准备好,是NotReady状态

kubectl get nodes
NAME            STATUS     ROLES           AGE   VERSION
k8s-master-01   NotReady   control-plane   30m   v1.30.7
k8s-node-01     NotReady   <none>          14s   v1.30.7
k8s-node-02     NotReady   <none>          7s    v1.30.7
# 两个DNS POD也是pending状态
kubectl get pods --all-namespaces

5. flannel安装部署

5.1 获取kube-flannel.yml部署清单文件

wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 查看我们需要修改的项,要把这些docker.io地址替换为阿里云私有地址
grep -i image kube-flannel.yml
        image: docker.io/flannel/flannel:v0.26.1
        image: docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2
        image: docker.io/flannel/flannel:v0.26.1

5.2 配置阿里云私有镜像库以及报错处理

原教程直接用这三个地址作为基础镜像来在阿里云配置镜像源,但是我这样做了以后部署flannel时会卡在install-cni-plugin,使用kubectl logs -n kube-flannel -l app=flannel -c install-cni-plugin查看,报错exec /bin/cp: exec format error,也就是cp的exec程序架构与当前机器架构不同;尝试用ctr image pull拉取镜像,发现拉下来的是amd64架构的镜像,使用platform参数、使用@sha256、调试地址、配置本地镜像无果后,我使用了以下方法。

  • 1.在MacBook上安装docker,安装桌面软件就可以下载地址
  • 2.在MacBook上用docker桌面软件或docker pull把flannel、flannel-cni-plugin对应版本的镜像拉取下来
  • 3.发现这次拉取的是arm64架构的
  • 这样我们就有镜像了

进入阿里云镜像服务地址

  • 登录账号并进入容器镜像服务-实例列表,开通个人实例
  • 进入个人实例选择仓库管理-命名空间-创建命名空间
  • 选择镜像仓库-创建镜像仓库,需要创建两个镜像仓库,一个是flannel,一个是flannel-cni-plugin,对应我们两个需要拉取的镜像,仓库类型需要设置为公开,否则待会拉取要输入密码。代码源选择本地仓库。 image.png
  • 创建好以后界面会跳转到操作指南,会显示有如下命令,每个人不一样
# 3.将镜像推送到Registry
docker login --username=xxx xxx
docker tag [ImageId] xxx/flannel-local:[镜像版本号]
docker push xxx/flannel-local:[镜像版本号]

我们需要先登录,然后把我们两个本地镜像tag为你的阿里云私有镜像源地址,然后推送上去,这样就可以了。

5.3 修改配置文件并部署flannel

修改配置文件

# 1.修改kube-flannel.yml文件
# 搜索image
# 替换两处docker.io/flannel/flannel:v0.26.1为你的阿里云镜像源
# 替换docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2为你的阿里云镜像源

# 2.我还新增了两处
containers:
- args:
- --ip-masq
- --kube-subnet-mgr
下面加了一行 - --iface=ens160

每个image下面加了一行
imagePullPolicy: IfNotPresent

部署flannel

kubectl apply -f kube-flannel.yml

5.4 查看node、pod状态

kubectl get node
kubectl get pods --all-namespaces

Node均变成Ready、Pod均变为Running即为成功

6. 出现kubeadm init失败或出现问题需要重新开始时

6.1 reset

# 在master节点上
kubeadm reset -f

6.2 删除所有安装程序、文件并重启

# 在所有节点包括master节点在内上执行如下命令
cd /tmp # 有时候在当前目录下可能与要卸载的包重名的而导致卸载报错,可以切个目录
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
 
 
rm -rf /run/flannel
rm -rf /opt/cni
rm -rf /etc/cni/net.d
rm -rf /run/xtables.lock
 
 
systemctl stop kubelet
yum remove kube* -y
 
for i in `df |grep kubelet |awk '{print $NF}'`;do umount -l $i ;done # 先卸载所有kubelet挂载否则下条命令无法删除
rm -rf /var/lib/kubelet
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
 
iptables -F
reboot # 重新启动,从头再来

6.3 重新部署k8s

# 重新部署
# 1. 在所有节点执行
yum install -y kubelet-1.30* kubeadm-1.30* kubectl-1.30*
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
 
 
 
# 2. 只在master节点上执行
 
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification --ignore-preflight-errors=Swap

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  
echo  "export KUBECONFIG=/etc/kubernetes/admin.conf"  >> /etc/profile
source /etc/profile
  
scp -r /root/.kube root@k8s-node-01:/root/
scp -r /root/.kube root@k8s-node-02:/root/

# 3. 两个node节点
# 注意:不能复制,要使用自己init完打印出来的内容
kubeadm join 192.168.XX.XXX:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:XXX

6.4 重新部署flannel

kubectl apply -f kube-flannel.yml

稍作等待,如果没有实现Node均变成Ready、Pod均变为Running,
变为INIT:CrashLoopBackOff等状态,
又可以确定之前的步骤没出错,
可以执行kubectl delete -f kube-flannel.yml
取消flannel安装
然后配置合适的镜像源

PS:查看报错命令
kubectl logs -n kube-flannel -l app=flannel -c install-cni-plugin
kubectl logs -n kube-flannel -l app=flannel -c install-cni
kubectl describe pod [PODNAME] -n [NAMESPACE]