logo

轻量云上K8s:低成本构建高可用容器集群指南

作者:快去debug2025.09.23 14:23浏览量:0

简介:本文详细介绍如何在轻量应用服务器上搭建Kubernetes集群,涵盖环境准备、集群部署、优化配置及运维实践,助力开发者低成本实现容器化部署。

一、轻量应用服务器与K8s的适配性分析

1.1 轻量服务器的核心优势

轻量应用服务器(如阿里云ECS轻量版、腾讯云轻量服务器)以低成本、快速部署和预装环境为特点,单节点配置通常为1-4核CPU、2-8GB内存,适合中小规模应用。其优势在于:

  • 成本效益:按小时计费,价格仅为标准云服务器的1/3-1/2;
  • 管理便捷:集成Web控制台,支持一键安装常见应用(如Nginx、MySQL);
  • 弹性扩展:支持垂直扩容(升级配置)和横向扩展(增加节点)。

1.2 K8s在轻量环境中的挑战

K8s原生设计面向大规模集群,在轻量服务器上部署需解决以下问题:

  • 资源限制:单节点内存不足可能导致etcd或kubelet崩溃;
  • 网络复杂度:Flannel/Calico等CNI插件可能消耗额外资源;
  • 存储瓶颈:默认的local volume无法支持动态扩容。

解决方案:采用轻量化K8s发行版(如k3s、MicroK8s),并优化组件配置。

二、轻量服务器K8s部署前准备

2.1 服务器选型建议

配置项 推荐值 说明
CPU核心数 ≥2核(主控节点) 避免kube-scheduler卡顿
内存 ≥4GB(单节点) etcd稳定运行最低要求
磁盘类型 SSD(≥40GB) 加速容器镜像拉取
操作系统 Ubuntu 22.04 LTS/CentOS 8 兼容主流K8s发行版

2.2 系统优化步骤

  1. 内核参数调整
    ```bash

    修改/etc/sysctl.conf

    net.ipv4.ip_forward=1
    net.bridge.bridge-nf-call-iptables=1
    vm.swappiness=0

应用配置

sudo sysctl -p

  1. 2. **禁用交换分区**:
  2. ```bash
  3. sudo swapoff -a
  4. # 永久禁用需注释/etc/fstab中的swap行
  1. 安装依赖工具
    1. sudo apt update && sudo apt install -y \
    2. conntrack iptables ebtables socat \
    3. docker.io containerd

三、轻量级K8s集群部署方案

3.1 使用k3s快速部署

k3s是CNCF认证的轻量K8s发行版,内存占用减少50%以上。

3.1.1 单节点部署(开发测试)

  1. curl -sfL https://get.k3s.io | sh -s - --docker
  2. # 验证安装
  3. sudo k3s kubectl get nodes

3.1.2 多节点集群部署

  1. 主节点初始化
    1. curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - \
    2. --docker \
    3. --node-name=master \
    4. --write-kubeconfig-mode=644
  2. 工作节点加入
    ```bash

    在主节点执行获取token

    sudo cat /var/lib/rancher/k3s/server/node-token

在工作节点执行(替换MASTER_IP和TOKEN)

curl -sfL https://get.k3s.io | K3S_URL=https://MASTER_IP:6443 \
K3S_TOKEN=TOKEN sh -s - —docker

  1. ## 3.2 使用MicroK8s(Ubuntu专属)
  2. ```bash
  3. sudo snap install microk8s --classic
  4. sudo usermod -aG microk8s $USER
  5. newgrp microk8s # 刷新组权限
  6. # 启用必要插件
  7. microk8s enable dns storage registry

四、轻量集群优化实践

4.1 资源限制配置

创建/var/lib/rancher/k3s/server/manifests/resource-limits.yaml

  1. apiVersion: v1
  2. kind: LimitRange
  3. metadata:
  4. name: resource-limits
  5. spec:
  6. limits:
  7. - default:
  8. cpu: "500m"
  9. memory: "512Mi"
  10. defaultRequest:
  11. cpu: "100m"
  12. memory: "256Mi"
  13. type: Container

4.2 存储方案优化

4.2.1 使用HostPath存储(单节点)

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: local-pv
  5. spec:
  6. capacity:
  7. storage: 10Gi
  8. accessModes:
  9. - ReadWriteOnce
  10. hostPath:
  11. path: /data/k8s-volumes

