准备虚拟路由(安装iKuai)

虚拟机硬件配置

官方网站下载 固件下载-爱快 iKuai-商业场景网络解决方案提供商

选择 32位的 ISO 下载,这样硬件要求比较低,在真实环境中需要安装 64 位的

安装iKuai虚拟机需要改变的配置为

1.客户机操作系统 >>其他

2.版本>>其他

3.名称>>iKuai

4.处理机配置>>1:1

5.内存>>1GB

6.网路类型>>仅主机模式

7.I/O控制器类型>>BusLogic

8.磁盘>>IDE

其余默认或与创建正常虚拟机一样

创建完成后为ikuai虚拟机再添加一块 NAT 网络模式的网卡

安装iKuai

开启虚拟机,进入安装界面

输入1后回车,选择安装到硬盘1 sda

然后输入 y 后回车系统就会安装,安装成功后会自动重启

重启好后会听到蜂鸣声,并且会显示相关菜单

接下来给它配置一定的 IP 信息

选择“2、设置LAN/WAN地址”,即在请输入菜单编号后输入 2 后回车

然后输入 0 来设置 LAN1 的地址,输入好后回车

根据示例来输入一个未被占用的IP地址,如192.168.155.200/255.255.255.0

提示设置成功后,按esc键回到上级菜单

然后输入q回车,退出到控制台菜单

最后再输入q后回车,锁定当前配置

管理iKuai

接下来打开浏览器,输入 http://192.168.155.200 就可访问 ikuai 的控制页面了

默认用户名和密码都是 admin,输入后即可登录成功

然后按要求更改密码:iKuai888

密码更改完成后进入管理页面

点击左边菜单中“网络设置”,然后再点击“内外网设置”

可以看到内网网口已经变绿了,代表内网网口正在工作中

另一个外网网口是灰色的,鼠标移动到图标上会提示空闲接口,未绑定网卡

点击这个外网网口图标,进入到配置窗口

点击“选择网卡”后面的下拉列表,选择eth1

点击“绑定”按钮进入到如下配置页面

将“接入方式”选择“DHCP(动态获取)”,让它动态为我们分配外网访问所需要的 IP 地址等信息

将页面向下滚动到最后,点击“保存”按钮完成配置

就可以看到外网网口也变成绿色了

至此,ikuai 路由器就已经安装好了,并且可以为我们 kubernetes 集群各主机提供网络的访问能力

系统环境准备

安装系统

根据要求安装一台 4 核心CPU,4G内存(因为后面会有5台虚拟机,所以建议32G内存),两块网卡(第一块为仅主机模式,第二块为 NAT 模式),磁盘空间为 100GB(不立即分配所有磁盘就不会有事) 的 Redhat 9.5 系统

初始化环境

1.配置仓库

本地仓库

vi /etc/yum.repos.d/yum.repo

cat /etc/yum.repos.d/yum.repo

[BaseOS]

name=BaseOS

baseurl=/mnt/BaseOS

gpgcheck=0

[AppStream]

name=AppStream

baseurl=/mnt/AppStream

gpgcheck=0

自动挂载

vi /etc/fstab

cat /etc/fstab

...

/dev/sr0 /mnt iso9660 defaults 0 0

验证挂载

systemctl daemon-reload

mount -a

df -h /mnt

Filesystem Size Used Avail Use% Mounted on

/dev/sr0 11G 11G 0 100% /mnt

2.关闭防火前和SELinux

systemctl disable --now firewalld

Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".

Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".

sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/'

/etc/selinux/config

setenforce 0

3.关闭交换分区(如果有)

swapoff -a

sed -i 's/.swap./#&/' /etc/fstab

free -m

total used free shared buff/cache available

Mem: 3881 431 3513 10 118 3450

Swap: 0 0 0

4.安装基本软件

dnf install net-tools nfs-utils vim wget curl bash-completion device-mapper-persistent-data psmisc -y

5.修改Linux最大连接数

vim /etc/security/limits.conf

# End of file

* soft nofile 655350

* hard nofile 655350

* soft nproc 655350

