搭建 HelloWorld 集群的关键是按步骤完成资源规划、节点准备、容器运行时与编排组件安装、网络与存储配置、监控与备份部署以及安全加固;把握这些要点并用自动化脚本重复执行,就能实现稳定可运维的生产级集群。下面逐步说明如何从零到一搭好并维持一个可观测、高可用、便于排错的 HelloWorld 集群。

为什么要用分步、可重复的方法?
先一句话:把复杂的系统拆成小块讲给别人听,自己也更容易记住。这就是费曼写作法的精髓。搭集群不是一次性敲命令就能万事大吉的事,按步骤做能帮你把风险分散、便于复现与排错。下面我会用“先做什么、怎么做、常见错误与排查”这一固定节奏来讲每一步。
第一部分:规划与前置条件
资源与拓扑规划
先决定集群的规模与角色:
- 控制平面(master)节点:至少 3 个用于高可用(HA),也可以初期用 1 个做测试。
- 工作节点(worker):根据负载决定,起步建议 2-3 台,便于做滚动升级与容量冗余。
- 网络与负载均衡:集群内需有扁平互通的 L2/L3 网络;若要对外暴露服务,须准备负载均衡器(云环境通常内置,裸机可用 MetalLB 或硬件 LB)。
- 存储:决定是否需要持久化卷(PV)。小型测试可用 hostPath,大型部署选 CSI 插件(NFS、Ceph、Longhorn 等)。
基础环境要求
- 操作系统:推荐 Ubuntu 20.04/22.04 或 CentOS 7/8(注意 systemd 支持)。
- 内核与内存:至少 2 vCPU、4GB RAM(控制面更多),尽量 8GB+ 用于生产工作节点。
- 网络名称解析:各节点能互相解析主机名或通过 /etc/hosts 配置静态映射。
- 时间同步:安装并配置 chrony 或 ntp,保证时钟一致性。
- 关闭 swap:Kubernetes 要求 swap 关闭或对应 kubelet 配置修改。
第二部分:节点准备(以 Ubuntu 为例)
系统初始化要点
- 更新系统:sudo apt update && sudo apt upgrade -y
- 设置主机名并同步 /etc/hosts,确保控制平面与节点互通。
- 关闭 swap:sudo swapoff -a,并注释掉 /etc/fstab 中的 swap 行。
- 启用内核参数以支持桥接网络转发:
在 /etc/sysctl.d/k8s.conf 中写入:
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1然后执行 sudo sysctl –system
- 关闭防火墙或按需开放端口(稍后会列表)。
安装容器运行时(containerd)
目前官方推荐使用 containerd 或 CRI-O。示例(Ubuntu):
- 安装依赖并添加源,然后安装 containerd。
- 生成默认配置:sudo mkdir -p /etc/containerd && sudo containerd config default > /etc/containerd/config.toml
- 重启并启用服务:sudo systemctl restart containerd && sudo systemctl enable containerd
注意:若使用 Docker(dockerd),集群编排需配合对应 CRI 插件;但 containerd 更轻量且兼容性好。
第三部分:部署集群编排(以 Kubernetes kubeadm 为例)
安装 kubeadm、kubelet、kubectl
- 导入 Kubernetes apt 源,安装 kubelet kubeadm kubectl 三个包并锁定版本(apt-mark hold)。
- 确保 kubelet 已启用但不启动集群,待初始化时 kubeadm 会控制。
初始化控制平面
核心命令示例(单主机测试或 HA 配置略有不同):
sudo kubeadm init –pod-network-cidr=10.244.0.0/16 –control-plane-endpoint=”LOAD_BALANCER_DNS:6443″
- –pod-network-cidr:依据所选 CNI(如 Flannel 使用 10.244.0.0/16,Calico 默认可自定义)。
- –control-plane-endpoint:HA 时传入负载均衡器地址;单主机可省略。
初始化完成后,会输出 kubeadm join 命令,记录下来以便 worker 节点加入。
安装网络插件(CNI)
没有网络插件,Pod 无法跨节点通信。常见选择:
- Calico:安全策略与网络策略功能强。
- Flannel:简单、轻量,适合入门。
- Weave:支持加密、易用。
安装示例(Flannel):在控制面执行 kubectl apply -f https://…/flannel.yaml(注意:这里你会从官方 Yaml 拉取,实际操作请用稳妥的离线或公司镜像)。
第四部分:关键组件与配置细节
持久化存储(Storage)
短期方案:hostPath 或 NFS。生产:使用 CSI 驱动或分布式存储(如 Ceph、Longhorn)。
| 场景 | 推荐方案 |
| 测试/开发 | hostPath / local PV / NFS |
| 生产分布式 | Longhorn / Ceph / Rook |
| 云上 | 云厂商的 Block/FS CSI(比如 AWS EBS、GCE PD) |
服务暴露与负载均衡
- 云环境:使用云厂商的 LB(ELB、SLB 等)。
- 裸机:推荐 MetalLB 为 Kubernetes Service 提供 L2/L3 负载均衡。
- Ingress:使用 Nginx Ingress 或 Traefik 来管理 HTTP/HTTPS 路由和证书。
监控、日志与备份
- 监控:Prometheus + Node Exporter + Grafana。
- 日志:EFK(Elasticsearch + Fluentd/Fluent Bit + Kibana)或 Loki + Promtail + Grafana。
- 备份:集群资源用 Velero 做备份和恢复,PV 级别按存储类型定制。
第五部分:安全与运维
认证与证书
默认 kubeadm 会生成证书,生产应考虑:
- 使用证书管理器(cert-manager)颁发 Ingress/应用证书。
- 为 API Server 使用外部 LB,配置客户端证书和 RBAC 权限。
网络策略与最小权限
启用 NetworkPolicy(Calico 等支持)并搭配 Pod Security Policy(或 PodSecurity Admission)限制不受信任的容器权限。
节点与工作负载的安全
- 关闭不必要的端口,启用主机级别防护(比如 Fail2ban、AIDE)。
- 使用镜像扫描工具(如 Trivy)在 CI 流程中拦截高危镜像。
- 定期升级操作系统与 Kubernetes 组件,测试升级路径并使用滚动升级减少影响。
第六部分:升级与备份恢复策略
常规升级流程(控制面与节点)
- 先备份:使用 Velero 或导出 Kubernetes 资源清单。
- 升级顺序:控制平面节点逐个升级(保证多数可用),然后升级 kubelet/kubectl,再升级 worker 节点。
- 在测试环境做完整演练,记录回滚步骤。
灾难恢复要点
- 备份 etcd(若使用独立 etcd 集群):定期快照并异地存储。
- 应用级别备份:数据库应做逻辑备份或使用 PV 快照。
- 恢复流程演练:定期在隔离环境中做 restore 演练,验证备份完整性。
第七部分:常见问题与排查命令
遇到问题时,不慌,按顺序排查。下面是高频问题与命令集合:
- 节点未就绪:kubectl get nodes → 若状态为 NotReady,查看 journalctl -u kubelet 与 kubectl describe node NODE。
- Pod 无法启动:kubectl get pods -A → kubectl describe pod POD -n NAMESPACE → 查看事件(Events)与容器日志 kubectl logs POD。
- 网络问题:检查 CNI 插件 Pod 状态,确认内核参数与路由表(ip a、ip route)。
- 镜像拉取失败:检查节点网络与镜像仓库访问权限,必要时使用私有仓库镜像加速。
端口与防火墙速查表
| 组件 | 端口 |
| API Server | 6443 (TCP) |
| etcd | 2379-2380 (TCP) |
| kubelet | 10250 (TCP) |
| 控制面间通信 | 10251/10252 (TCP) |
| Ingress / LoadBalancer | 80/443 (TCP) |
自动化与 CI/CD 建议
把重复的安装与配置用脚本或配置管理工具(Ansible、Terraform、Helm)自动化:
- 基础设施:Terraform 管理云资源或裸机资产清单。
- 节点初始化:使用 cloud-init 或 Ansible 执行一致性安装步骤。
- 应用发布:使用 Helm 管理应用生命周期,配合 GitOps(ArgoCD、Flux)提高可观测与回滚能力。
实战小贴士(不少人踩过的坑)
- 不要在生产环境临时改 /etc/hosts 来绕过 DNS,最好用稳定的内部 DNS 或服务发现机制。
- 控制面节点少于 3 个时,etcd 容错能力弱;测试可以,但生产慎重。
- 不要随意开启 swap,若必须开启要显式调整 kubelet 的 –fail-swap-on 配置。
- 证书过期常被忽略,定期检查并自动化续约(kubeadm 有证书续约命令、cert-manager 可用于 Ingress 证书)。
好像说了很多,但核心就是把每一步做成可重复的脚本、把关键数据(etcd、PV、Vault 秘密)纳入备份范围、并在小环境反复练习升级及恢复流程。你若想要我把其中某一步(比如 containerd 的详细配置、Calico 的网络策略例子或 Velero 的备份脚本)写成可复制粘贴的脚本,我可以接着把那部分展开写出来。就先到这儿,边写边想,你要哪个环节我就接着完善。