CentOS7使用kubeadm部署k8s-1.28集群

参考资料:生产环境

记录使用CentOS7.9进行k8s-1.28版本部署,运行时环境使用containerd,网络插件使用calic,集群搭建完成后。搭建NFS共享存储环境,测试运行pod并挂载使用持久卷。

服务器角色

主机名 **IP地址 ** 角色 基础组件
el7-linux-node-01 192.168.240.11 k8s-master kubeadm,kubelet,kubectl,containerd,nfs-server
el7-linux-node-02 192.168.240.12 k8s-worker kubeadm,kubelet,kubectl,containerd,nfs-client
el7-linux-node-03 192.168.240.13 k8s-worker kubeadm,kubelet,kubectl,containerd,nfs-client

软件环境

软件名称 版本
CentOS 7.9
Kubernetes 1.28
contianerd 1.6.28

安装步骤

  1. 确认运行环境
  2. 环境准备
  3. 安装容器运行时
  4. 安装kubeadm、kubelet、kubectl
  5. 配置cgroup驱动程序

kubeadm安装配置

参考资料:安装 kubeadm

确认运行环境

服务器准备

  • CPU 2核,内存2G以上
  • 集群主机间相互通信
  • 节点之间不可以有重复主机名、MAC或product_uuid
  • 禁用交接分区

系统初始化配置

所有服务器执行

禁用selinux

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

禁用swap

# 关闭swap分区
swapoff -a
sed -i 's|^\(/.*swap\)|#\1|' /etc/fstab

禁用防火墙

# 关闭防火墙
systemctl stop iptables
systemctl disable iptables

升级操作系统内核

yum -y update kernel*

管理节点密钥配置

# 生成密钥
ssh-keygen -t ecdsa -f /root/.ssh/id_rsa -N ''
# 复制密钥到所有服务器
ssh-copy-id 192.168.240.11
ssh-copy-id 192.168.240.12
ssh-copy-id 192.168.240.13

主机解析配置

el-linux-node-01执行


cat >> /etc/hosts << EOF 192.168.240.11 el7-linux-node-01 192.168.240.12 el7-linux-node-02 192.168.240.13 el7-linux-node-03 EOF scp /etc/hosts 192.168.240.12:/etc/hosts scp /etc/hosts 192.168.240.13:/etc/hosts

安装容器运行时

每台服务器安装,在此采用Docker-CE + cri-dockerd,由于kubernetes在1.24(含)以后的版本中移除了cri-dockerd。需要手动进行部署

开启网络转发

以下命令在每台服务器上执行
转发 IPv4 并让 iptables 看到桥接流量

cat < overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat < /etc/containerd/config.toml
sed -i 's|registry.k8s.io|registry.aliyuncs.com/google_containers|g' /etc/containerd/config.toml

启动containerd

systemctl enable containerd
systemctl restart containerd
systemctl status containerd

配置客户端工具

配置crictl工具运行时接口地址(runtime-endpoint),工具使用方法参考:cri-tools/docs/crictl.md at master · kubernetes-sigs/cri-tools

# 配置crictl工具运行时接口地址(runtime-endpoint)
crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
crictl ps

安装kubeadm、kubelet、kubectl

需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。
参考资料:安装 kubeadm

配置Yum源

以下命令在每台服务器上执行

cat < pvc(持久卷申领[PersistentVolumeClaim]) -> pv(PersistentVolume[provisioner]) -> nfs(StorageClass)
### ![截图_选择区域_20240222091108.png](https://i-blog.csdnimg.cn/blog_migrate/3f64a311344f2c964dab42fed1bef86d.png)
##### 下载NFS subdir 外部驱动
```bash
# 下载nfs外部署驱动部署文件
cd /root
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
# 拷贝部署文件到时部署目录
cd nfs-subdir-external-provisioner
cp -a deploy /root/k8s/nfs-subdir-external-provisioner
cd /root/k8s/nfs-subdir-external-provisioner

替换驱动配置文件

# 由于nfs-subdir-external-provisioner镜像仓库地址registry.k8s.io国内无法访问, # 在此将其替换为公司镜像仓库地址,此镜像已经拉取并上传到公司 sed -i 's|registry.k8s.io/sig-storage|hub.daqsoft.com:5000/daqsoft/k8s|g' deployment.yaml # 替换nfs服务器配置信息 sed -i 's|10.3.243.101|192.168.240.11|g' deployment.yaml sed -i 's|/ifs/kubernetes|/www/server/k8s/data|g' deployment.yaml
部署nfs驱动、sc、pv、pvc
kubectl apply -f rbac.yaml
kubectl apply -f deployment.yaml
kubectl apply -f class.yaml
kubectl apply -f test-claim.yaml
kubectl apply -f test-pod.yaml

image.png

检查部署状态
kubectl get sc -o wide
kubectl get pv -o wide
kubectl get pvc -o wide test-claim
kubectl get pod -o wide test-pod

image.png

检查测试文件

test-pod.yaml文件内容

kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:1.28
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS &amp;&amp; exit 0 || exit 1" #pod运行后在/mnt目录中创建success文件
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim

检查nfs服务目录中是否有test-pod创建的文件,持久卷在nfs服务中创建的目录名称为:命名空间-pvc名称-pv名称,相关信息通过get pv进行获取;如我们创建的pvc(test-claim)在default空间下,其对应nfs中的目录名称为:default-test-claim-pvc-234376c4-995b-4f97-b449-952c4a90dd5e

ls /www/server/k8s/data/default-test-claim-pvc-234376c4-995b-4f97-b449-952c4a90dd5e

image.png