kubernetes集群搭建,redhat9.5
准备虚拟路由(安装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
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.拍快照
搭建完毕。
更多推荐


所有评论(0)