4.2.2 多节点场景:Longhorn存储

  1. # 在k3s集群部署Longhorn
  2. kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

4.3 网络优化

4.3.1 替换默认CNI(Flannel→Calico)

  1. # 卸载原有CNI
  2. /var/lib/rancher/k3s/server/datadir/server/manifests/cni-flannel.yaml
  3. # 部署Calico
  4. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

4.3.2 端口映射优化

  1. # 修改k3s启动参数(/etc/systemd/system/k3s.service)
  2. ExecStart=/usr/local/bin/k3s server \
  3. --advertise-address=PRIVATE_IP \
  4. --node-external-ip=PUBLIC_IP \
  5. --tls-san=PUBLIC_IP

五、运维监控体系构建

5.1 基础监控方案

  1. # 部署Prometheus Operator
  2. kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
  3. # 配置Node Exporter
  4. microk8s enable prometheus # MicroK8s内置方案

5.2 日志收集方案

5.2.1 使用Loki+Grafana

  1. # loki-config.yaml示例
  2. auth_enabled: false
  3. server:
  4. http_listen_port: 3100
  5. storage_config:
  6. aws:
  7. s3: s3://access-key:secret-key@region/bucket
  8. s3forcepathstyle: true

5.2.2 日志转发配置

  1. # 在节点部署fluent-bit
  2. kubectl create namespace logging
  3. helm repo add fluent https://fluent.github.io/helm-charts
  4. helm install fluent-bit fluent/fluent-bit -n logging

5.3 自动伸缩策略

  1. # hpa-example.yaml
  2. apiVersion: autoscaling/v2
  3. kind: HorizontalPodAutoscaler
  4. metadata:
  5. name: nginx-hpa
  6. spec:
  7. scaleTargetRef:
  8. apiVersion: apps/v1
  9. kind: Deployment
  10. name: nginx
  11. minReplicas: 1
  12. maxReplicas: 5
  13. metrics:
  14. - type: Resource
  15. resource:
  16. name: cpu
  17. target:
  18. type: Utilization
  19. averageUtilization: 70

六、常见问题解决方案

6.1 节点NotReady状态

现象kubectl get nodes显示NotReady
排查步骤

  1. 检查kubelet日志:
    1. journalctl -u k3s -n 100 --no-pager
  2. 验证网络连通性:
    1. ping <api-server-ip>
    2. curl -k https://<api-server-ip>:6443/healthz

6.2 Pod长时间Pending

常见原因

  • 资源不足(检查kubectl describe pod <pod-name>
  • 持久卷绑定失败
  • 调度器限制

解决方案

  1. # 查看未绑定PV的PVC
  2. kubectl get pvc --no-headers | awk '{print $1}' | xargs -I {} kubectl describe pvc {}
  3. # 临时增加节点资源
  4. kubectl taint nodes <node-name> node-role.kubernetes.io/master-

6.3 镜像拉取失败

处理流程

  1. 检查镜像仓库认证:
    1. kubectl get secret regcred -o yaml
  2. 手动测试拉取:
    1. docker login registry.example.com
    2. docker pull registry.example.com/namespace/image:tag

七、进阶优化建议

  1. 节点亲和性配置

    1. affinity:
    2. nodeAffinity:
    3. requiredDuringSchedulingIgnoredDuringExecution:
    4. nodeSelectorTerms:
    5. - matchExpressions:
    6. - key: kubernetes.io/arch
    7. operator: In
    8. values: ["amd64"]
  2. Pod中断预算(PDB)

    1. apiVersion: policy/v1
    2. kind: PodDisruptionBudget
    3. metadata:
    4. name: zk-pdb
    5. spec:
    6. minAvailable: 2
    7. selector:
    8. matchLabels:
    9. app: zookeeper
  3. 使用eBPF优化网络

    1. # 安装Cilium(需Linux 4.18+内核)
    2. kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.12/install/kubernetes/quick-install.yaml

通过上述方案,开发者可在轻量应用服务器上构建稳定、高效的K8s集群。实际部署时建议先在单节点验证,再逐步扩展至多节点环境,同时结合具体业务场景调整资源配额和监控指标。

相关文章推荐

发表评论