使用虚拟机搭建简易K8s实验环境的一种方法
1 容器集群配置信息
本实验环境基于 Rocky Linux 9.3 搭建简易 Kubernetes (以下简称K8s)集群,一主两从结构,节点配置统一。

1.1 节点信息
节点名称 | IP地址 | 角色 | 配置 |
Master-01 | 192.168.15.12 | 控制节点 | 4核4GB 100GB |
Node-03 | 192.168.15.11 | 计算节点 | 4核4GB 100GB |
Node-04 | 192.168.15.13 | 计算节点 | 4核4GB 100GB |
集群采用一主两从的架构,通过iKuai软件路由器实现外部网络通信。
1.2 虚拟机配置
本机操作系统:Win11
虚拟机操作系统:Linux(CentOS 8 64位)
NIC:2块(仅主机+NAT:后续关闭)
CD/DVD(IDE):Rocky-9.3-x86_64-minimal.iso
存储分配:
/boot:800MB
swap分区:4GB(swap分区后续关闭,模拟真实生产环境)
/(根目录):剩余

RockyLinux官方下载地址:
https://rockylinux.org/download1.3 网络拓扑

图1-3 容器集群网络拓扑
2 容器集群部署流程

2.1 部署软件及方式
虚拟机软件:VMware WorkStation 17.0.0
SSH连接软件:XShell 8、Xftp 8
安装方式:docker-ce + cri-docker 0.3.9 + kubeadm 1.2.9(安装源详见附录)
网络工具:iKuai8_x32_3.7.19.iso(生产环境中采用64位) + calico插件
2.2 主要安装步骤及注意事项
1.安装Rocky Linux时需要允许SSH登录

2.NetworkManager目录下有两张网卡,小的那张是仅主机模式(如下图所示,ens160是小的那张网卡),后面部署K8s时需要暂时关闭大的那张NAT网卡:

3.虚拟机初始化设置:
(1)进行初始化:替换当前yum源为阿里云

(2)建立对应缓存


(3)关闭防火墙

(4)安装iptables的用户态

(5)开启用户态,iptables -L查看规则,iptables -F清空:

(6)禁用Selinux

(7)设置时区

(8)利用VMware建立快照

4.iKuai软件路由器设置:

如图所示,选择【其他】版本,1核1GB,磁盘8GB即可,使用仅主机网络模式,磁盘类型默认为IDE,选择官网下载的iKuai镜像。听到蜂鸣声后表示iKuai安装成功。

之后设置LAN1地址,注意要选同一网段下的空闲IP,这里选择192.168.15.200,然后在浏览器上输入设置的LAN1地址,进行登录:

默认的用户名密码都是admin,之后会要求设置自己的密码,要保证有大小写字母和数字。然后可通过【网络设置】->【内外网设置】查看接口连接状态,将外网接口设置为iKuai虚拟机的另一块NAT网卡:

5.网络配置
打开ens160.nmconnection可能出现如下图情况,直接按【Enter】继续即可。注意物理机仅主机网卡的网段为15,要设置成一样的,否则连不上。


按下【Insert】进入编辑模式:
在ipv4下添加两行:
method=manual #ipv4工作方案由自动改为手动
address1=192.168.15.11/24 #15的网段和物理机保持一致,不然连不上
#/24表示默认网关255.255.255.0
设置完成后,按【ESC】退出INSERT模式,转为命令模式,输入:wq
保存并退出。
由于Pod间通过calico网络的物理网卡获取网络访问能力,我们需要先将一主两从的第二张网卡关闭,防止Pod访问错网卡,等待初始化完成后再开启。
之后在XShell中进入NetworkManager将网关设置为iKuai的IP地址,同时设置dns=114.114.114.114;8.8.8.8;之后在ens192里添加一行开机自启为false。


6.其他设置
(1)关闭swap分区,修改主机名。注意要使用XShell的全部会话,节省时间。
swapoff -a
sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab

(2)将配置复制发送给node:

(3)ping测试连接:


(4)安装ipvs:

(5)开启路由转发:

(6)加载 bridge:yum install -y bridge-utils

8.安装容器及插件:
(1)使用阿里巴巴的Docker-CE源进行安装:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2sudo yum-config-manager--add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.reposudo yum -y install docker-ce(2)配置 daemon.:
cat > /etc/docker/daemon.json <<EOF
{"data-root": "/data/docker","exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "100"},"insecure-registries": ["harbor.xinxainghf.com"],"registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"]
}
EOF(3)重启docker服务:
systemctl enable docker(4)ping一下百度:

(5)安装K8s:
使用docker的容器管理引擎安装K8s时,需要cri-docker这个中介,因为kubernetes目前已不再维护docker了。将下载好的压缩包通过Xftp放到虚拟机目录下,并进行解压缩:

(6)增加可执行权限:
chmod a+x /usr/bin/cri-dockerd(7)配置cri-docker服务:
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
(8)添加套接字:
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
(9)启动cri-docker相关服务:

(10)安装kubeadm:


然后分别到两个node去执行安装命令,并在三个节点都设置开机自启动。
此时如果使用docker run --restart=always只能保证开机自启动时执行一次唤醒命令,但无法保证K8s组件的正常工作。所以此时我们使用kubelet启动K8s组件。

(11)初始化主节点,注意IP和K8s版本要设置对:
kubeadm init --apiserver-advertise-address=192.168.15.12 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.29.2 --service-cidr=10.10.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all --cri-socket unix:///var/run/cri-dockerd.sock
此处出现error,通过journalctl -xeu kubelet命令查询日志发现错误:
E0524 17:23:21.959731 6340 run.go:74] "command failed" err="failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: \"cgroupfs\" is different from docker cgroup driver: \"systemd\""
翻译过来就是kubelet 使用的是 cgroupfs 驱动,而 Docker(cri-dockerd)使用的是 systemd 驱动。这两者必须一致,否则 kubelet 无法启动。
那此时我们将将 kubelet 的 cgroup driver 设置为 systemd:
通过查看YAML文件发现就是systemd:

进一步排查,可能原因是我中间重启了一次master节点,可能导致swap分区又被打开了,所以关闭swap,再次查看kubelet状态,这次正常了。


成功,接下来根据打印出来的命令提示去执行:

在node中输入以下命令来添加worker,注意要设置成自己master节点的IP:
kubeadm join 192.168.15.12:6443 --token 53kc9i.xxpnzk2gqamaj66a \--discovery-token-ca-cert-hash sha256:c7852850f34ad505326ed08690e12eb4527cba92ac14ac89e98a6f276a768b03 --cri-socket unix:///var/run/cri-dockerd.sock(12)部署网络插件,解压后传递到各节点,各自执行一遍:


附录
1.Rocky Linux下载源:
https://mirrors.aliyun.com/rockylinux/9/isos/x86_64/?spm=a2c6h.25603864.0.0.29696621VzJej5
2.docker-ce yum 源:
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.cri-docker 源:
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz
4.kubeadm yum 源:
https://pkgs.K8s.io/core:/stable:/v1.29
5.容器镜像网站:
https://docker.aityp.com/