☰
90DaysOfDevOps 第 50 天:Kubernetes 平台选型指南——从裸金属、虚拟化到托管服务,选择适合你的运行环境
2026/10/8 12:14:31 网站建设 项目流程
  • 文档/教程

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/90/90DaysOfDevOps
点击查看免费下载

本篇文章是 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_NODES2工作节点数量
IP_NW10.0.0.私有网络网段
IP_START10起始 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.

项目地址:https://gitcode.com/gh_mirrors/90/90DaysOfDevOps
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询