
前面两篇文章,我分别用 openEuler 部署了 WordPress 和 Nextcloud,对这个系统有了不少认识。这次要上 K3s 了,心里其实有点打鼓——Kubernetes 对系统的要求可不低,openEuler 能不能扛得住?
抱着这个疑问,我去翻了下 openEuler 22.03 LTS-SP1 的官方文档,结果发现这个版本在云原生方面的能力,真的超出了我的预期。
这个版本是 openEuler 社区在 2023 年发布的长期支持版本,主打的就是稳定和高效。我挑几个和云原生相关的重点说一下:
这个内核版本不是随便选的。5.10 是 Linux 的长期支持版本,集成了大量针对容器和虚拟化的优化:
我之前用的时候就感觉 Docker 容器起得特别快,现在想想应该就是内核的功劳。
这个是 openEuler 22.03 专门为云原生场景设计的特性。它采用了双根文件系统和原子化更新:
虽然我这次没用 NestOS,但知道 openEuler 有这个东西,心里就踏实多了——说明他们是真的在针对容器场景做优化。
这个特性挺厉害的,可以根据业务的优先级进行智能调度:
对于跑 K8s 这种多容器混合部署的场景,这个特性应该很有用。
支持 x86 和 ARM 架构,我这台 x86 服务器用起来没啥问题。而且官方文档里说,对鲲鹏芯片有专门的优化。
前两篇文章,我用 Docker 和 Docker Compose 部署了两个应用。这两个工具确实好用,但有个问题:都是单机方案。
如果我想:
这些需求,Docker Compose 就搞不定了。得上 Kubernetes。
但标准的 K8s 太重了:
所以我选了 K3s。它是 Rancher 搞的轻量级 K8s:
最关键的是,我想验证一下 openEuler 在容器编排场景下的表现。
还是那台服务器,配置没变:
这台服务器上已经跑着 WordPress 和 Nextcloud 两个 Docker 应用了。K3s 默认用 containerd,和 Docker 不冲突,可以共存。
一开始我按照官方文档,直接执行:
curl -sfL https://get.k3s.io | sh -结果报错了:

错误信息很明确:
Error: cannot install the best candidate for the job
- nothing provides container-selinux >= 3:2.191.0-1 needed by k3s-selinux-1.6-1.el9.noarch问题出在 SELinux 上。K3s 需要 container-selinux >= 3:2.191.0-1,但 openEuler 22.03 LTS-SP1 的软件仓库里只有更老的版本。
这个坑其实挺常见的。不同发行版的软件包版本不一样,直接装容易遇到依赖问题。
对于学习和测试环境,可以跳过 SELinux 支持。修改安装命令:
curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_SELINUX_RPM=true sh -
这次就顺利了:

安装过程很快,大概 1 分钟就完成了。可以看到:
这个过程比装标准 K8s 简单太多了。标准 K8s 要装 kubeadm、kubelet、kubectl,还要配置容器运行时、网络插件,折腾半天。K3s 一条命令全搞定。
先看看服务状态:
sudo systemctl status k3s

服务是 active (running),看起来没问题。可以看到 K3s 是以 systemd 服务的形式运行的,开机会自动启动。
K3s 安装完会自动创建 kubeconfig 文件,但默认路径需要 root 权限。为了方便使用,把它复制到用户目录:
# 创建 .kube 目录
sudo mkdir -p ~/.kube
# 复制配置文件
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
# 修改权限
sudo chown $USER:$USER ~/.kube/config配置好后,用 kubectl 看看集群状态:
kubectl version
kubectl get nodes
输出显示:
节点名称是 ser563963324474(我的服务器主机名),角色是 control-plane,master。这说明这是一个单节点集群,既是控制平面,也是工作节点。
K8s 集群启动后,会在 kube-system 命名空间运行一些系统组件。看看都有啥:
kubectl get pods -A

可以看到这些组件都在运行:
kubectl top 命令的数据这些都是 K3s 内置的。标准 K8s 需要自己装,K3s 直接给你配好了,省了不少事。
再用 kubectl describe node 看看节点的详细信息,可以看到很多 K8s 的标签和注解,内部 IP 是 10.1.226.3,K3s 还配置了 flannel 网络插件(vxlan 模式)。
理论讲完了,来点实际的。部署一个 Nginx 测试一下:
kubectl create deployment nginx-test --image=nginx:alpine

命令执行后,K8s 会:
等几秒钟,Pod 就从 ContainerCreating 变成 Running 了。用 kubectl get deployments 和 kubectl get pods 可以看到:
这个过程比 Docker 慢一点,因为多了一层编排。但好处是,如果这个 Pod 挂了,K8s 会自动重启;如果需要多个副本,改个数字就行。
Pod 创建好了,但外部还访问不了。需要创建一个 Service:
kubectl expose deployment nginx-test --port=80 --type=NodePort

