核心概念
一、K8s 概述
Kubernetes (简称 K8s) 是一个开源的容器编排引擎,用于自动化容器化应用程序的部署、扩展和管理。
简单来说,K8s 就是一个智能的“容器管家”。以前我们手动部署应用,得自己盯着服务器:万一程序崩了要手动重启,流量大了要赶紧加机器,更新代码还得提心吊胆怕断网。有了 K8s,只需要告诉它一个“期望状态”(比如:我要 5 个这玩意儿一直跑着),剩下的脏活累活——比如分发任务、故障自愈、自动扩容它全帮干了。
参考文档:
- kubernetes 中文文档:
- kubernetes 中文社区:https://www.kubernetes.org.cn/docs
二、架构概览与核心组件

K8s 集群采用典型的 Master-Worker (控制平面-工作节点) 架构。
- Control Plane (控制平面):集群的“大脑”,负责全局决策(如调度)、检测和响应集群事件。
- Worker Node (工作节点):集群的“手脚”,负责实际运行应用程序的容器(Pod)。
K8s 的所有组件之间都不直接通过网络互相调用,而是全部通过
kube-apiserver进行通信。这保证了架构的松耦合和极高的可扩展性。
1. 控制平面组件
通常运行在 Master 节点上,生产环境中必须进行高可用部署(至少 3 个节点)。
kube-apiserver
K8s 集群的统一入口,提供 HTTP REST API 接口,所有其他组件(无论是内部组件还是外部客户端如 kubectl)都需要通过它来交互。它负责请求的认证、授权、准入控制以及 API 注册。
默认端口:
- 6443(TCP):所有的内部组件(如 kubelet、kube-scheduler)以及外部客户端(kubectl 命令),都是通过请求这个端口与控制平面进行通信的。
默认运行方式:
- 静态 Pod,控制平面的 kubelet 监控 /etc/kubernetes/manifests/kube-apiserver.yaml 文件,直接利用本机的容器运行时拉取镜像并启动 kube-apiserver 容器。
查看 apiserver 的版本
# curl -k https://127.0.0.1:6443/version
{
"major": "1",
"minor": "24",
"gitVersion": "v1.24.2",
"gitCommit": "f66044f4361b9f1f96f0053dd46cb7dce5e990a8",
"gitTreeState": "clean",
"buildDate": "2022-06-15T14:15:38Z",
"goVersion": "go1.18.3",
"compiler": "gc",
"platform": "linux/amd64"
}etcd
- K8s 的数据库。一个强一致性、高可用的分布式键值存储系统。它保存了整个集群的所有状态数据和配置信息。只有 kube-apiserver 可以直接访问它。
默认端口:
- 2379(TCP):用于对外提供服务。在 K8s 中,只有 kube-apiserver 会连接这个端口,向 etcd 发起读写请求(例如保存一个新的 Pod 记录,或者查询当前 Node 的状态)。也是使用 etcdctl 命令行工具查询数据时,默认连接的端口。
- 2380(TCP):用于 etcd 集群内部节点之间的数据同步和心跳维持。etcd 基于 Raft 共识算法,集群中的 Leader 节点和 Follower 节点需要不断地通过这个端口交换数据,以保证数据的高可用和强一致性。只有 etcd 节点彼此之间会用到这个端口,外部组件不会访问它。
默认运行方式:
- 静态 Pod,控制平面的 kubelet 监控 /etc/kubernetes/manifests/etcd.yaml 文件,直接利用本机的容器运行时拉取镜像并启动 etcd 容器。
在对稳定性要求极高的生产环境中,通常会将 etcd 从 K8s 的 Master 节点中剥离出来,部署在完全独立的一组服务器上。kube-apiserver 会通过配置参数(–etcd-servers)指向这组独立的外部机器的 2379 端口。这组外部机器上的 etcd 通常以 Systemd 守护进程(二进制部署)或容器的形式运行。
kube-scheduler
- 负责 Pod 的分配和调度,它会监控新创建且未分配节点的 Pod并根据一系列条件(硬件限制、亲和性/反亲和性规则等),为该 Pod 选择一个最合适的 Worker 节点来运行。
默认端口:
- 10259(TCP):主要用于暴露自身的 metrics 指标以及健康检查 healthz 等
默认运行方式:
- 静态 Pod,控制平面的 kubelet 监控 /etc/kubernetes/manifests/kube-scheduler.yaml 文件,直接利用本机的容器运行时拉取镜像并启动 kube-scheduler 容器。
kube-controller-manager
- 集群的大管家,运行着诸多后台控制器(如 Node, ReplicaSet Controller),负责维持集群的期望状态。
默认端口:
- 10257(TCP):主要用于暴露自身的 metrics 指标以及健康检查 healthz 等
默认运行方式:
- 静态 Pod,控制平面的 kubelet 监控 /etc/kubernetes/manifests/kube-controller-manager.yaml 文件,直接利用本机的容器运行时拉取镜像并启动 kube-controller-manager 容器。
2. 工作节点组件
运行在每一个 Worker Node 上,负责维护运行的 Pod 并提供 K8s 运行环境。
kubelet
- 节点的大管家(Agent),它直接与 kube-apiserver 通信,接收分配给该节点的 Pod 配置信息,并确保这些 Pod 中的容器处于运行状态且健康。它只会管理由 K8s 创建的容器。
默认端口:
- 10250(TCP):kube-apiserver 通过这个端口与 kubelet 通信的。
- 当执行 kubectl logs
(查看日志) 或者 kubectl exec -it – bash (进入容器终端) 时,请求会先到达 kube-apiserver,然后 API Server 就会作为客户端,去连接目标节点上 kubelet 的 10250 端口,最终由 kubelet 连通底层的容器。
- 当执行 kubectl logs
- 10248(TCP):kubelet 自身的健康检查端口,供节点本地的守护进程或监控系统探测 kubelet 是否崩溃,以便触发本地重启自愈。
运行方式:
- systemctl status kubelet
kube-proxy
- 网络代理与负载均衡,它在每个节点上维护网络规则(通常通过操作主机的 iptables 或 IPVS)。这些规则允许从集群内部或外部的网络会话与 Pod 进行通信,是实现 K8s Service 服务的核心组件。
默认端口:
- 10249(TCP):用于暴露自身的性能指标(Metrics)。Prometheus 等监控系统就是通过抓取每个节点上 kube-proxy 的这个端口,来监控网络规则同步是否延迟、连接数等情况。
- 10256(TCP):专门用于暴露 /healthz 接口,供 kubelet 或其他组件检查当前的 kube-proxy 进程是否健康存活。
运行方式:
- 通过 DaemonSet 在每个 worker 节点运行。
Container Runtime
- 容器运行时。真正负责运行容器的基础软件(如 containerd, CRI-O),实现了 CRI(Container Runtime Interface)规范,Kubelet 通过 CRI 接口与其交互。
3. 其他组件
下面这些组件,同样对 K8s 集群的正常运行至关重要。
CoreDNS
- 集群的 DNS 服务器。负责为集群中的 Service 和 Pod 提供 DNS 解析服务。
CNI
- 容器网络接口。负责为 Pod 分配网络资源(IP 地址、路由表),并确保不同 Pod 之间可以通信。
三、K8s 核心术语对照表
1. 基础
| 英文术语 | 中文对照 | 核心含义 |
|---|---|---|
| Pod | 容器组 | K8s 中最小的部署和计算单元。一个 Pod 共享同一网络命名空间(IP)和存储。 |
| Node | 节点 | 物理机或虚拟机。Pod 的实际载体。 |
| Namespace | 命名空间 | 虚拟集群隔离机制。常用于区分环境(如 dev, prod)或项目团队。注意:Namespace 只能隔离逻辑资源,不能隔离底层物理资源。 |
| Label | 标签 | 附加在对象上的键值对(Key-Value)。K8s 的灵魂,用于分类和标识。 |
| Selector | 标签选择器 | K8s 对象之间建立关联的“胶水”。例如,Service 通过 Selector 找到对应 Label 的 Pod 来转发流量。如果流量不通,第一步先检查 Selector 是否拼写一致。 |
| Annotation | 注解 | 类似 Label,但不用于标识和选择对象,而是用于存储非标识性的辅助元数据(如构建版本、被工具链依赖的配置信息)。 |
2. 工作负载
| 英文术语 | 中文对照 | 核心含义 |
|---|---|---|
| Deployment (deploy) | 无状态应用 | 管理无状态应用的最常用控制器。支持滚动更新(RollingUpdate)和一键回滚。它在底层通过管理 ReplicaSet 来控制 Pod 数量。 |
| StatefulSet (sts) | 有状态应用副本集 | 用于管理需要持久化存储和稳定网络标识符(如 pod-0, pod-1)的应用(如 MySQL, Redis 集群)。 |
| DaemonSet (ds) | 守护进程集 | 确保在集群的每一个(或符合条件的)Node 上都运行一个特定的 Pod 副本。常用于日志采集(Fluentd)或网络插件(Calico)。 |
| Job / CronJob | 任务 / 定时任务 | Job 用于执行一次性任务(如数据库迁移),CronJob 用于执行周期性任务(如每天凌晨备份)。 |
| ReplicaSet | 副本集 | 确保指定数量的 Pod 副本始终在运行。通常由 Deployment 自动管理,极少手动直接创建和操作。 |
3. 网络与服务暴露
| 英文术语 | 中文对照 | 核心含义 |
|---|---|---|
| Service (svc) | 服务 | 为一组 Pod 提供一个固定的虚拟 IP(ClusterIP)和负载均衡。解决了 Pod IP 频繁变化导致无法被可靠访问的问题。 |
| Ingress (ing) | 入口网关 | 管理集群外部访问集群内部服务的 HTTP/HTTPS 路由规则。相当于集群的“Nginx 反向代理配置”。需要配合 Ingress Controller 才能工作。 |
| Endpoint (ep) | 端点 | Service 的后端实际 IP 地址列表。当 Service 无法访问 Pod 时,第一步应使用 kubectl get ep 检查端点列表中是否有真实的 Pod IP。 |
| NetworkPolicy (netpol) | 网络策略 | 集群内部的“防火墙”。通过 Label 限制不同 Namespace 或 Pod 之间的网络出入站流量(默认是全部放行的)。 |
4. 配置与存储
| 英文术语 | 中文对照 | 核心含义 |
|---|---|---|
| ConfigMap (cm) | 配置映射 | 用于将非机密配置数据(如配置文件、环境变量)与容器镜像解耦。更新 ConfigMap 后,依赖它的热更新机制取决于应用的实现。 |
| Secret | 密钥 | 类似 ConfigMap,但用于存储敏感信息(如密码、Token、TLS 证书)。数据在 etcd 中默认以 Base64 编码存储。 |
| Volume | 存储卷 | 挂载到 Pod 容器中的目录。生命周期通常与 Pod 绑定(宿主机目录或临时目录)。 |
| PersistentVolume (pv) | 持久卷 | 集群级别的存储资源池(如一块 AWS EBS 云盘或一段 NFS 目录)。由管理员预先配置。 |
| PersistentVolumeClaim (pvc) | 持久卷声明 | 开发者对存储资源(PV)的“申请单”。Pod 通过挂载 PVC 来获取持久化存储,无需关心底层存储的具体实现。 |
| StorageClass (sc) | 存储类 | 存储的“模板”。当用户创建 PVC 时,K8s 可以根据 StorageClass 动态地自动创建 PV(动态供应 Dynamic Provisioning)。 |
5. 扩展与包管理
| 英文术语 | 中文对照 | 核心含义 |
|---|---|---|
| HPA (HorizontalPodAutoscaler) | Pod 水平自动扩缩容 | 根据 CPU/内存使用率或自定义指标,自动增加或减少 Deployment/StatefulSet 的 Pod 副本数。 |
| CRD (CustomResourceDefinition) | 自定义资源定义 | 允许用户在不修改 K8s 源代码的情况下,向 K8s API 注册自己发明的新资源类型(如 Prometheus 的 ServiceMonitor)。 |
| Helm | (K8s 包管理器) | 类似 Linux 的 apt 或 yum。通过模板化(Chart)的方式打包、发布和管理复杂的 K8s 应用。 |
6. 标准接口与容器运行时
K8s 本身并不直接提供网络、存储和底层的容器运行能力,而是通过定义一套标准接口(Interfaces),让第三方的插件(Plugins)来具体实现。
| 英文术语 | 中文对照 | 核心含义 |
|---|---|---|
| Container Runtime | 容器运行时 | 真正负责拉取镜像和运行容器的软件。以前默认是 Docker(dockershim),现在主流是 containerd 或 CRI-O。排障:当 K8s 层面无法操作容器时,可以直接登录 Node 节点,使用 crictl 工具进行底层排查。 |
| CRI (Container Runtime Interface) | 容器运行时接口 | K8s (kubelet) 与底层容器运行时(如 containerd)通信的标准 API 接口。只要符合 CRI 标准的运行时,都可以无缝接入 K8s。 |
| CNI (Container Network Interface) | 容器网络接口 | 负责为 Pod 分配 IP 地址并打通集群网络的标准插件接口。常见的实现有 Calico、Flannel、Cilium(基于 eBPF)。排障:如果 Pod 出现 NetworkPluginNotReady 或跨节点网络不通,重点检查 Node 节点上的 /etc/cni/net.d/ 配置文件和 CNI 插件的 Pod 日志。 |
| CSI (Container Storage Interface) | 容器存储接口 | K8s 对接外部存储系统的标准插件接口。无论是 AWS EBS、阿里云盘,还是自建的 Ceph、NFS,只要提供 CSI 驱动,就能被 K8s 作为 PV 动态调度。排障:如果 PVC 一直处于 Pending 或 Pod 挂载目录失败超时,通常需要去排查对应 CSI Provisioner 容器的日志。 |