Docker容器的集群部署:baseimage-docker与K3s轻量级集群

Docker容器的集群部署:baseimage-docker与K3s轻量级集群

【免费下载链接】baseimage-docker A minimal Ubuntu base image modified for Docker-friendliness 【免费下载链接】baseimage-docker 项目地址: https://gitcode.com/gh_mirrors/ba/baseimage-docker

在现代应用部署中,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核2GB20GBUbuntu 24.04
工作节点4核4GB40GBUbuntu 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的结合,我们构建了一个高效、可靠的容器集群环境。以下是关键最佳实践总结:

  1. 容器优化:始终使用/sbin/my_init作为容器入口点,确保正确的进程管理
  2. 镜像构建:利用install_clean工具减少镜像体积,定期更新基础镜像
  3. 集群管理:生产环境采用多主节点配置,确保控制平面高可用
  4. 资源规划:为每个Pod设置资源请求和限制,避免节点资源争用
  5. 安全加固:使用非root用户运行应用,通过NetworkPolicy限制Pod间通信

未来可以进一步探索:

  • 基于GitOps的部署流程(ArgoCD/Flux)
  • 服务网格实现(Istio/Linkerd)
  • 容器存储接口(CSI)集成

通过这种轻量级集群方案,中小企业和开发团队可以以较低成本实现容器化应用的规模化部署和管理,为业务增长提供可靠的技术支撑。

项目完整代码和配置示例可参考:

【免费下载链接】baseimage-docker A minimal Ubuntu base image modified for Docker-friendliness 【免费下载链接】baseimage-docker 项目地址: https://gitcode.com/gh_mirrors/ba/baseimage-docker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值