探索 openEuler 2403:基于 Containerd 的 K8s 集群部署全流程
前言
在 Kubernetes(K8s)的发展历程中,容器运行时从早期的 Docker 逐步向更轻量、更标准的 Containerd 演进。随着 K8s 1.24 版本正式移除对 Docker 的支持,Containerd 已成为生产环境中主流的容器运行时选择。相比 Docker,Containerd 更轻量、更专注于容器生命周期管理,且完全兼容 K8s 的 CRI(容器运行时接口)标准。
本文将在 openEuler 24.03 LTS-SP1 操作系统上,从零开始完整实践基于 Containerd 的 K8s 集群部署流程。openEuler 作为国内广泛使用的开源操作系统,其与 K8s 的结合具有重要的实践意义。本文将涵盖环境准备、组件安装、集群初始化、网络插件配置等全流程,帮助你快速掌握在 openEuler 环境下 K8s 生产环境的部署与调试方法。
一、环境规划
1.1 主机规划
本次部署采用 3 节点集群架构,具体规划如下:
| 主机名 | IP 地址 | 集群角色 |
|---|---|---|
| k8s-master | 192.168.38.145 | Master 控制节点 |
| k8s-node1 | 192.168.38.153 | Worker 工作节点 |
| k8s-node2 | 192.168.38.154 | Worker 工作节点 |
所有节点均使用 openEuler 24.03 LTS-SP1 操作系统。进行下面操作之前,先更新 openEuler 的安装源,推荐使用华为云仓库。
1.2 配置 openEuler YUM 源(华为云镜像)
修改 /etc/yum.repos.d/openEuler.repo 文件,内容如下:
[OS]
name=OS
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/OS/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/OS&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/OS/$basearch/RPM-GPG-KEY-openEuler
[everything]
name=everything
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/everything/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/everything&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/everything/$basearch/RPM-GPG-KEY-openEuler
[EPOL]
name=EPOL
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/EPOL/main/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/EPOL/main&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/OS/$basearch/RPM-GPG-KEY-openEuler
[debuginfo]
name=debuginfo
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/debuginfo/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/debuginfo&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/debuginfo/$basearch/RPM-GPG-KEY-openEuler
[source]
name=source
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/source/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever&arch=source
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/source/RPM-GPG-KEY-openEuler
[openEuler-update]
name=openEuler-update
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/update/$basearch/
enabled=1
gpgcheck=0
[update-source]
name=update-source
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/update/source/
enabled=1
gpgcheck=0
二、主机基础配置
下面操作需要在每个主机都执行一遍。这里以 k8s-master 主机为例。
2.1 修改主机名并配置 hosts 文件
# 各节点分别执行
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-node1 ~]# hostnamectl set-hostname k8s-node1
[root@k8s-node2 ~]# hostnamectl set-hostname k8s-node2
将 IP 与主机名写入到 /etc/hosts 文件:
[root@k8s-master ~]# cat >> /etc/hosts << EOF
127.0.0.1 localhost
172.16.213.180 k8s-master
172.16.213.181 k8s-node1
172.16.213.182 k8s-node2
EOF
2.2 开启流量转发
启用桥接网络上的 IPv6 和 IPv4 流量,通过 iptables 进行过滤,并启动 IP 转发:
[root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf
让 br_netfilter 模块开机自动加载,创建 /etc/modules-load.d/br_netfilter.conf 文件:
br_netfilter
将 /etc/sysctl.d/k8s.conf 配置为开机自动执行,在 /etc/rc.local 中添加:
sysctl -p /etc/sysctl.d/k8s.conf
修改 /etc/rc.local 权限为可执行:
[root@k8s-master ~]# chmod 755 /etc/rc.local
配置完成后重启服务器,模块会自动加载,k8s.conf 中的参数也会自动运行。
注意:在 openEuler 系统中,由于
/etc/sysctl.conf中也定义了net.ipv4.ip_forward参数,需要找到并删除net.ipv4.ip_forward=0这一行,上面的配置才能生效。
2.3 关闭防火墙以及 SELinux
[root@k8s-master ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
[root@k8s-master ~]# systemctl disable --now firewalld
2.4 关闭 swap
# 临时关闭
[root@k8s-master ~]# swapoff -a
# 注释掉 /etc/fstab 中的 swap 行
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
此步骤很关键,swap 打开会导致 k8s 无法正常运行。在 openEuler 下,上述步骤仅是临时关闭 swap,要永久关闭还需要执行以下操作:
首先确认 systemctl 系统服务中 swap 分区名:
[root@k8s-master ~]# systemctl list-unit-files | grep swap
# 示例输出:
# dev-disk-by\x2ddiskseq-2\x2dpart5.swap generated
# swap.target static
使用 systemctl mask 参数关闭对应 swap 分区服务:
[root@k8s-master ~]# systemctl mask 'dev-disk-by\x2ddiskseq-2\x2dpart5.swap'
再次确认:
[root@openeuler2403 ~]# systemctl list-unit-files | grep swap
dev-disk-by\x2ddiskseq-2\x2dpart5.swap masked disabled
swap.target static -
三、软件包安装
下面操作需要在每个主机都执行一遍。这里以 k8s-master 主机为例。
3.1 安装必要软件包
[root@k8s-master ~]# yum install -y containerd
[root@k8s-master ~]# yum install -y kubernetes*
[root@k8s-master ~]# yum install -y cri-tools
注意:containerd 要求使用 1.6.22-15 或更高版本。如果系统中已安装 Docker,请确保在安装 containerd 之前卸载 Docker,否则可能引发冲突。
如果下载的版本过低,请手动升级:
[root@k8s-master ~]# wget --no-check-certificate https://repo.openeuler.org/openEuler-24.03-LTS/update/x86_64/Packages/containerd-1.6.22-15.oe2403.x86_64.rpm
[root@k8s-master ~]# rpm -Uvh containerd-1.6.22-15.oe2403.x86_64.rpm
3.2 下载 CNI 组件
[root@k8s-master ~]# mkdir -p /opt/cni/bin
[root@k8s-master ~]# cd /opt/cni/bin
[root@k8s-master ~]# wget --no-check-certificate https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
[root@k8s-master ~]# tar -xzvf cni-plugins-linux-amd64-v1.5.1.tgz
四、配置 containerd
4.1 生成并修改默认配置
[root@k8s-master ~]# containerd_conf="/etc/containerd/config.toml"
[root@k8s-master ~]# mkdir -p /etc/containerd
[root@k8s-master ~]# containerd config default > "${containerd_conf}"
下面开始修改 /etc/containerd/config.toml 文件:
1. 配置 pause 镜像
找到 sandbox_image 配置项,将:
sandbox_image = "registry.k8s.io/pause:3.9"
修改为:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
2. 配置 cgroup 驱动为 systemd
[root@k8s-master ~]# sed -i "/SystemdCgroup/s/=.*/= true/" "${containerd_conf}"
3. 关闭 registry.k8s.io 镜像源证书验证
[root@k8s-master ~]# sed -i '/plugins."io.containerd.grpc.v1.cri".registry.configs/a\[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.k8s.io".tls]\n insecure_skip_verify = true' /etc/containerd/config.toml
4. 配置 containerd 镜像加速器
找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 配置段,添加 docker.io 镜像加速:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://proxy.1panel.live","https://docker.1ms.run"]
配置完成后,重启 containerd 服务:
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl enable containerd
[root@k8s-master ~]# systemctl restart containerd
五、配置 crictl 使用 containerd
[root@k8s-master ~]# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
[root@k8s-master ~]# crictl config image-endpoint unix:///run/containerd/containerd.sock
上述命令会生成配置文件 /etc/crictl.yaml。
六、配置 kubelet
[root@k8s-master ~]# systemctl enable kubelet.service
[root@k8s-master ~]# echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' >> /etc/sysconfig/kubelet
七、使用 Kubeadm 创建集群
7.1 生成集群配置文件
在 master 节点执行:
[root@k8s-master ~]# kubeadm config print init-defaults --component-configs KubeletConfiguration >> kubeletConfig.yaml
编辑 kubeletConfig.yaml,需要配置以下关键参数:
-
advertiseAddress:master 节点的 IP 地址(172.16.213.180) -
name:master 节点的主机名(k8s-master) -
imageRepository:修改为阿里云镜像地址registry.aliyuncs.com/google_containers -
kubernetesVersion:指定安装的 K8s 版本 -
serviceSubnet:Service 网络地址段,可保持默认 -
podSubnet:Pod 网络地址段,可保持默认
7.2 初始化集群
在 master 节点执行:
[root@k8s-master ~]# kubeadm init --config kubeletConfig.yaml
初始化成功后,配置 kubectl:
[root@k8s-master ~]# mkdir -p "$HOME"/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
[root@k8s-master ~]# chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
7.3 将 Worker 节点加入集群
在 k8s-node1 和 k8s-node2 节点执行 kubeadm join 命令:
[root@k8s-node1 ~]# kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
注意:如果初始化时未保存 token,可在 master 节点重新生成:
[root@k8s-master ~]# kubeadm token create --print-join-command
7.4 查看节点状态
在 master 节点查看:
[root@k8s-master ~]# kubectl get nodes

此时节点状态为 NotReady,因为尚未安装网络插件。
八、部署 Calico 网络插件
8.1 下载 Calico 配置文件
[root@k8s-master ~]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
8.2 修改 Calico 镜像地址(解决国内拉取问题)
# 将 Calico 官方镜像地址替换为可用的国内镜像源
sed -i 's#docker.io/calico#docker.m.daocloud.io/calico#g' calico.yaml
8.3 部署 Calico
[root@k8s-master ~]# kubectl apply -f calico.yaml
等待几分钟,Calico 相关 Pod 启动完成后,再次查看节点状态:

九、Containerd 调试工具:crictl 与 ctr
9.1 工具介绍
-
ctr:containerd 原生 CLI 工具,用于直接管理容器、镜像、命名空间等资源。
-
crictl:K8s 社区定义的 CRI 兼容 CLI 工具,专为调试 K8s 容器运行时设计。
关键区别:containerd 支持命名空间隔离,crictl 默认使用 k8s.io 命名空间,而 ctr 默认使用 default 命名空间,因此 ctr 下载的镜像默认对 crictl 不可见。
9.2 常用命令对比
| 功能 | Docker 命令 | crictl 命令 | ctr 命令(需指定命名空间) |
|---|---|---|---|
| 显示本地镜像列表 | docker images | crictl images | ctr -n k8s.io images list |
| 下载镜像 | docker pull | crictl pull | ctr -n k8s.io images pull |
| 删除本地镜像 | docker rmi | crictl rmi | ctr -n k8s.io images rm |
| 显示容器列表 | docker ps | crictl ps | ctr -n k8s.io containers list |
| 查看容器详情 | docker inspect | crictl inspect | ctr -n k8s.io containers info |
| exec 执行命令 | docker exec | crictl exec | ctr -n k8s.io tasks exec |
| 查看日志 | docker logs | crictl logs | 无 |
9.3 镜像导入导出示例
crictl 不支持镜像导入导出,需使用 ctr 工具:
# 标记镜像
ctr -n k8s.io i tag k8s.gcr.io/pause:3.9 registry.aliyuncs.com/google_containers/pause:3.9
# 导出镜像
ctr -n k8s.io i export pause.tar registry.aliyuncs.com/google_containers/pause:3.9
# 导入镜像
ctr -n k8s.io i import pause.tar
十、验证集群可用性
部署一个测试应用,验证集群是否能够正常运行 Pod 并提供服务。
10.1 创建 Deployment 和 Service
使用国内可访问的镜像仓库部署 nginx(避免因网络问题拉取失败):
# 创建 nginx Deployment(使用 DaoCloud 镜像代理)
kubectl create deployment nginx --image=docker.m.daocloud.io/library/nginx:1.25-alpine
# 将 Deployment 暴露为 NodePort 类型的 Service
kubectl expose deployment nginx --port=80 --type=NodePort
10.2 查看 Service 信息
kubectl get svc nginx
输出示例:

其中 30917即为外部访问的端口(实际端口由集群自动分配,请以你看到的为准)。
10.3 访问测试
通过任意节点的 IP 地址加上上述 NodePort 进行访问:
# 替换 <NodePort> 为实际的端口号
curl http://192.168.38.145:30917
curl http://192.168.38.153:30917
curl http://192.168.38.154:30917
如果返回 nginx 的欢迎页面(包含 "Welcome to nginx!" 字样),则说明集群正常工作,Pod 网络与 Service 访问均正确。

或者直接访问任意ip,例如http://192.168.38.145:30917

10.4 查看 Pod 状态
kubectl get pods
预期输出类似:

结尾
本文完整演示了在 openEuler 24.03 LTS-SP1 操作系统上基于 containerd 部署 K8s 集群的全流程,从环境准备、组件安装到集群初始化、网络插件配置,覆盖了生产环境部署的核心步骤。相比传统的 Docker 方案,containerd 更轻量、更贴合 K8s 的 CRI 标准,是当前及未来 K8s 集群的主流选择。
部署完成后,你可以通过 kubectl 命令管理集群资源,部署测试应用验证集群功能。后续你可以继续深入学习 K8s 的资源对象(如 Deployment、Service、Ingress 等),探索集群的高级特性与运维技巧。
如果在部署过程中遇到镜像拉取失败、节点状态异常等问题,可以通过 crictl 查看容器运行时日志,或通过 kubectl describe 命令排查 Pod 状态,快速定位问题根源。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)