一、先搞懂核心基础:什么是容器、为啥要编排管理?

很多刚接触的朋友可能会觉得“容器”“编排”这些词很玄,其实说白了,容器就是把一个软件(比如电商网站、聊天工具)打包成一个独立的“集装箱”——这个集装箱里装着软件本身、它运行需要的所有环境(比如依赖的插件、配置文件),不管放到哪台电脑上,只要能打开集装箱,软件就能直接跑,不会出现“在我电脑上好好的,换个地方就崩了”的问题。

那为啥要“编排管理”呢?比如你做的电商网站,平时需要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打下基础。