在阿里云 ECS 上搭建多节点集群(如 Kubernetes、Hadoop、Redis Cluster 或自定义分布式系统)是一个系统工程。核心原则是:高可用、网络隔离、自动化部署、安全规范。
以下是基于最佳实践的完整搭建指南,分为 规划准备、网络与安全、节点初始化、集群软件部署 和 验证优化 五个阶段。
第一阶段:规划与架构设计
在创建实例前,明确你的集群类型和目标。
-
确定集群规模
- 小型集群:3-5 个节点(适合开发测试)。
- 中型集群:10-20 个节点(适合生产环境小规模业务)。
- 大型集群:50+ 节点(需考虑负载均衡、自动伸缩组 ASG)。
-
选择节点角色
- Master/控制节点:管理集群状态(如 K8s Master, Hadoop NameNode)。建议至少 3 个以实现高可用。
- Worker/工作节点:执行任务(如 K8s Worker, Hadoop DataNode)。数量根据负载动态调整。
- Load Balancer(可选):使用 SLB 作为入口,避免单点故障。
-
地域与可用区(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)”
- 先手动创建一台标准节点,完成所有初始化配置(安装 Docker/K8s 组件、配置内核参数等)。
- 将该实例制作成 自定义镜像。
- 使用 弹性伸缩组(Auto Scaling Group),基于该镜像批量创建多个节点。
- 优点:配置一致性强,扩缩容自动化。
方案 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 |
总结
搭建阿里云多节点集群的关键在于:
- 网络先行:VPC、安全组、子网规划要清晰。
- 一致性:通过镜像或脚本确保所有节点环境一致。
- 高可用:Master 节点分散在不同可用区,使用 SLB 或 Keepalived。
- 自动化:尽量使用 IaC 工具(Terraform/Ansible)而非手动操作。
如果你需要针对特定集群(如 Redis Cluster、Hadoop、Spark)的详细步骤,请告诉我具体类型,我可以提供更针对性的配置示例。
云服务器