云服务器K8s集群搭建避坑指南:如何用3台2核机器低成本搭建生产级环境

当预算有限却又需要搭建生产级Kubernetes集群时,如何在资源受限的云服务器上实现稳定运行?本文将分享一套经过实战验证的方案,使用3台2核2G配置的腾讯云/阿里云服务器,构建高可用K8s集群的关键技术与避坑策略。

1. 云平台选型与基础配置优化

选择云平台时,内网互通质量和成本是需要权衡的关键因素。腾讯云CVM和阿里云ECS在相同配置下性能接近,但网络架构存在差异:

对比项腾讯云阿里云
内网带宽1.5Gbps/核1Gbps/核
跨可用区延迟<1ms1-2ms
按量计费价格约0.12元/小时约0.15元/小时

系统调优关键步骤

# 禁用Swap(必须执行)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 优化内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sudo sysctl --system

注意:阿里云部分机型需要额外配置内网网卡MTU,建议设置为1454以避免Flannel网络异常

2. 容器运行时与K8s组件资源控制

在低配机器上,容器运行时的选择直接影响集群稳定性。Containerd相比Docker更轻量:

# Containerd安装配置
sudo apt-get update && sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

kubeadm初始化参数优化

kubeadm init \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --control-plane-endpoint "CLUSTER_ENDPOINT:6443" \
  --upload-certs \
  --apiserver-advertise-address=0.0.0.0 \
  --ignore-preflight-errors=Swap

关键配置说明:

  • --control-plane-endpoint:使用内网SLB地址实现高可用
  • --apiserver-advertise-address:绑定到所有网络接口
  • --ignore-preflight-errors=Swap:在已禁用Swap的情况下忽略警告

3. 网络方案选型与性能调优

在资源受限环境下,网络插件选择至关重要。实测数据对比:

网络插件内存占用CPU负载适用场景
Flannel80MB简单场景
Calico120MB需要网络策略
Cilium150MB高性能需求

推荐使用Flannel的vxlan模式:

# 修改后的flannel配置
net-conf.json: |
  {
    "Network": "10.244.0.0/16",
    "Backend": {
      "Type": "vxlan",
      "VNI": 4096,
      "Port": 4789
    }
  }

内网互通特殊处理

  • 腾讯云:需在安全组中放行VXLAN端口4789
  • 阿里云:配置专有网络路由表确保跨节点通信

4. 关键组件资源限制与稳定性保障

在2核2G机器上必须严格控制系统组件资源使用:

# kubelet配置优化(/var/lib/kubelet/config.yaml)
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:
  cpu: "0.3"
  memory: "300Mi"
kubeReserved:
  cpu: "0.2"
  memory: "200Mi"
evictionHard:
  memory.available: "100Mi"
  nodefs.available: "10%"

核心组件资源限制

# 查看组件资源使用
kubectl top pods -n kube-system

# 设置资源限制示例
kubectl patch deployment coredns -n kube-system -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"coredns","resources":{"limits":{"cpu":"200m","memory":"150Mi"},"requests":{"cpu":"100m","memory":"70Mi"}}}]}}}}'

常见问题处理:

  1. Port 10250被占用:重启kubelet服务
    sudo systemctl restart kubelet
    
  2. 证书过期问题:定期更新证书
    kubeadm certs renew all
    

5. 成本优化与长期运行策略

通过以下方式降低运营成本:

1. 弹性伸缩方案

# 创建HPA自动扩缩
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=5

2. 混合计费模式

  • 主节点:按量计费(保证稳定性)
  • Worker节点:抢占式实例(降低成本)

3. 监控方案

# 安装轻量级监控
helm install prom-stack prometheus-community/kube-prometheus-stack \
  --set prometheus.prometheusSpec.resources.requests.memory=200Mi \
  --set grafana.resources.requests.memory=100Mi

经过3个月连续运行测试,该方案在3台2核2G机器上可稳定支撑:

  • 日均Pod创建量:200+
  • API请求QPS:50+
  • 平均节点负载:<1.5

实际部署中发现,阿里云在跨可用区场景下网络稳定性略优于腾讯云,但腾讯云的内网带宽优势更适合数据密集型应用。根据业务特点选择合适的云平台,配合本文的优化方案,完全可以在低成本下获得生产可用的K8s集群。

更多推荐