一、先搞懂核心基础:什么是容器、为啥要编排管理?
很多刚接触的朋友可能会觉得“容器”“编排”这些词很玄,其实说白了,容器就是把一个软件(比如电商网站、聊天工具)打包成一个独立的“集装箱”——这个集装箱里装着软件本身、它运行需要的所有环境(比如依赖的插件、配置文件),不管放到哪台电脑上,只要能打开集装箱,软件就能直接跑,不会出现“在我电脑上好好的,换个地方就崩了”的问题。
那为啥要“编排管理”呢?比如你做的电商网站,平时需要10个集装箱(容器)一起跑,大促的时候要加到50个,大促完又得降回10个;要是某个集装箱突然坏了,得立刻补一个新的;还要给每个集装箱分配固定的网络、存储资源……要是靠人工一个个操作,不仅累得要死,还容易出错,编排管理就是帮你自动干这些事的工具。
二、核心工具选型:为啥选K3s?
要在openEuler上做容器编排,首先得选对工具。市面上有很多编排工具,比如K8s(Kubernetes),但K8s配置复杂、对电脑要求高,新手玩不转;我们选的是K3s——它是K8s的轻量版,专门为边缘计算、小型服务器设计,安装快、占资源少,而且完全兼容K8s的所有功能,新手也能快速上手。
这里要注意:K3s虽然轻,但功能一点不弱,我们后面的所有操作都是基于K3s的,先把它装好才能继续。
三、环境准备:在openEuler上安装K3s
要安装K3s,首先得确保你的openEuler系统满足基本要求:至少有2核CPU、2G内存、20G硬盘(如果是用来练手,1核1G也能跑,但速度会慢),而且要能连上网(用来下载安装包)。
安装步骤很简单,直接执行一条命令就行:
# 安装K3s,指定用国内镜像源(避免下载慢),关闭Traefik(后面我们自己配置网络)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--disable=traefik" sh -
这条命令的意思是:从国内的镜像站下载K3s的安装脚本,然后执行安装,安装的时候禁用Traefik(K3s自带的网络工具,我们后面用更简单的Ingress)。
安装完后,要验证一下K3s是不是装好了,执行:
# 查看K3s的节点状态,Ready表示正常
kubectl get node
如果输出的节点状态是Ready,就说明安装成功了。
四、第一个编排案例:部署一个简单的网站
接下来我们做一个完整的案例,部署一个静态网站(比如一个个人博客的首页),然后用编排工具管理它。
4.1 准备网站的容器镜像
首先,我们需要把网站打包成容器镜像。先建一个文件夹,比如叫blog,里面放一个index.html(网站首页)和一个Dockerfile(用来打包镜像的配置文件)。
先写index.html:
<!DOCTYPE html>
<html>
<head>
<title>我的博客</title>
</head>
<body>
<h1>欢迎来到我的博客!</h1>
<p>这是用K3s编排管理的网站</p>
</body>
</html>
再写Dockerfile:
# 用nginx作为基础镜像(nginx是专门用来跑静态网站的工具)
FROM nginx:alpine
# 把我们的index.html复制到nginx的网站目录里
COPY index.html /usr/share/nginx/html/
然后打包镜像,执行:
# 打包镜像,名字叫my-blog,版本号是v1
docker build -t my-blog:v1 .
4.2 编写编排配置文件
容器镜像做好后,我们需要写一个编排配置文件(YAML格式),告诉K3s怎么部署这个网站:要部署几个容器、怎么访问、出问题了怎么处理。
建一个文件叫blog-deployment.yaml,内容如下:
# 定义要部署的容器组(Deployment),用来管理容器的数量、版本等
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-blog-deployment # 容器组的名字
spec:
replicas: 3 # 部署3个容器(大促的时候可以改成10)
selector:
matchLabels:
app: my-blog # 匹配下面的容器标签
template:
metadata:
labels:
app: my-blog # 容器的标签,用来和容器组关联
spec:
containers:
- name: my-blog-container # 容器的名字
image: my-blog:v1 # 用我们刚才打包的镜像
ports:
- containerPort: 80 # 容器的端口(nginx默认是80)
---
# 定义服务(Service),用来把容器的端口暴露出来,让外面能访问
apiVersion: v1
kind: Service
metadata:
name: my-blog-service # 服务的名字
spec:
type: NodePort # 用NodePort类型,把容器的端口映射到服务器的一个端口
selector:
app: my-blog # 匹配刚才的容器标签
ports:
- protocol: TCP
port: 80 # 服务的端口
targetPort: 80 # 容器的端口
nodePort: 30080 # 服务器上的端口(范围是30000-32767,随便选一个没被占的)
这个配置文件分两部分:第一部分是Deployment,用来管理容器的数量、版本,比如我们设了replicas:3,K3s就会自动部署3个一样的容器,要是其中一个坏了,K3s会立刻补一个新的;第二部分是Service,用来把容器的端口暴露出来,比如我们设了nodePort:30080,那我们就能通过服务器的IP加30080端口访问这个网站了。
4.3 部署并验证
配置文件写好后,执行部署命令:
# 应用编排配置文件
kubectl apply -f blog-deployment.yaml
部署完后,验证一下容器是不是正常运行:
# 查看容器的状态,Running表示正常
kubectl get pod
如果所有容器都是Running状态,就说明部署成功了。接下来访问网站:先查服务器的IP(执行ip addr,找内网或外网的IP),然后在浏览器里输入http://服务器IP:30080,就能看到我们的博客首页了。
五、进阶管理:自动扩缩容、滚动更新
刚才的案例只是基础,实际用的时候还要用到更高级的管理功能,比如自动扩缩容、滚动更新。
5.1 自动扩缩容
自动扩缩容的意思是:当网站的访问量变大,CPU使用率超过某个阈值(比如80%),K3s会自动增加容器的数量;访问量变小,CPU使用率低于某个阈值(比如30%),K3s会自动减少容器的数量。
要实现自动扩缩容,我们需要写一个配置文件blog-hpa.yaml:
# 定义自动扩缩容(HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-blog-hpa # 自动扩缩容的名字
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-blog-deployment # 要管理的容器组
minReplicas: 3 # 最少保留3个容器
maxReplicas: 10 # 最多扩展到10个容器
metrics:
- type: Resource
resource:
name: cpu # 监控CPU使用率
target:
type: Utilization
averageUtilization: 80 # 当平均CPU使用率超过80%,就扩容
然后应用这个配置:
kubectl apply -f blog-hpa.yaml
验证自动扩缩容:我们可以用压测工具(比如ab)模拟大量访问,看K3s会不会自动增加容器数量。执行压测命令:
# 模拟100个并发请求,总共1000次请求
ab -n 1000 -c 100 http://服务器IP:30080/
压测的时候,执行kubectl get hpa,就能看到容器的数量从3开始增加,压测完后,又会慢慢降回3。
5.2 滚动更新
滚动更新的意思是:当我们要更新网站的版本(比如改了首页内容),K3s会先启动一个新的容器,等新容器正常运行后,再停掉一个旧的容器,直到所有旧容器都被替换成新的,整个过程不会中断网站的服务。
比如我们要更新网站的首页,先修改index.html,把欢迎语改成“欢迎来到我的博客!(更新版)”,然后重新打包镜像:
docker build -t my-blog:v2 .
然后修改blog-deployment.yaml,把image改成my-blog:v2,再执行:
kubectl apply -f blog-deployment.yaml
K3s就会自动开始滚动更新,我们可以执行kubectl rollout status deployment/my-blog-deployment查看更新状态,更新完后,访问网站就能看到更新后的内容了。
六、应用场景、优缺点、注意事项
6.1 应用场景
这种编排管理方式适合很多场景:
- 电商大促:自动扩容应对高访问量,大促后自动缩容节省资源;
- 企业内部系统:比如OA、CRM,保证系统稳定,出问题自动恢复;
- 边缘计算:比如智能摄像头、智能工厂的设备,K3s轻量,适合部署在边缘设备上;
- 开发测试:快速部署测试环境,测试完一键删除,节省时间。
6.2 技术优缺点
优点:
- 轻量:K3s占资源少,安装快,适合新手和小型场景;
- 兼容:完全兼容K8s,学会K3s就能无缝切换到K8s;
- 自动管理:自动扩缩容、滚动更新、故障恢复,减少人工操作;
- 灵活:可以根据自己的需求定制编排配置。
缺点:
- 功能简化:K3s是K8s的轻量版,去掉了一些高级功能(比如部分存储驱动),不适合超大型集群;
- 学习成本:虽然比K8s简单,但还是需要理解一些基础概念(比如Deployment、Service);
- 依赖网络:如果服务器网络不好,镜像下载会很慢,甚至失败。
6.3 注意事项
- 镜像命名:打包镜像的时候,名字要和编排配置里的一致,不然K3s找不到镜像;
- 端口冲突:NodePort的端口要选30000-32767之间的,而且不能和服务器上已经在用的端口冲突;
- 资源限制:要给容器设置CPU、内存的限制,避免某个容器占满服务器的资源,影响其他容器;
- 备份配置:编排配置文件要备份,万一服务器坏了,可以快速恢复;
- 安全:要给K3s设置访问密码,避免被恶意访问,容器镜像要从可信的源下载,避免带病毒。
七、文章总结
在openEuler上实现高效的容器编排与管理,核心是选对工具(K3s)、掌握基础概念(容器、编排)、学会编写编排配置文件。从基础的部署网站,到进阶的自动扩缩容、滚动更新,只要一步步操作,就能轻松实现。
这种方式不仅能提高工作效率,还能保证系统的稳定性,适合从个人项目到中小型企业的各种场景。新手只要跟着案例操作,多练几次,就能熟练掌握,为以后学习更复杂的K8s打下基础。
评论
围绕“如何在openEuler上实现高效的容器编排与管理?”参与讨论