跳转至

平台能力总览

集群能启动,只是平台工程的起点。真正让 Kubernetes 可用的,是网络、存储、可观测性、证书、备份这些「第二层能力」。本章给出一张依赖地图,帮你决定先装什么、后装什么,以及哪些其实可以不装。

难度 · 进阶 预计 30 分钟 前置:核心对象、集群部署

你将学到

  • 平台能力的七个层次,以及它们之间的依赖关系
  • 一份可以照着执行的安装顺序,而不是一堆并列的组件清单
  • CNI、负载均衡、存储、监控、日志的选型判断
  • 小集群 / 生产集群的差异化取舍
  • 每个能力域对应的章节与验证入口

先分清「集群」和「平台」

kubeadm init 成功、节点 Ready,只说明控制平面和 kubelet 能工作。此时你得到的是一台「能调度 Pod 的机器」,还不是一个平台:

能力 没有它会发生什么 典型组件
Pod 网络 Pod 之间无法互通,CoreDNS 起不来 Calico、Cilium、Flannel
服务入口 集群外无法访问,LoadBalancer 一直 Pending MetalLB、OpenELB、ingress-nginx
持久存储 数据库 Pod 重建即丢数据 OpenEBS、NFS CSI、云盘 CSI
指标 无法 kubectl top,HPA 没有数据 metrics-server、Prometheus Adapter
日志 容器重建后日志消失,无法检索 Loki、Elasticsearch + Filebeat
证书 Ingress TLS 靠手工签发和续期 cert-manager
备份 误删 namespace 等于数据消失 Velero

这些能力不是平级的。网络是地基,存储和入口依赖它;监控依赖存储;证书依赖入口;备份依赖存储。按依赖顺序安装,能避免大量「Pod Pending / CrashLoopBackOff」的无效排错。

依赖地图

flowchart TB
  subgraph L0[集群底座]
    K[Kubernetes v1.31]
    C[CNI: Calico / Cilium / Flannel]
  end
  subgraph L1[基础设施]
    M[MetalLB / OpenELB]
    S[StorageClass: OpenEBS / NFS CSI]
    MS[metrics-server]
  end
  subgraph L2[平台服务]
    I[ingress-nginx]
    P[Prometheus + Grafana]
    L[Loki / Elasticsearch]
    CM[cert-manager]
  end
  subgraph L3[运营能力]
    V[Velero]
    KA[Karmada]
  end
  K --> C
  C --> M
  C --> S
  C --> MS
  M --> I
  S --> P
  S --> L
  I --> CM
  P --> V
  S --> V
  K --> KA

图:平台能力的依赖关系。箭头表示「前者是后者的前置条件」,不是数据流。

推荐安装顺序

下面这份顺序按「最小可用 → 可观测 → 可恢复」组织。每一步都给出验证命令,装完再进入下一步。

步骤 安装内容 依赖 验证 对应章节
1 CNI 插件 集群初始化时指定 Pod CIDR kubectl get pods -n kube-system CNI 网络
2 metrics-server CNI、kubelet 证书 kubectl top nodes 调度与弹性
3 StorageClass 磁盘 / NFS / LVM PVC 变为 Bound 存储扩展
4 MetalLB / OpenELB CNI、可用 IP 段 Service 获得 EXTERNAL-IP 负载均衡
5 ingress-nginx MetalLB 或 NodePort curl 命中后端 负载均衡
6 Prometheus / Grafana StorageClass Target 全部 UP Prometheus
7 Loki 或 ECK StorageClass、对象存储 Grafana 能查到日志 日志与 ELK
8 cert-manager ingress-nginx Certificate 变为 Ready 证书管理
9 Velero 对象存储、快照能力 Backup 状态 Completed 备份与恢复
10 Karmada 多个可用集群 资源被分发到成员集群 多集群

不要一次装完

在 4C8G 的单机实验环境里同时安装 Prometheus、Loki、ECK、GitLab,最常见的结局是节点 OOM,然后误以为是 Kubernetes 的问题。一次只加一个能力域,记录资源占用,再决定是否保留。

选型判断

CNI 怎么选

场景 建议 理由
初学、追求简单 Flannel(VXLAN) 配置少,排错路径短
需要 NetworkPolicy、BGP Calico 成熟、文档多,支持 IPIP/VXLAN/BGP
需要 eBPF、Hubble、L7 可见性 Cilium 性能与可观测性强,可替换 kube-proxy
云托管集群 跟随云厂商 避免与云网络叠加冲突

