奋斗
努力

阿里云ECS如何搭建多节点集群?

云计算

在阿里云 ECS 上搭建多节点集群(如 Kubernetes、Hadoop、Redis Cluster 或自定义分布式系统)是一个系统工程。核心原则是:高可用、网络隔离、自动化部署、安全规范。

以下是基于最佳实践的完整搭建指南,分为 规划准备、网络与安全、节点初始化、集群软件部署 和 验证优化 五个阶段。


第一阶段:规划与架构设计

在创建实例前,明确你的集群类型和目标。

  1. 确定集群规模

    • 小型集群:3-5 个节点(适合开发测试)。
    • 中型集群:10-20 个节点(适合生产环境小规模业务)。
    • 大型集群:50+ 节点(需考虑负载均衡、自动伸缩组 ASG)。
  2. 选择节点角色

    • Master/控制节点:管理集群状态(如 K8s Master, Hadoop NameNode)。建议至少 3 个以实现高可用。
    • Worker/工作节点:执行任务(如 K8s Worker, Hadoop DataNode)。数量根据负载动态调整。
    • Load Balancer(可选):使用 SLB 作为入口,避免单点故障。
  3. 地域与可用区(Zone)策略

    • 同城多可用区:将 Master 节点分散到不同可用区(如 Zone A, B, C),实现容灾。
    • 同可用区:Worker 节点可集中在同一可用区以降低内网延迟,但需确保该可用区稳定。

第二阶段:网络与安全配置(关键步骤)

这是最容易出错的部分,务必提前配置好。

1. 专有网络 VPC 设置

  • 创建一个独立的 VPC 和 交换机(vSwitch)。
  • 为集群分配一个私有 IP 段(如 172.16.0.0/16)。
  • 推荐:为 Master 和 Worker 创建不同的子网,便于后续通过 ACL 或路由表进行流量管控。

2. 安全组(Security Group)规则

不要直接使用默认安全组!为集群创建专用安全组,并遵循最小权限原则。

方向 端口范围 源地址 用途
入站 22 管理员 IP SSH 访问
入站 所有内网 IP 集群 CIDR 节点间通信(如 K8s API 6443, etcd 2379/2380, HDFS 9000 等)
出站 所有 0.0.0.0/0 允许节点访问网络(下载软件、更新包)

重要提示:确保同一安全组内的 ECS 实例可以互相访问所有端口(或在应用层放行特定端口)。

3. 密钥对(Key Pair)

  • 为每个节点生成或使用统一的 SSH 密钥对。
  • 禁用密码登录,仅允许密钥认证,提升安全性。

第三阶段:批量创建与管理 ECS 实例

手动创建效率低且易出错,推荐使用以下方式之一:

方案 A:使用“自定义镜像” + “弹性伸缩组(ASG)”

  1. 先手动创建一台标准节点,完成所有初始化配置(安装 Docker/K8s 组件、配置内核参数等)。
  2. 将该实例制作成 自定义镜像。
  3. 使用 弹性伸缩组(Auto Scaling Group),基于该镜像批量创建多个节点。
  4. 优点:配置一致性强,扩缩容自动化。

方案 B:使用 Terraform / Ansible / Packer

  • 使用基础设施即代码(IaC)工具定义集群结构。
  • 适用于大规模、标准化部署。

方案 C:手动创建(仅适合少量节点)

  • 在控制台批量创建 ECS,注意选择相同 VPC、交换机和安全组。

第四阶段:节点初始化与基础环境配置

所有节点必须保持一致的基础环境。

1. 操作系统优化

# 关闭防火墙(或使用 firewalld 精确放行)
systemctl stop firewalld && systemctl disable firewalld

# 关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 关闭 Swap(对 K8s 等集群至关重要)
swapoff -a
sed -i '/swap/d' /etc/fstab

# 调整内核参数(以 K8s 为例)
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
sysctl --system