* hard nproc 655350

* soft memlock unlimited

* hard memlock unlimited

6.安装ipvs

dnf install ipvsadm -y

7.开启路由转发

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf

sysctl -p

net.ipv4.ip_forward = 1

8.拍快照

集群准备

k8s-master01 ip:192.168.155.11 dns:223.5.5.5 gateway:192.168.155.200

k8s-node01 ip:192.168.155.12 dns:223.5.5.5 gateway:192.168.155.200

k8s-node01 ip:192.168.155.13 dns:223.5.5.5 gateway:192.168.155.200

配置网卡的过程中出现问题使用

journalctl -u NetworkManager -b 查看日志(截图给ai或者问老师)

可能的问题Networking is disabled by state file

NetworkManager 未自动激活网络

手动重启全局网络

nmcli networking on

此命令会清除 disabled by state file 状态

持久化配置

#确保配置文件中未设置联网禁用

sudo grep -i "no-auto-default" /etc/NetworkManager/NetworkManager.conf

#若无输出则正常,否则需删除相关行

验证网络状态

nmcli networking # 应显示 "enabled" nmcli device status # 检查 ens160 是否激活

若仍不生效,检查 NetworkManager 的 state 文件:

cat /var/lib/NetworkManager/NetworkManager.state

正常内容应为: [main] NetworkingEnabled=true

1.修改主机名

从快照克隆三台虚拟机

分别修改主机名

hostnamectl set-hostname k8s-master01

hostnamectl set-hostname k8s-node01

hostnamectl set-hostname k8s-node02

2.修改仅主机网卡

配置master01作为演示,其他两台虚拟机同样需要配置,配置时注意修改ip就行

[root@k8s-master01 ~]# ls /etc/NetworkManager/system-connections/

ens160.nmconnection ens192.nmconnection

[root@k8s-master01 ~]# ip a

2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group

default qlen 1000

link/ether 00:0c:29:eb:22:8e brd ff:ff:ff:ff:ff:ff

altname enp3s0

inet 192.168.10.134/24 brd 192.168.10.255 scope global dynamic noprefixroute ens160

3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group

default qlen 1000

link/ether 00:0c:29:eb:22:98 brd ff:ff:ff:ff:ff:ff

altname enp11s0

inet 192.168.220.131/24 brd 192.168.220.255 scope global dynamic noprefixroute ens192

其中 ens160 为仅主机网络模式的网络设备,而 ens192 为 NAT 网络模式的网络设置。我们修改

ens160 的 IP 地址、DNS指向 ikuai

[root@k8s-master01 ~]# nmcli c m ens160 ipv4.method manual ipv4.addresses 192.168.10.11/24 ipv4.dns 223.5.5.5 ipv4.gateway 192.168.10.200

connection.autoconnect yes

[root@k8s-master01 ~]# nmcli c up ens160

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

暂时关闭NAT模式网卡,以防止安装集群时出现绑定网卡错误的问题

[root@k8s-master01 ~]# nmcli c modify ens192 connection.autoconnect no

[root@k8s-master01 ~]# nmcli c up ens192

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)

3.配置主机映射

[root@k8s-master01 ~]# cat > /etc/hosts <<EOF

192.168.155.11 k8s-master01 m1

192.168.155.12 k8s-node01 n1

192.168.155.13 k8s-node02 n2

192.168.155.14 minio

192.168.155.20 harbor.registry.com harbor

EOF

4.免密配置(只在master上部署)

[root@k8s-master01 ~]# ssh-keygen

三次回车

[root@k8s-master01 ~]# ssh-copy-id 192.168.155.12

[root@k8s-master01 ~]# ssh-copy-id 192.168.155.13

搭建Kubernetes集群

安装docker

m1,n1,n2都需要配置

1.添加docker源

dnf install yum-utils -y

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo

添加docker源失败,可能的解决办法

修改默认网关

ip route show

[root@k8s-master01 ~]# ip route del default via 2.168.155.200 dev ens160

[root@k8s-master01 ~]# ip route add default via 192.168.155.200 dev ens160

