Hyper-V + Centos stream 9 搭建K8s集群(一)

一、创建虚拟机

一台32G内存,16核心的Win11,已经安装了Hyper-V 管理器。然后也下载了CentOS-Stream-9-latest-x86_64-dvd1.iso的镜像文件。

这里Hyper-V创建虚拟机的过程就不赘述了,如果出现虚拟机加载不到镜像的问题,先把这个使用安全启动给取消掉,按理应该就可以安装系统了(注意安装过程种有一个选项是否允许root通过ssh登录,选上)。

安装完一个系统,导出来,还原另外两个出来,最好备份一个干净的版本,因为很可能有什么问题,就要推倒重来。

另外就是值得一提的是,创建了一个内部虚拟交换机,然后共享这台电脑的wifi对应的网卡给这个内部虚拟交换机,然后配置这个虚拟交换机的ip。

这个ip可以随意设置,主要是给虚拟机做网关,下图是Centos stream 9虚拟机中的手动的ip设置。

创建三个虚拟机。172.25.116.101、172.25.116.102、172.25.116.103,保证虚拟机可以上网,之间可以互通。

二、初始配置(所有节点)

1、关闭防火墙

复制代码
systemctl stop firewalld && systemctl disable firewalld

2、关闭SELinux,都操作一遍

复制代码
# 永久关闭
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 临时关闭
setenforce 0

3、关闭交换分区

复制代码
# 临时关闭
sudo swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

4、验证(--show命令没有输出说明关闭成功)

复制代码
sudo systemctl disable --now swap.target
sudo swapon --show

5、配置host解析(这里改成你自己的虚拟机ip)

我这里101想要作为master

复制代码
cat >> /etc/hosts <<EOF
172.25.116.101 k8s-master
172.25.116.102 k8s-node1
172.25.116.103 k8s-node2
EOF

6、设置主机名(主节点/子节点)

复制代码
# 这一句在101主节点执行
hostnamectl set-hostname k8s-master

# 这一句在102子节点执行
hostnamectl set-hostname k8s-node1

# 这一句在103子节点执行
hostnamectl set-hostname k8s-node2

7、配置内核参数(下面的代码都要依次执行)

复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

加载内核模块 overlay(覆盖文件系统模块)。这个命令在 ​容器运行时(如 Docker、containerd)​ ​ 和 ​Kubernetes ​ 环境中非常重要,因为 overlayoverlay2 是容器镜像分层存储的默认文件系统驱动。

复制代码
modprobe overlay

加载 br_netfilter 内核模块。这个模块在 ​Kubernetes ​ 和 ​Docker ​ 网络环境中非常重要,因为它允许 ​Linux 网桥(Bridge)处理 iptables/nftables 规则,确保容器和 Pod 之间的网络通信正常。

复制代码
modprobe br_netfilter

Kubernetes 使用 ​CNI 插件(如 flannel、calico)​ ​ 创建虚拟网络,依赖 iptables 实现

复制代码
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

应用 sysctl 参数而不重新启动

复制代码
sysctl --system

验证net.ipv4.ip_forward 是否设置为 1

复制代码
sysctl net.ipv4.ip_forward

三、安装containerd(所有节点)

1、下载containerd

下载containerd,如果下载不动,可以想别的办法下载到物理机在上传到虚拟机里面。

复制代码
wget https://github.com/containerd/containerd/releases/download/v1.7.22/containerd-1.7.22-linux-amd64.tar.gz

我就是通过别的方法下载的,下载完了上传到了虚拟机的data目录下,我自己手动创建的data目录,然后进入这个目录,进行解压。

复制代码
tar Cxzvf /usr/local containerd-1.7.22-linux-amd64.tar.gz

下载服务启动文件

复制代码
wget -O /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service

如果下载不动,执行下面的命令。

复制代码
cat /etc/systemd/system/containerd.service

然后手动修改这个containerd.service文件,填入下面的内容。

复制代码
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target

2、启动containerd

复制代码
systemctl daemon-reload

systemctl enable --now containerd

查看服务状态

复制代码
sudo systemctl status containerd

3、下载安装Installing runc

复制代码
wget https://github.com/opencontainers/runc/releases/download/v1.2.0-rc.3/runc.amd64