负载均衡怎么选

  • 裸金属 / 自建虚拟机:MetalLB(L2 模式最简单)或 OpenELB。
  • 云上:直接使用云 LoadBalancer,通常不必再装 MetalLB。
  • 只有单节点 / 本地开发:NodePort + port-forward 足够,不必为了「看起来完整」引入 BGP。

存储怎么选

  • 单机学习:OpenEBS hostpath 或 local-path-provisioner。
  • 需要跨节点共享:NFS CSI(RWX),但要接受 NFS 的单点与性能边界。
  • 需要块存储 / 快照:OpenEBS LVM 或云盘 CSI。
  • 对象存储:MinIO 用于实验与 S3 兼容场景,生产要评估租户隔离与纠删码。

可观测性怎么选

Prometheus 负责指标,日志侧二选一即可:

维度 Loki Elasticsearch + Filebeat
存储成本 低(只索引标签) 高(全文索引)
查询能力 LogQL,适合按标签过滤 全文检索、聚合强
运维复杂度 较低 较高
适用场景 云原生、按 Pod/namespace 查日志 需要复杂检索、合规审计

版本基线

以下是本站在实验中使用的主版本,不要求完全一致,但不要让组件跨太多大版本:

组件 建议版本 说明
Kubernetes v1.31.x 仓库中的 kubeadm 示例基线
Helm 3.16+ 不再需要 Tiller
Calico 3.29+ 与 K8s 1.31 兼容
Cilium 1.16+ 使用 cilium install 管理
MetalLB 0.14+ v1beta1 API
OpenEBS 4.1+ 4.x 与 3.x 差异很大
cert-manager 1.17+ v1 API
Velero 1.15+ 注意 node-agent 与 CSI
Karmada 1.13+ 与成员集群版本保持兼容

版本不是越新越好

平台组件与 Kubernetes 有版本 skew 限制。升级集群前,先查组件的兼容矩阵;升级 CNI / CSI 时,先在测试集群验证 Pod 网络与 PVC 挂载。

实验:检查你的平台完成度

在集群上执行下面这段脚本,逐项确认基础能力是否就绪:

#!/usr/bin/env bash
set -u

echo "== 节点 =="
kubectl get nodes -o wide

echo "== CNI Pod =="
kubectl get pods -n kube-system | grep -E 'calico|cilium|flannel' || true

echo "== metrics-server =="
kubectl top nodes 2>&1 | head -5

echo "== StorageClass =="
kubectl get storageclass

echo "== LoadBalancer Service =="
kubectl get svc -A | awk '$3=="LoadBalancer"'

echo "== IngressClass =="
kubectl get ingressclass

echo "== 监控 Target =="
kubectl get servicemonitors -A 2>/dev/null | head -10

预期至少看到:

  • 所有节点 Ready;
  • 至少一个 CNI Pod 处于 Running;
  • 至少一个非 kubernetes.io/no-provisioner 的 StorageClass;
  • 如果装了 MetalLB,LoadBalancer Service 不再停留在 <pending>。

常见问题

现象 可能原因 处理
CoreDNS Pending 没有 CNI,或 CNI Pod 未就绪 先装 CNI,再等 CoreDNS 重建
kubectl top 报 metrics not available metrics-server 未装或 TLS 证书不匹配 检查 --kubelet-insecure-tls 与 APIService
PVC 一直 Pending 没有默认 StorageClass,或 WaitForFirstConsumer 未调度 指定 storageClassName,或先创建 Pod
LoadBalancer <pending> 没有 LB 实现,或地址池耗尽 装 MetalLB 并创建 IPAddressPool
Ingress 502 Service 名字/端口错,或后端未 Ready kubectl get endpoints 对照
Prometheus Target DOWN ServiceMonitor 标签不匹配 检查 selector.matchLabels 与 Service 标签

小结

  • 平台能力有明确的依赖顺序:CNI → 指标/存储 → 入口 → 可观测性 → 证书/备份 → 多集群。
  • 不要为了「全家桶」而安装;每个组件都要能回答「它解决什么问题、坏了怎么发现」。
  • 先建立验证命令,再安装组件。没有验收标准的安装,等于没装。

延伸阅读