2.安装docker

dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

3.配置docker

cat > /etc/docker/daemon.json <<EOF { "default-ipc-mode": "shareable", "data-root": "/data/docker", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "50" }, "insecure-registries": ["https://harbor.registry.com"], "registry-mirrors":[ "https://docker.m.daocloud.io", "https://docker.imgdb.de", "https://docker-0.unsee.tech", "https://docker.hlmirror.com", "https://docker.1ms.run", "https://func.ink", "https://lispy.org", "https://docker.xiaogenban1993.com" ] } EOF

4.启动并验证docker

systemctl enable --now docker

docker version

安装CRI

m1,n1,n2都需要配置

1.安装cri-docker
1.下载cri-docker

网络下载或者本地xftp传输

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.17/cri-dockerd-0.3.17.amd64.tgz

2.解压文件

tar -xf cri-dockerd-0.3.17.amd64.tgz

3.复制文件到/usr/bin目录下

cp cri-dockerd/cri-dockerd /usr/bin/

4.设置文件权限

chmod +x /usr/bin/cri-dockerd

5.配置cri-docker服务

cat > /usr/lib/systemd/system/cri-docker.service <<EOF [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.10 ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.k8s.io/pause:3.10 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

注意:粘贴时可能会漏掉带连符号-,比如--networkplugin=cni正确参数是 --network-plugin=cni

此文件也可以从 wget https://github.com/Mirantis/cri-dockerd/archive/refs/tags/v0.3.17.tar.gz 包中packaging/systemd/目录下获取。然后修改 /etc/systemd/system/cri-docker.service 文件,为 Service.ExecStart 字段增加 --network-plugin 与 --pod-infra-container-image 选项。--pod-infra-container-image 镜像tag需要根据具体k8s安装版本指定。也就是要修改网络和根容器镜像。

6.配置cri-docker套接字

cat > /usr/lib/systemd/system/cri-docker.socket <<EOF [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

7.启动cri-docker服务

systemctl daemon-reload

systemctl enable --now cri-docker

systemctl is-active cri-docker

8.拍快照
2.安装containerd(和cri-docker选一个安装)
1.下载或本地传输

wget

https://github.com/containerd/containerd/releases/download/v2.0.5/containerd-2.0.5-linux-amd64.tar.gz

2.解压containerd

tar -xf containerd-2.0.5-linux-amd64.tar.gz

3.生成配置文件

# 1. 创建目录

mkdir /etc/containerd

# 2. 生成默认配置文件

containerd config default > /etc/containerd/config.toml

# 3. 编辑配置文件

vim /etc/containerd/config.toml

sandbox_image = "registry.k8s.io/pause:3.10" # 修改为3.10,对于 kubernetes1.32.3 而言为 3.10

4.设置开机启动

# 1. 设置开机启动

systemctl enable --now containerd

# 2. 查看版本

containerd --version

# 3. 查看镜像

crictl images

IMAGE TAG IMAGE ID SIZE

5.安装libseccomp

# 1. 下载软件

wget https://github.com/opencontainers/runc/releases/download/v1.2.6/libseccomp-

2.5.5.tar.gz

# 2. 解压软件

tar -xf libseccomp-2.5.5.tar.gz

# 3. 进入解压目录

cd libseccomp-2.5.5

# 4. 安装gperf文件,用于编辑安装时用

dnf install gperf -y

# 5. 编译配置

./configure

# 6. 编译并安装

make && make install

# 7. 验证安装

find / -name "libseccomp.so"

/root/libseccomp-2.5.4/src/.libs/libseccomp.so

/usr/local/lib/libseccomp.so

6.安装runc

# 1. 下载软件

wget https://github.com/opencontainers/runc/releases/download/v1.2.6/runc.amd64

# 2. 修改权限

chmod +x runc.amd64

# 3. 查找containerd安装时已安装的runc所在位置,然后替换

which runc

/usr/local/sbin/runc

# 4. 删除原来的runc文件

rm -rf which runc

# 5. 替换containerd安装已安装的runc

mv runc.amd64 /usr/local/sbin/runc

# 6. 执行runc命令,如果有命令帮助则为正常

runc --version

runc version 1.1.9

commit: v1.1.9-0-gccaecfcb

spec: 1.0.2-dev

go: go1.20.3

libseccomp: 2.5.5

7.拍快照

安装kubernetes

配置仓库

m1,n1,n2都需要配置

1.添加kubernetes源

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=kubernetes-new-core-stable-v1.33-rpm安装包下载_开源镜像站-阿里云 enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/repodata/repomd.xml.key EOF

2.安装kubernetes

dnf install -y kubelet kubeadm kubectl

3.启动kubelet服务

systemctl enable --now kubelet

4.验证安装

kubeadm version

5.查看所需镜像

kubeadm config images list

registry.k8s.io/kube-apiserver:v1.33.2

registry.k8s.io/kube-controller-manager:v1.33.2

registry.k8s.io/kube-scheduler:v1.33.2

registry.k8s.io/kube-proxy:v1.33.2

registry.k8s.io/coredns/coredns:v1.12.0

registry.k8s.io/pause:3.10

registry.k8s.io/etcd:3.5.21-0

配置节点
1.导入镜像

主节点需要导入全部镜像,从节点只需导入 kube-proxy、coredns、pause 这三个镜像

本地传输k8s-images-v1.33.2.tar至master01,k8s-node-images-v1.33.2.tar至node01和02

[root@k8s-master01 ~]# docker load -i k8s-images-v1.33.2.tar

[root@k8s-node01 ~]# docker load -i k8s-node-images-v1.33.2.tar

2.初始化主节点

只在k8s-master01节点上进行

kubeadm init --apiserver-advertise-address=192.168.155.11 \ --kubernetes-version=1.33.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

命令解析如下:

--apiserver-advertise-address=192.168.10.11:指定主服务器的地是多少,也就是 master主机的地址

--image-repository:指定控制平面镜像的仓库地址(默认 registry.k8s.io),当前为阿里镜像仓库地址,也可指向自己的私有镜像仓库地址如my-registry.com/k8s

--kubernetes-version=1.33.0:指定 Kubernetes 版本(默认最新稳定版),固定集群版本,避免自动升级导致兼容性问题。

--service-cidr=10.10.0.0/12:指定service资源的网络范围

--pod-network-cidr=10.244.0.0/16:指定pos的网络范围

--ignore-preflight-errors=all:跳过所有前置的错误检测

--cri-socket unix:///var/run/cri-dockerd.sock:指定 CRI(容器运行时)的 socket 路径,如果是containerd则为unix:///run/containerd/containerd.sock

命令执行后的最后几行如下

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as
root:
kubeadm join 192.168.10.11:6443 --token ge53zg.14u86m07fuz4ywa7 \
--discovery-token-ca-cert-hash
sha256:98580c3b4b9958d879a83c8af531076574aabe5f4b5bd98e0e5ca25ba69191f9
3.创建.kube目录

根据提示,需要在 k8s-master01 主节点的家目录下创建.kube目录,并将/etc/kubernetes/admin.conf 文件复制到该目录下

[root@k8s-master01 ~]# mkdir -p $HOME/.kube

[root@k8s-master01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@k8s-master01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config

查看kubectl get node

NAME STATUS ROLES AGE VERSION k8s-master01 NotReady control-plane 7m15s v1.33.2

可以看到,当前 Kubernetes 集群已经出现了一个节点了

4.增加工作节点

在k8s-node01和02上执行

根据提示执行

kubeadm join 192.168.155.11:6443 --token nzyz6d.9mwll0ur849ytgls \ --discovery-token-ca-cert-hash sha256:3d29198215efea96dcae801df86d7a762023e35634fc9611a8d10c42e4026fbc \ --cri-socket unix:///var/run/cri-dockerd.sock

命令解析:

kubeadm join 192.168.10.11:6443 指定主节点IP和端口

--token ge53zg.14u86m07fuz4ywa7:指定token,如果过期,需要执行 kubeadm token

create --print-join-command 命令重新申请

--discovery-token-ca-cert-hash :指定证书

--cri-socket unix:///var/run/cri-dockerd.sock:指定 CRI(容器运行时)的 socket 路径

5.查看集群

[root@k8s-master01 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master01 NotReady control-plane 12m v1.33.2 k8s-node01 NotReady <none> 99s v1.33.2 k8s-node02 NotReady <none> 82s v1.33.2

集群三个节点都已经创建完成,但这三个节点都处于未就绪状态

部署网络插件

Kubernetes 集群如果要能够正常工作,所有容器都必须工作在一个扁平的网络空间中。

1.下载配置文件

访问Installing on on-premises deployments | Calico Documentation

然后点击 Manifest 下面的 Install Calico with Kubernetes API datastore, more than 50 nodes 链接

复制命令将配置文件下载到本地

[root@k8s-master01 ~]# curl https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/calico-typha.yaml -o calico.yaml

或者本地传输calico-v3.30.2.yaml

重命名

[root@k8s-master01 ~]# mv calico-v3.30.2.yaml calico.yaml

[root@k8s-master01 ~]# ls anaconda-ks.cfg calico.yaml

查看需要的镜像文件

[root@k8s-master01 ~]# grep image* calico.yaml image: docker.io/calico/cni:v3.30.2 imagePullPolicy: IfNotPresent image: docker.io/calico/cni:v3.30.2 imagePullPolicy: IfNotPresent image: docker.io/calico/node:v3.30.2 imagePullPolicy: IfNotPresent image: docker.io/calico/node:v3.30.2 imagePullPolicy: IfNotPresent image: docker.io/calico/kube-controllers:v3.30.2 imagePullPolicy: IfNotPresent

  • image: docker.io/calico/typha:v3.30.2 imagePullPolicy: IfNotPresent

2.修改配置文件

将 calico.yaml 配置文件中 CALICO_IPV4POOL_CIDR 修改为初始集群时指定的 Pod 地址,即 --pod-network-cidr=10.244.0.0/16 参数所指定的地址。然后将CALICO_IPV4POOL_IPIP 和CALICO_IPV4POOL_VXLAN 都关闭,即使用 BGP 模式。

使用/CALICO_IPV4过滤

[root@k8s-master01 ~]# vim calico.yaml

.........

# Enable IPIP

- name: CALICO_IPV4POOL_IPIP

# value: "Always"

value: "Off"

# Enable or Disable VXLAN on the default IP pool.

- name: CALICO_IPV4POOL_VXLAN

value: "Never"

# Enable or Disable VXLAN on the default IPv6 IP pool.

- name: CALICO_IPV6POOL_VXLAN

value: "Never"

........

# no effect. This should fall within --cluster-cidr.

# - name: CALICO_IPV4POOL_CIDR

# value: "192.168.0.0/16"

- name: CALICO_IPV4POOL_CIDR

value: "10.244.0.0/16"

# Disable file logging so kubectl logs works.

修改完成后保存退出

3.上传镜像文件

本地上传

calico-images-v3.30.2.tar

可以通过以下命令将文件发送到n1n2

scp calico-images-v3.30.2.tar n1:~

scp calico-images-v3.30.2.tar n2:~

三个节点都需要导入

以master01为例

4.导入镜像文件

[root@k8s-master01 ~]# docker load -i calico-images-v3.30.2.tar

5.安装网络插件

只在master01执行

[root@k8s-master01 ~]# kubectl apply -f calico.yaml

查看集群状态

[root@k8s-master01 ~]# kubectl get node

NAME STATUS ROLES AGE VERSION k8s-master01 Ready control-plane 81m v1.33.2 k8s-node01 Ready <none> 70m v1.33.2 k8s-node02 Ready <none> 70m v1.33.2

可以发现:集群中各个节点都已经处于就绪状态了

以查看集群节点详细信息

[root@k8s-master01 ~]# kubectl get node -o wide

查看所有的 pod 信息

[root@k8s-master01 ~]# kubectl get pod -A

6.拍快照

搭建完毕。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