Service 创建成功后,可以看到:
10.43.240.19280:32245/TCP这里的 32245 是 K8s 自动分配的 NodePort(范围是 30000-32767)。只要访问服务器的 <IP>:80 就能访问到 Nginx 了。
在浏览器里访问 http://<服务器IP>:80:
成功了!看到了 Nginx 的欢迎页面。这说明整个链路都通了:
K8s 的网络模型确实复杂,但也很强大。
用 kubectl describe pod 看看 Pod 的详细信息:

可以看到:
Events 部分(虽然截图截不完)会显示 Pod 的启动过程,比如调度到哪个节点、拉取镜像、启动容器等。这对排查问题很有用。
部署完应用,最关心的就是资源占用。看看 K3s 吃了多少内存:
ps aux | grep k3s | head -5
kubectl top pods -A
从截图可以看到:
K3s 主进程:
各 Pod 的资源占用:
加起来,整个 K3s 集群(包括所有系统组件)大概占用 700MB 内存左右。
对比一下标准 K8s,控制平面组件(apiserver、controller-manager、scheduler、etcd)就要吃掉 1.5GB+。K3s 的资源占用确实低很多。
我这台 16GB 内存的服务器,跑 K3s + 几个应用完全没压力。
用了几个小时 K3s,我对 openEuler 在云原生场景的表现有了更深的感受。
从安装到部署应用,整个过程没有任何报错(除了一开始的 SELinux 依赖,那个不算系统的问题)。Pod 启动很快,没有出现过 Pending 或 CrashLoopBackOff 的情况。
K3s 的主进程运行了几个小时,内存占用一直很稳定,没有出现内存泄漏或 CPU 飙高的情况。
5.10 内核在容器场景下的表现确实不错。Pod 的启动速度很快,从 ContainerCreating 到 Running 只需要几秒钟。
我之前在 CentOS 7(3.10 内核)上试过 K8s,Pod 启动明显要慢一些。openEuler 的 5.10 内核,应该是做了不少针对 cgroup 和 namespace 的优化。
系统本身占用的资源很少。我用 free -h 看了下,整个系统(包括 K3s、WordPress、Nextcloud)只用了 4GB 左右内存,还有 12GB 可用。
这说明 openEuler 在资源调度上确实有优势。同样的硬件,能跑更多的容器。
K3s 用的是 containerd 作为容器运行时,和 openEuler 的集成没有任何问题。镜像拉取、容器启动、网络配置,都很流畅。
而且 openEuler 的软件仓库里,Docker、containerd、runc 这些容器相关的包都有,版本也比较新。不用担心兼容性问题。
我之前在 Ubuntu 20.04 上也部署过 K3s,对比一下:
Ubuntu 20.04:
openEuler 22.03 LTS-SP1:
这次从 Docker Compose 跨到 K3s,学到了不少东西。
Deployment、ReplicaSet、Pod 的关系:
这种分层设计,比 Docker Compose 灵活多了。想要扩容?改 Deployment 的 replicas 就行。想要滚动更新?Deployment 自动帮你搞定。
Service 的网络模型:
这套网络模型虽然复杂,但很强大。多个服务之间的通信,通过 Service 名称就能互相访问,不用管 IP 地址。
声明式配置的魅力:
K8s 的核心理念是"声明式"。我告诉 K8s 我想要什么状态,K8s 负责把实际状态调整到期望状态。
比如我声明 Deployment 的 replicas 是 3,K8s 就会确保始终有 3 个 Pod 在运行。有 Pod 挂了?自动重启。节点挂了?自动在其他节点启动。
这种思路和 Docker 的"命令式"完全不同。Docker 是你告诉它做什么,它就做什么。K8s 是你告诉它要什么,它自己想办法。
通过这次实战,我对 openEuler 22.03 LTS-SP1 在云原生场景的能力有了更全面的认识。
内核优化是基础:
5.10 LTS 内核确实很稳。容器启动快、调度准、资源隔离好。
NestOS 是亮点:
虽然这次没用 NestOS,但知道 openEuler 有专门为容器设计的操作系统,说明社区在云原生方向是认真的。以后有机会一定要试试 NestOS + K3s 的组合。
生态在完善:
openEuler 的软件包生态越来越好了。K3s、Docker、containerd 这些容器相关的软件都能顺利安装。社区文档也在不断完善,遇到问题能找到解决方案。
这次从 Docker Compose 跨到 K3s,算是在云原生的路上又进了一步。K3s 的轻量和易用,让我没有什么心理负担就上手了 K8s。
openEuler 22.03 LTS-SP1 在整个过程中的表现,超出了我的预期。内核稳定、资源占用低、容器生态完善,这些优势在 K3s 场景下体现得很明显。
作为一个从 CentOS、Ubuntu 转到 openEuler 的用户,我越来越觉得:openEuler 不仅仅是"能用",而是"好用"。特别是在云原生场景,openEuler 已经是一个很成熟的选择了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。