Docker容器的集群部署:baseimage-docker与K3s轻量级集群
在现代应用部署中,Docker容器技术已成为主流,但单节点容器管理面临三大痛点:进程管理混乱导致僵尸进程堆积、服务编排复杂难以实现高可用、资源利用率低增加运维成本。本文将通过实战案例,展示如何结合baseimage-docker的容器优化能力与K3s的轻量级集群管理,构建稳定高效的容器集群方案。
技术选型:为什么是baseimage-docker+K3s?
baseimage-docker作为Docker友好的Ubuntu基础镜像,解决了原生Ubuntu镜像在容器环境中的诸多问题。其核心优势包括:
- 优化的init系统:通过
/sbin/my_init解决PID 1僵尸进程回收问题,确保容器优雅停止 - 轻量级服务管理:集成runit进程管理工具,实现服务自动重启和日志收集
- 安全加固:默认禁用密码登录,仅支持SSH密钥认证,符合最小权限原则
K3s作为轻量级Kubernetes发行版,具有以下特点:
- 资源占用低:仅需512MB内存即可运行,适合边缘计算和开发环境
- 部署简单:单节点安装仅需一条命令,30秒内完成集群初始化
- 功能完备:包含Kubernetes核心组件,支持自动证书轮换和内置服务发现
两者结合可形成"优化容器+高效编排"的黄金组合,特别适合中小规模应用的集群部署需求。
环境准备与集群搭建
硬件要求
| 节点类型 | CPU | 内存 | 存储 | 操作系统 |
|---|---|---|---|---|
| 控制节点 | 2核 | 2GB | 20GB | Ubuntu 24.04 |
| 工作节点 | 4核 | 4GB | 40GB | Ubuntu 24.04 |
软件依赖
# 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/ba/baseimage-docker
cd baseimage-docker
K3s集群初始化
# 在控制节点安装K3s
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
# 获取集群令牌
sudo cat /var/lib/rancher/k3s/server/node-token
# 在工作节点加入集群(替换TOKEN和SERVER_IP)
curl -sfL https://get.k3s.io | sh -s - agent --server https://SERVER_IP:6443 --token TOKEN
验证集群状态:
kubectl get nodes
# 输出应显示所有节点处于Ready状态
baseimage-docker容器构建最佳实践
自定义应用镜像
以Nginx服务为例,创建基于baseimage-docker的应用镜像。项目结构如下:
my-nginx/
├── Dockerfile
├── nginx.service
└── index.html
Dockerfile内容:
FROM phusion/baseimage:latest
# 使用baseimage-docker的init系统
CMD ["/sbin/my_init"]
# 安装Nginx
RUN apt-get update && apt-get install -y nginx
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# 添加Nginx服务配置
RUN mkdir /etc/service/nginx
COPY nginx.service /etc/service/nginx/run
RUN chmod +x /etc/service/nginx/run
# 添加静态文件
COPY index.html /usr/share/nginx/html/
nginx.service内容:
#!/bin/sh
exec /usr/sbin/nginx -g "daemon off;" >>/var/log/nginx.log 2>&1
构建并推送镜像:
docker build -t my-nginx:v1 .
docker tag my-nginx:v1 localhost:5000/my-nginx:v1
docker push localhost:5000/my-nginx:v1
多服务容器编排
baseimage-docker支持在单个容器中运行多个服务,通过runit进行进程管理。例如同时运行Nginx和Redis:
# 添加Redis服务
RUN apt-get update && apt-get install -y redis-server
RUN mkdir /etc/service/redis
COPY redis.service /etc/service/redis/run
RUN chmod +x /etc/service/redis/run
redis.service内容:
#!/bin/sh
exec /sbin/setuser redis redis-server >>/var/log/redis.log 2>&1
这种方式适合紧密耦合的服务组合,但建议遵循"一个容器一个服务"的原则,除非有特殊需求。
K3s集群部署与服务暴露
编写Kubernetes部署文件
创建nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: localhost:5000/my-nginx:v1
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
应用部署:
kubectl apply -f nginx-deployment.yaml
服务暴露与负载均衡
创建nginx-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
K3s内置Traefik ingress控制器,可通过Ingress资源实现HTTP路由:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
监控与日志管理
容器健康检查
在Kubernetes部署中添加健康检查:
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
日志收集配置
baseimage-docker默认将日志输出到stdout,可通过K3s的日志收集功能集中管理:
# 查看容器日志
kubectl logs -f <pod-name>
# 查看服务日志
kubectl logs -f deployment/nginx-deployment
对于生产环境,建议部署EFK(Elasticsearch, Fluentd, Kibana)堆栈或使用Loki+Grafana组合进行日志管理。
高可用配置与自动扩缩容
多节点部署
K3s支持多服务器高可用配置,通过嵌入式etcd实现数据持久化:
# 主节点1
curl -sfL https://get.k3s.io | sh -s - server --cluster-init --token=SECRET
# 主节点2
curl -sfL https://get.k3s.io | sh -s - server --server https://SERVER_IP:6443 --token=SECRET
# 工作节点
curl -sfL https://get.k3s.io | sh -s - agent --server https://SERVER_IP:6443 --token=SECRET
自动扩缩容配置
创建HPA(Horizontal Pod Autoscaler)资源:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
应用后,K3s将根据CPU和内存使用率自动调整Pod数量。
总结与最佳实践
通过baseimage-docker与K3s的结合,我们构建了一个高效、可靠的容器集群环境。以下是关键最佳实践总结:
- 容器优化:始终使用
/sbin/my_init作为容器入口点,确保正确的进程管理 - 镜像构建:利用
install_clean工具减少镜像体积,定期更新基础镜像 - 集群管理:生产环境采用多主节点配置,确保控制平面高可用
- 资源规划:为每个Pod设置资源请求和限制,避免节点资源争用
- 安全加固:使用非root用户运行应用,通过NetworkPolicy限制Pod间通信
未来可以进一步探索:
- 基于GitOps的部署流程(ArgoCD/Flux)
- 服务网格实现(Istio/Linkerd)
- 容器存储接口(CSI)集成
通过这种轻量级集群方案,中小企业和开发团队可以以较低成本实现容器化应用的规模化部署和管理,为业务增长提供可靠的技术支撑。
项目完整代码和配置示例可参考:
- 官方文档:README.md
- 服务配置示例:image/services/
- 工具脚本:tools/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