2. 时间同步

  • 所有节点必须时间一致,否则会导致证书失效、数据不一致等问题。
  • 配置 NTP 服务指向阿里云内部 NTP 服务器:
    ntpdate ntp.aliyun.com
    crontab -e  # 添加定时任务每小时同步
    */10 * * * * /usr/sbin/ntpdate ntp.aliyun.com

3. 主机名与 Hosts 解析

  • 设置清晰的主机名(如 k8s-master-01, k8s-worker-01)。
  • 在所有节点的 /etc/hosts 中添加其他节点的 IP 和主机名映射,便于内部通信。

4. SSH 免密登录

  • 在 Master 节点生成公钥,分发到所有 Worker 节点:
    ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
    for node in worker1 worker2; do
        ssh-copy-id root@$node
    done

第五阶段:部署集群软件(以 Kubernetes 为例)

这里以最常见的 Kubernetes (K8s) 集群为例,其他集群(如 Redis, Hadoop)逻辑类似。

1. 安装容器运行时(Docker/containerd)

在所有节点安装并启动 containerd 或 Docker。

2. 安装 kubeadm/kubelet/kubectl

在所有节点安装相同版本的 K8s 组件。

3. 初始化 Master 节点

在第一个 Master 节点上执行:

kubeadm init 
  --pod-network-cidr=10.244.0.0/16 
  --control-plane-endpoint=<SLB_IP或Master公共IP>

注意:如果使用 SLB,需将 SLB 后端绑定到所有 Master 节点的内网 IP,并在 --control-plane-endpoint 中指定 SLB 的 VIP。

4. 加入 Worker 节点

从 Master 节点获取 kubeadm join 命令,在每台 Worker 节点上执行。

5. 安装 CNI 插件(网络插件)

例如 Calico 或 Flannel:

kubectl apply -f calico.yaml

6. 高可用扩展(Multi-Master)

  • 复制第一台 Master 的配置目录 /etc/kubernetes/ 到其他新 Master 节点。
  • 使用 kubeadm upgrade 或重新初始化第二台、第三台 Master,形成 Raft 共识集群。

第六阶段:验证与优化

1. 验证集群状态

kubectl get nodes
kubectl get pods -A

确保所有节点状态为 Ready,Pod 运行正常。

2. 监控与日志

  • 启用 云监控(CloudMonitor) 监控 ECS CPU、内存、磁盘 IO。
  • 集成 SLS(日志服务) 收集容器日志。
  • 对于 K8s,可部署 Prometheus + Grafana 进行深度监控。

3. 备份与灾难恢复

  • etcd 备份:定期备份 etcd 数据(K8s 的核心状态库)。
  • 快照策略:为关键 ECS 实例设置每日自动快照。

4. 成本优化

  • 使用 抢占式实例(Spot Instance) 用于非关键的 Worker 节点,可节省高达 90% 成本。
  • 使用 资源配额(Resource Quota) 限制每个命名空间的资源使用,防止单个 Pod 耗尽集群资源。

常见陷阱与解决方案

问题 原因 解决方案
节点无法互通 安全组规则未放行内网 IP 检查安全组入站规则,确保源地址为 VPC CIDR 或具体内网 IP
证书过期/无效 时间不同步 配置 NTP 同步,确保证书签发时时间准确
Pod 调度失败 资源不足或污点(Taint) 检查节点标签和容忍度,扩容节点
DNS 解析慢 CoreDNS 配置问题 优化 CoreDNS 配置,使用阿里云内网 DNS

总结

搭建阿里云多节点集群的关键在于:

  1. 网络先行:VPC、安全组、子网规划要清晰。
  2. 一致性:通过镜像或脚本确保所有节点环境一致。
  3. 高可用:Master 节点分散在不同可用区,使用 SLB 或 Keepalived。
  4. 自动化:尽量使用 IaC 工具(Terraform/Ansible)而非手动操作。

如果你需要针对特定集群(如 Redis Cluster、Hadoop、Spark)的详细步骤,请告诉我具体类型,我可以提供更针对性的配置示例。

未经允许不得转载:云服务器 » 阿里云ECS如何搭建多节点集群?