- 文档/教程
【免费下载链接】90DaysOfDevOps
This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.
本篇文章是 90DaysOfDevOps 学习路径中 Kubernetes 系列的关键一环:在掌握了 第 49 天:Kubernetes 大图景 中的架构与核心概念之后,我们面临第一个实操决策——Kubernetes 集群到底应该运行在哪里。本文围绕"消除复杂性"这一主线,系统对比裸金属、虚拟化、本地桌面环境与托管服务四类平台,结合本仓库中真实的 Vagrant + kubeadm 部署脚本给出证据与落地参考,帮助你理解各方案的代价、控制权与适用场景,并为下一节 第 51 天:部署你的第一个 Kubernetes 集群(基于 minikube)做好准备。
平台选型背后的核心矛盾:复杂性与控制权
Kubernetes 世界长期面临一个挑战——如何消除复杂性。Kubernetes 社区流传着一条"hard way"路线:从零开始,一步步把一个空环境构建成功能完整的 Kubernetes 集群。这条路线走到极致时能让你彻底理解每一个组件(API Server、Scheduler、Controller Manager、etcd、kubelet……),但它极其繁重。
与之相对,越来越多的人希望直接运行一个托管(Managed)的 Kubernetes 集群,把上述复杂性交给云厂商。代价是成本更高,同时收益也很明确:当你使用托管服务(例如 Amazon EKS、Microsoft AKS、Google Kubernetes Engine/GKE)时,控制平面节点通常不再暴露给终端用户,你无需深入了解底层节点架构以及控制平面内部正在发生什么——因为一般而言你根本没有访问权限。
在这两个极端之间,还存在本地开发型发行版:利用我们自己的系统,运行一个本地的 Kubernetes 版本,让开发者拥有一个与生产平台一致的完整工作环境来运行应用。
无论选择哪条路径,有一个共同基础是成立的:这些方案本质上都是 Kubernetes 的一种"口味"(a flavour of Kubernetes)。这意味着我们应当能够自由迁移工作负载,按需把它们移动到最合适的平台上。此外,选型很大程度上也取决于已有的投入(投资回报角度),以及开发者体验——好在不少本地 Kubernetes 环境可以免费在笔记本电脑上运行,是零成本上手这门技术的最佳途径。
Bare-Metal:裸金属集群
对于许多人而言,一个可选项是直接在若干台物理服务器上运行 Linux 操作系统来组建集群。理论上 Windows 也可以,但作者指出,围绕 Windows、容器与 Kubernetes 的组合,其采用率(adoption rate)并不高。
裸金属方案的本质特征:
- 资本开支(CAPEX)决策:企业如果已经决定购置物理服务器,这可能就是构建集群的方式;
- 全栈自建:从管理到运维,一切都必须从零开始自己构建、自己管理——节点操作系统、容器运行时、控制平面、网络插件、存储、监控、升级、证书管理全部亲力亲为;
- 最高控制权:你拥有物理硬件与整个集群的完全控制力,但同时也背负最大的运维负担。
仓库中虽然没有裸金属直接示例,但可以从中看到"自建集群"路径的自动化版本——2022/Days/Kubernetes目录提供了基于VirtualBox + Vagrant + kubeadm的多节点集群模板,本质上是把裸金属"自建一切"的思路迁移到虚拟化环境并脚本化,下文会结合源码展开。
虚拟化(Virtualisation):用 VM 充当节点
无论目标是测试与学习环境,还是企业级就绪的 Kubernetes 集群,虚拟化都是一条很好的起步路线:典型做法是创建若干虚拟机(VM)作为节点,再把它们聚合成集群。虚拟化的优势在于成熟的下层架构、效率与速度,同时能复用企业已有的硬件投入。原文举例 VMware 同时提供了虚拟机与 Kubernetes 的多种方案。
作者本人的第一个 Kubernetes 集群,就是基于Microsoft Hyper-V构建在一台旧服务器上的——这台服务器足以运行几个 VM 作为节点。
仓库证据:Vagrant 一键拉起多节点集群
仓库中的 2022/Days/Kubernetes/Vagrantfile 正是"虚拟机 + 集群化"思路的完整可运行实现,它一次性定义了三台机器:
| 变量 | 值 | 说明 |
|---|---|---|
NUM_WORKER_NODES | 2 | 工作节点数量 |
IP_NW | 10.0.0. | 私有网络网段 |
IP_START | 10 | 起始 IP,master 为10.0.0.10 |
master:主机名master-node,内存 4048 MB、2 核 CPU,先执行 scripts/common.sh(公共初始化)再执行 scripts/master.sh(控制平面初始化);node01/node02:主机名worker-node01/worker-node02,内存 2048 MB、1 核 CPU,执行common.sh后执行 scripts/node.sh(加入集群);- 镜像统一使用
bento/ubuntu-21.10,并自动在/etc/hosts中写入三台机器的解析记录。
公共初始化脚本common.sh展示了"从零准备节点"所需的全部底层工作,这也正是裸金属/虚拟化自建路径无法回避的部分:
- 关闭 swap:
sudo swapoff -a并注释/etc/fstab中的 swap 条目(swap 会影响 kubelet 的资源管理与调度判定); - 内核模块与网络转发:加载
br_netfilter、overlay模块,并写入/etc/sysctl.d/99-kubernetes-cri.conf,开启net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables、net.ipv4.ip_forward,让 iptables 能看到桥接流量(Kubernetes 网络与 Service 代理的基础); - 容器运行时:安装 Docker Engine 与 containerd,并以
containerd config default生成默认配置(容器运行时是每个节点都必须具备的组件); - 集群工具:通过 apt 安装
kubelet、kubectl、kubeadm,并用apt-mark hold固定版本(脚本锁定KUBERNETES_VERSION="1.23.3-00",避免节点间版本漂移)。
控制平面脚本master.sh则对应"从零构建"的关键一步kubeadm init:
sudo kubeadm init \ --apiserver-advertise-address=$MASTER_IP \ --apiserver-cert-extra-sans=$MASTER_IP \ --pod-network-cidr=$POD_CIDR \ --node-name $NODENAME \ --ignore-preflight-errors Swap其中POD_CIDR="192.168.0.0/16"是 Pod 网络 CIDR,随后脚本下载并应用Calico网络插件(kubectl apply -f calico.yaml),并额外安装 Metrics Server 与 Kubernetes Dashboard。节点加入则依赖kubeadm token create --print-join-command生成的 configs/join.sh,由node.sh执行完成加入。
这套脚本的价值在于:它把"虚拟化 + 自建集群"的全过程固化成了可复现的代码,让你直观看到自建路径中控制平面、网络插件、证书、节点加入这些环节到底长什么样——这正是选择托管服务时被"抽象掉"的部分。
本地桌面选项:在笔记本上跑 Kubernetes
当你想在桌面或笔记本电脑上运行一个本地 Kubernetes 集群时,有若干选择。这给开发者带来的核心价值是:无需维护多个昂贵或复杂的集群,就能预览应用部署后的真实形态。作者个人大量使用过这一类方案,尤其偏爱minikube,它拥有出色的功能与 add-ons(附加组件),改变了"把一个东西跑起来"的方式。
这一类别(本地开发环境)的典型工具与定位:
| 工具 | 定位 | 特点 |
|---|---|---|
| minikube | 本地单/多节点集群 | 功能与 add-ons 丰富,抽象复杂性,支持多平台、多集群、跨平台、硬件无关 |
| Kind(Kubernetes in Docker) | 容器化集群 | 用 Docker 容器模拟节点,极轻量,适合 CI |
关于二者的取舍,作者的实践建议是:将 minikube 作为第一选项,或使用 Kind。minikube 的优势在于 add-ons 生态——可以只用 add-ons 就把环境快速搭建起来,用完直接销毁("blow it away");还可以运行多个集群,几乎在任何地方运行,跨平台且不依赖特定硬件。
minikube 的实际操作会在下一课 第 51 天:部署你的第一个 Kubernetes 集群 完整演示(包括minikube start、kubectl get nodes、常用 add-ons 与kubectl速查表)。顺带一提,kubectl也是本地开发环境必不可少的工具——它是与集群 API Server 交互的唯一命令行入口。
Kubernetes 托管服务:把控制平面交出去
前面提到的虚拟化既可以在本地 hypervisor 上实现,也可以借助公有云中的虚拟机作为节点。而本小节讨论的"托管服务"更进一步:它是来自大型云厂商(hyperscalers)以及MSP(Managed Service Provider,托管服务提供商)的产品,目标是把管理与控制层级从终端用户身上剥离。
这种剥离最典型的表现就是控制平面不再对终端用户开放,这正是 Amazon EKS、Microsoft AKS、Google Kubernetes Engine(GKE)的普遍形态。也就是说:
- 你获得的是一个"开箱即用"的 Kubernetes 集群,API Server、etcd、调度器等控制平面组件由云厂商负责 SLA、升级与高可用;
- 你(用户)只管理自己的工作负载——命名空间、Pod、Deployment、Service 等;
- 代价是更高的资金投入,以及对底层节点架构、控制平面运行细节的"不知情"。
从运维视角看,托管服务消除了大量重复性管理工作,非常适合"不想自己修控制平面"的团队;而本地/自建方案则保留了最大控制权,适合学习原理或对合规、成本、定制有特殊要求的场景。
选择过多:OpenShift 与分发平台
选择本身是好事,但选项太多也会令人不知所措——原文特别说明,这篇文章并不是对上述每个类别下所有选项的深度罗列。
在以上各类别之外,还有一个重要的发行版:Red Hat OpenShift。它的特点在于:
- 可以运行在以上所有平台之上——包括各大主流云厂商;
- 无论集群部署在哪里,它大概能为管理员提供整体上最好用的体验(尤其在统一的多集群管理与开发者工作流方面)。
仓库的 2022/Days/Kubernetes/Rancher 目录提供了另一套基于 Vagrant 的变体模板(使用bento/ubuntu-21.10与公网桥接网络),从源码结构看,社区同样常用Rancher这类 Kubernetes 管理/分发平台来统一纳管自建集群。这提示我们:除了"自建 vs 托管"的二元选择,还存在"在任意底层之上叠加一个管理平台"的第三条路线。
从哪里开始:给学习者的实用建议
作者回顾自身经历:最初选择虚拟化路线,是因为当时有一台可用于此目的的物理服务器;而如今已经不再拥有该选项。基于这些实践,当前最务实的建议是:
先用 minikube 作为第一个选项,或使用 Kind;minikube 提供了额外的好处——几乎把复杂性抽象掉了:用 add-ons 快速构建,用完即删,可运行多个集群,几乎随处可跑、跨平台、硬件无关。
一句话总结选型逻辑:
- 想零成本快速上手、验证应用 → 本地 minikube / Kind;
- 想深入理解 Kubernetes 原理、拥有全部控制权 → 虚拟化(甚至裸金属)自建,可参考仓库中的 Vagrant + kubeadm 模板;
- 想少运维、上生产且接受更高成本 → 托管服务(EKS / AKS / GKE);
- 想要统一管理体验→ 考虑 OpenShift 或 Rancher 等平台叠加在任意底层之上。
作者亲测过的平台清单
作者在 Kubernetes 学习旅程中实际尝试过以下平台与部署路径,并据此建立了对"Kubernetes 可以运行在哪里"的直观认识,读者可据此规划自己的动手路线:
- Kubernetes 家庭实验室(Home Lab):如何选择平台;
- Kubernetes 家庭实验室:搭建你的集群;
- 入门 Amazon Elastic Kubernetes Service(Amazon EKS);
- 入门 Microsoft Azure Kubernetes Service(AKS);
- 入门 Microsoft AKS——Azure PowerShell 版本;
- 入门 Google Kubernetes Service(GKE);
- Kubernetes 实操:AWS Bottlerocket + Amazon EKS;
- 入门 CIVO Cloud;
- Minikube——面向所有人的 Kubernetes 演示环境。
(上述实践要点也将在 第 51 天 及后续章节以仓库内可运行配置的形式逐步落地。)
本系列接下来覆盖的内容
本节(Kubernetes 系列)后续将依次深入以下主题,平台选型只是其中一块基石:
- Kubernetes 架构(Architecture)
- kubectl 命令(kubectl Commands)
- Kubernetes YAML
- Kubernetes Ingress
- Kubernetes Services
- Helm 包管理器(Helm Package Manager)
- 持久化存储(Persistent Storage)
- 有状态应用(Stateful Apps)
作为预告,仓库中的示例文件已经为后续章节埋下了实战素材:无状态应用示例见 nginx-stateless-demo.yaml,有状态应用与持久化存储的完整组合(含 StatefulSet、PVC、Secret、MongoDB)见 pacman-stateful-demo.yaml 与 statefulset.yaml,Ingress 规则示例见 pacman-ingress.yaml——这些文件将在"YAML / Ingress / Services / 持久化存储 / 有状态应用"各节中被反复使用。
参考资料
- Kubernetes 官方文档(Kubernetes Documentation),适合新手从"什么是 Kubernetes"读起;
- TechWorld with Nana:Kubernetes for Beginners 完整课程(4 小时)与 Kubernetes 速成课(面向绝对新手);
- Kunal Kushwaha:Kubernetes 入门教程——架构简化讲解。
下一节见 第 51 天:部署你的第一个 Kubernetes 集群——我们将用 minikube 在本地真正拉起第一个集群。
- 文档/教程
【免费下载链接】90DaysOfDevOps
This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.
相关推荐
90DaysOfDevOps Day 50:如何选择你的 Kubernetes 平台——裸金属、虚拟化、本地开发与托管服务全解析
90DaysOfDevOps Day 50:如何选择你的 Kubernetes 平台——裸金属、虚拟化、本地开发与托管服务全解析 在 90DaysOfDevOp
文档/教程90DaysOfDevOps 之 Day 50:如何选择你的 Kubernetes 平台——裸金属、虚拟化、本地桌面与托管服务全解析
90DaysOfDevOps 之 Day 50:如何选择你的 Kubernetes 平台——裸金属、虚拟化、本地桌面与托管服务全解析 导读 本文是 90Days
文档/教程90DaysOfDevOps 第 50 天:如何选择你的 Kubernetes 平台与发行版
90DaysOfDevOps 第 50 天:如何选择你的 Kubernetes 平台与发行版 本文是 90DaysOfDevOps 挑战中 Kubernetes
文档/教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考