logo

轻量云服务器公网部署K8s:低成本实现容器化集群

作者:公子世无双2025.09.23 14:23浏览量:0

简介:本文详细阐述如何在轻量应用服务器公网环境下搭建Kubernetes集群,涵盖环境准备、网络配置、安全加固及生产级优化方案,适合中小团队低成本实践容器化部署。

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

轻量应用服务器(如AWS Lightsail、阿里云轻量服务器、腾讯云轻量应用服务器)以低配资源(1-4核CPU、1-8GB内存)和包年包月定价模式,成为中小规模K8s实验的理想选择。相比传统云服务器,轻量服务器成本降低60%-70%,但需解决资源限制带来的挑战。

典型场景适配

  • 开发测试环境:快速搭建隔离的K8s沙箱
  • 个人项目部署:运行博客、API服务等轻量级应用
  • 边缘计算节点:作为主集群的补充计算资源

核心限制

  • 单节点资源有限(建议单节点不超过2个Pod)
  • 磁盘I/O性能较弱(需优化etcd存储
  • 公网带宽通常为1-5Mbps(需限制集群间通信流量)

二、公网环境搭建前的关键准备

1. 网络拓扑设计

采用”控制平面内网+工作节点公网”的混合架构:

  1. graph TD
  2. A[Master节点] -->|内网IP| B[Etcd集群]
  3. A -->|公网IP| C[Worker节点1]
  4. A -->|公网IP| D[Worker节点2]
  5. E[负载均衡器] -->|443| A
  • Master节点配置双网卡:内网用于集群通信,公网用于API访问
  • Worker节点仅需公网IP,通过--node-ip参数指定内网通信地址(如有)

2. 安全组配置

必须开放的端口:

  • TCP 6443 (Kubernetes API Server)
  • TCP 2379-2380 (etcd client/server)
  • TCP 10250 (Kubelet API)
  • TCP 10255 (ReadOnly Kubelet API)
  • UDP 8472 (Flannel VXLAN)

建议限制源IP范围,仅允许管理终端和跳板机访问控制平面。

3. 镜像选择策略

优先使用精简版操作系统:

  • Ubuntu Server 22.04 LTS (最小安装)
  • Alpine Linux 3.18+
  • CoreOS Container Linux(已停止更新,不推荐新项目)

容器镜像需满足:

  • 单容器内存不超过节点总内存的50%
  • 镜像层数控制在10层以内
  • 使用多阶段构建减少最终镜像大小

三、分步搭建流程(以Ubuntu为例)

1. 基础环境初始化

  1. # 更新系统并安装依赖
  2. sudo apt update && sudo apt install -y \
  3. apt-transport-https \
  4. ca-certificates \
  5. curl \
  6. gnupg \
  7. socat \
  8. conntrack \
  9. ebtables \
  10. ipset
  11. # 禁用交换分区(K8s要求)
  12. sudo swapoff -a
  13. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

2. 安装容器运行时

推荐使用containerd(资源占用比Docker少30%):

  1. # 安装containerd
  2. cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
  3. overlay
  4. br_netfilter
  5. EOF
  6. sudo modprobe overlay
  7. sudo modprobe br_netfilter
  8. # 配置内核参数
  9. cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
  10. net.bridge.bridge-nf-call-iptables = 1
  11. net.ipv4.ip_forward = 1
  12. net.bridge.bridge-nf-call-ip6tables = 1
  13. EOF
  14. sudo sysctl --system
  15. # 安装containerd
  16. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  17. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/containerd.list
  18. sudo apt update
  19. sudo apt install -y containerd.io
  20. # 配置containerd
  21. sudo mkdir -p /etc/containerd
  22. containerd config default | sudo tee /etc/containerd/config.toml
  23. sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/' /etc/containerd/config.toml
  24. sudo systemctl restart containerd

3. 安装Kubernetes组件

  1. # 添加K8s仓库
  2. curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  3. echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  4. # 安装kubeadm/kubelet/kubectl
  5. sudo apt update
  6. sudo apt install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
  7. sudo apt-mark hold kubelet kubeadm kubectl
  8. # 初始化控制平面(单节点测试)
  9. sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap
  10. # 配置kubectl
  11. mkdir -p $HOME/.kube
  12. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  13. sudo chown $(id -u):$(id -g) $HOME/.kube/config

4. 网络插件部署(Calico示例)

  1. kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
  2. # 修改Calico的MTU设置(适应轻量服务器带宽)
  3. kubectl set env daemonset/calico-node -n kube-system FELIX_IPINIPMTU=1400

四、生产环境优化方案

1. 资源限制配置

  1. # 创建LimitRange防止资源滥用
  2. apiVersion: v1
  3. kind: LimitRange
  4. metadata:
  5. name: mem-cpu-limit
  6. namespace: default
  7. spec:
  8. limits:
  9. - default:
  10. cpu: 500m
  11. memory: 512Mi
  12. defaultRequest:
  13. cpu: 100m
  14. memory: 128Mi
  15. type: Container

2. 高可用改造

  • 使用kubeadm join添加多个控制平面节点
  • 配置etcd集群外置(需额外轻量服务器)
  • 部署Haproxy+Keepalived实现API Server负载均衡

3. 监控体系搭建

  1. # 部署Prometheus Operator
  2. kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/bundle.yaml
  3. # 配置Node Exporter和kube-state-metrics
  4. kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
  5. kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/user-guides/getting-started/prometheus-example.yaml

五、常见问题解决方案

  1. Pod启动失败:检查kubectl describe pod <pod-name>中的Events,常见原因包括:

    • 镜像拉取失败(检查网络和镜像仓库权限)
    • 资源不足(使用kubectl top nodes查看)
    • CNI插件故障(检查calico-node日志
  2. API Server不可用

    • 检查安全组是否放行6443端口
    • 验证/etc/kubernetes/manifests/kube-apiserver.yaml配置
    • 查看journalctl -u kubelet日志
  3. 节点状态NotReady

    • 确认kubelet服务运行正常
    • 检查/var/lib/kubelet/kubeadm-flags.env配置
    • 验证网络插件Pod状态

六、成本优化建议

  1. 使用Spot实例(部分云厂商支持轻量服务器的竞价模式)
  2. 采用Pod垂直自动扩缩(VPA)替代水平扩缩(HPA)
  3. 配置镜像缓存(如使用Nexus或Harbor私有仓库)
  4. 实施Pod反亲和性策略避免资源争抢
  5. 定期清理未使用的PV和镜像

通过以上方案,开发者可在轻量应用服务器上构建满足生产基本需求的K8s集群,实现容器化应用的快速迭代和资源高效利用。实际部署时建议先在单节点环境验证,再逐步扩展到多节点架构。

相关文章推荐

发表评论