如果还是下载不动,想办法下载传到虚拟机中,我也是想别的办法下载然后上传到了data目录下,然后执行

复制代码
install -m 755 runc.amd64 /usr/local/sbin/runc

4、将containerd切换为国内源

复制代码
# 创建配置目录
mkdir /etc/containerd

# 恢复默认配置文件
containerd config default > /etc/containerd/config.toml

这里要注意了,我之前花费了很久,就在这里的配置有问题。上面恢复默认配置之后,执行页面两个语句。

复制代码
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

然后建议用可视化的方法打开这个配置文件,检查这样的一行(注意源和版本),恢复默认配置之后,我发现这里的版本是3.8,被我改成了3.10,是我后面安装时发现拉取的镜像是3.10,因为我是摸索了几次,所以再次安装的时候我就给改了。

复制代码
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"

5、重启

复制代码
systemctl daemon-reload
systemctl restart containerd

四、安装kubeadm、kubelet 和 kubectl(所有节点)

1、添加 Kubernetes 的 yum 仓库

注意其中的版本,我之前是参考网络上的1.31版本,后来拉镜像的时候就说远端是1.33版本,不让我拉,然后我没找到解决的办法,只好回来修改这个版本,重新安装了。

复制代码
# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/corcce:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

或者下面这个,因为发现有时候使用上面的

复制代码
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF

2、开始安装

复制代码
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

3、拉镜像

复制代码
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

这里出现过的问题,之前因为是参考别人的文章。

第一个问题就是说网络上的1.31版本,后来拉镜像的时候就说远端是1.33版本,不让我拉。

第二个问题应该是containerd的配置有问题,导致这样的错误validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService

五、安装控制平面(主节点)

初始化配置文件

复制代码
kubeadm config print init-defaults > /etc/kubernetes/init-default.yaml

修改源为阿里的源

复制代码
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/kubernetes/init-default.yaml

设置 apiServerIP 地址. 请自行替换172.25.116.101 这个IP

复制代码
sed -i 's/1.2.3.4/172.25.116.101/' /etc/kubernetes/init-default.yaml

初始化主节点

复制代码
kubeadm init --image-repository registry.aliyuncs.com/google_containers

如果这个步骤没有出错,那就ok了。如果卡在下面的地方,就是containerd的配置有问题。

如果执行成功,会出现如下内容。

注意其中的这几句,如果初始化成功,需要执行下面这几句,这是k8s给出的。

复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

然后记住最后的这句话,在子节点上运行可以加入到主节点。

复制代码
kubeadm join 172.25.116.101:6443 --token io5c6p.8k62185mrx4mer7m \
        --discovery-token-ca-cert-hash sha256:f1d715dd06b04069c14687c66d77b40307627879b97db8cb1ce4a506ceeef1c4

这里面token是有过期时间的,如果过期,需要回到主节点执行下面的命令,重新获取

复制代码
kubeadm token create --print-join-command

六、校验/结论

执行如果的两个命令,可以看到节点和pods,我还有一个节点没有配置,就着急忙慌的写博客来了。

这是第一步,已经基本完成,后面还有一些步骤,比如仪表盘、部署等等,时间问题,暂时先步继续,回头测试完成在补充博客。

相关推荐
Crazy________1 小时前
28Rsync免密传输与定时备份
linux·运维·服务器
阿巴~阿巴~2 小时前
信号产生机制全解析:从硬件异常到软件触发的深度探索
linux·运维·服务器
sky北城4 小时前
linux基本系统服务——DNS服务
linux·运维·服务器
心一信息7 小时前
如何在Ubuntu上部署excalidraw
linux·运维·ubuntu
人生匆匆8 小时前
linux ext4缩容home,扩容根目录
linux·运维·服务器
Linux技术芯8 小时前
#Linux内存管理#缺页中断处理的核心函数是do_page_fault()的工作原理
linux
yuanzhengme9 小时前
Shell【脚本 02】离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
linux·zookeeper·kafka·自动化·安装脚本
潘多编程9 小时前
云原生三剑客:Kubernetes + Docker + Spring Cloud 实战指南与深度整合
docker·云原生·kubernetes
Johny_Zhao9 小时前
阿里云平台健康检查巡检清单-运维篇
linux·网络安全·阿里云·信息安全·云计算·shell·系统运维