目录
[一、Kubernetes 集群整体结构](#一、Kubernetes 集群整体结构)
[1 kube-apiserver(API 服务器)](#1 kube-apiserver(API 服务器))
[2 etcd(集群数据库)](#2 etcd(集群数据库))
[3 kube-scheduler(调度器)](#3 kube-scheduler(调度器))
[4 kube-controller-manager(控制器管理器)](#4 kube-controller-manager(控制器管理器))
[Node Controller](#Node Controller)
[Job Controller](#Job Controller)
[EndpointSlice Controller](#EndpointSlice Controller)
[ServiceAccount Controller](#ServiceAccount Controller)
[5 cloud-controller-manager(云控制器)](#5 cloud-controller-manager(云控制器))
[三、节点组件(Node Components)](#三、节点组件(Node Components))
[1 kubelet(节点代理)](#1 kubelet(节点代理))
[2 kube-proxy(网络代理)](#2 kube-proxy(网络代理))
[3 容器运行时(CRI)](#3 容器运行时(CRI))
[四、Kubernetes 插件](#四、Kubernetes 插件)
[1 网络插件](#1 网络插件)
[Gateway API](#Gateway API)
[2 服务发现](#2 服务发现)
[3 可视化管理](#3 可视化管理)
[4 基础设施插件](#4 基础设施插件)
[五、Kubernetes 标签(Labels)](#五、Kubernetes 标签(Labels))
[1 资源选择](#1 资源选择)
[2 分类资源](#2 分类资源)
[3 批量管理](#3 批量管理)
[Kubernetes 官方推荐标签](#Kubernetes 官方推荐标签)
[六、标签选择器(Label Selector)](#六、标签选择器(Label Selector))
[1 等值选择](#1 等值选择)
[2 节点选择示例](#2 节点选择示例)
[3 集合选择](#3 集合选择)
Kubernetes 集群里面到底都有哪些组件?它们分别是干什么的?
一、Kubernetes 集群整体结构
一个 Kubernetes 集群主要由 两部分组成:
1️⃣ 控制平面(Control Plane)
2️⃣ 工作节点(Worker Node)
简单理解就是:
| 角色 | 作用 |
|---|---|
| 控制平面 | 负责管理整个集群 |
| 工作节点 | 负责运行真正的应用 |
每个 Kubernetes 集群 至少需要一个工作节点 ,因为 Pod(容器组)必须运行在节点上。
在生产环境中:
-
控制平面通常有 多台机器
-
节点也通常有 多台
这样做的目的是:
✔ 提高可靠性
✔ 提高可用性
✔ 防止单点故障
下面这张图展示了 Kubernetes 的整体结构:

可以看到:
-
左边是 控制平面
-
右边是 多个 Node
-
每个 Node 里面运行 Pod
二、控制平面组件
控制平面可以理解为:
Kubernetes 的大脑
它负责:
-
做决策
-
调度 Pod
-
管理整个集群
主要包含以下组件:
kube-apiserver
etcd
kube-scheduler
kube-controller-manager
cloud-controller-manager
下面我们一个一个来看。
1 kube-apiserver(API 服务器)
kube-apiserver 是 Kubernetes 的核心组件。
它的作用非常简单:
所有操作 Kubernetes 的请求,都会先到这里。
比如:
bash
kubectl create pod
kubectl delete service
kubectl get nodes
这些命令:
➡ 都会先发送到 kube-apiserver
然后再由 apiserver 去通知其他组件。
可以把它理解成:
Kubernetes 的统一入口。
特点:
-
提供 Kubernetes API
-
负责处理 REST 请求
-
支持水平扩展(可以部署多个实例)
2 etcd(集群数据库)
etcd 是 Kubernetes 的数据库。
它是一个:
高可用的键值存储系统
主要作用:
存储整个集群的所有状态数据
例如:
-
Node 信息
-
Pod 信息
-
Service 信息
-
ConfigMap
-
Secret
简单理解:
Kubernetes 的所有数据
全部存储在 etcd
如果 etcd 挂了:
⚠ 集群就会失去状态信息。
所以生产环境一定要:
✔ 做备份
✔ 做高可用部署
3 kube-scheduler(调度器)
kube-scheduler 的作用是:
给 Pod 选择运行在哪个 Node 上。
当一个 Pod 被创建时:
Pod -> 还没有 Node
调度器会根据多种条件选择合适节点:
比如:
-
CPU
-
内存
-
资源需求
-
亲和性
-
反亲和性
-
数据位置
-
节点限制
最终决定:
这个 Pod 应该运行在哪个 Node
4 kube-controller-manager(控制器管理器)
这个组件其实是一组 控制器的集合。
控制器的作用就是:
不断检查集群状态,并让实际状态接近期望状态
举个例子:
如果 Deployment 期望:
运行 3 个 Pod
但是现在只剩:
2 个 Pod
控制器就会:
自动创建新的 Pod
常见控制器包括:
Node Controller
负责:
监控节点状态
如果节点故障:
会做相应处理。
Job Controller
负责:
一次性任务
例如:
-
数据处理任务
-
批处理任务
它会创建 Pod 直到任务完成。
EndpointSlice Controller
负责:
维护 Service 与 Pod 的连接关系
简单理解:
就是维护 Service 的后端 Pod 列表。
ServiceAccount Controller
负责:
为 namespace 创建默认账户
这样 Pod 才能访问 API。
5 cloud-controller-manager(云控制器)
这是 云平台环境才会用到的组件。
它的作用:
让 Kubernetes 可以和云平台 API 交互
比如:
-
创建云负载均衡
-
管理云节点
-
管理云存储
常见云平台:
-
AWS
-
Azure
-
阿里云
-
腾讯云
如果你是在 本地学习 Kubernetes:
通常是 没有这个组件的。
三、节点组件(Node Components)
每个 Node 上都会运行一些组件。
主要有:
kubelet
kube-proxy
CRI(容器运行时)
它们的作用是:
负责运行 Pod,并维护节点环境。
1 kubelet(节点代理)
kubelet 是 每个节点上最重要的组件。
作用:
确保 Pod 正常运行
工作流程:
1️⃣ kubelet 从 API Server 获取 Pod 定义
2️⃣ 根据 PodSpec (Pod 的配置说明书)创建容器
3️⃣ 持续检查容器状态
如果容器挂了:
kubelet 会自动重启
注意:
kubelet 只管理 Kubernetes 创建的容器(不管理在节点上手动创建的容器)。
总结:
kubelet 是运行在每个 Kubernetes 节点(Node)上的代理程序,它的主要作用是根据 API Server 下发的 PodSpec(Pod 的配置说明)在本节点上创建并运行容器,同时持续监控 Pod 和容器的运行状态。如果容器出现异常,kubelet 会按照配置进行重启或恢复,并定期将节点和 Pod 的状态信息(如运行状态、资源使用情况等)汇报给 API Server,从而保证 Kubernetes 能够实时掌握整个集群中各个 Pod 的运行情况。
2 kube-proxy(网络代理)
kube-proxy 负责:
实现 Kubernetes Service 的网络功能
主要作用:
维护节点网络规则
这些规则可以实现:
-
Pod 和 Pod 通信
-
Pod 和 Service 通信
-
集群内外通信
实现方式:
通常通过:
iptables
或者:
IPVS
来实现网络转发。
另外需要注意:
有些网络插件(CNI)自己实现了代理功能。
这种情况下:
可以不运行 kube-proxy
3 容器运行时(CRI)
Kubernetes 本身 不会直接运行容器。
它是通过 容器运行时接口 CRI 来实现的。
CRI 的作用:
管理容器生命周期
例如:
-
创建容器
-
启动容器
-
删除容器
常见运行时:
containerd
CRI-O
以前常见的:
Docker
但现在 Kubernetes 已经不直接支持 Docker 了。
四、Kubernetes 插件
Kubernetes 还有很多插件,用来扩展功能。
常见插件包括:
网络插件
DNS
Dashboard
基础设施插件
1 网络插件
网络插件主要负责:
Pod 网络通信
常见插件有:
Calico
一个非常流行的网络插件。
特点:
-
支持网络策略
-
支持 BGP
-
支持高性能网络
总结:
网络插件负责为 Pod 分配 IP 地址并构建 Pod 网络,使不同节点上的 Pod 之间能够直接通信;而 kube-proxy 主要负责 Service 的网络代理功能,通过 iptables 或 IPVS 规则将访问 Service 的请求转发到后端 Pod,从而实现服务访问和负载均衡。
Flannel
比较简单的网络插件。
特点:
-
使用覆盖网络
-
部署简单
-
适合学习环境
Gateway API
用于:
管理 Kubernetes 网络入口
提供更灵活的:
-
路由
-
流量管理
2 服务发现
Kubernetes 内部需要 DNS。
最常见的就是:
CoreDNS
它可以实现:
Pod 通过 Service 名字访问服务
例如:
mysql.default.svc.cluster.local
3 可视化管理
Kubernetes 还提供一个 Web 界面:
Dashboard
它可以用来:
-
查看 Pod
-
查看 Node
-
管理资源
-
排查问题
对于新手来说非常友好。
4 基础设施插件
例如:
KubeVirt
这是一个比较特殊的插件。
它可以让 Kubernetes:
运行虚拟机
而不是只运行容器。
这样 Kubernetes 就能管理:
容器 + 虚拟机
五、Kubernetes 标签(Labels)
标签是 Kubernetes 非常重要的概念。
简单来说:
标签就是给资源打标记。
例如:
app: nginx
env: production
version: v1.0
这些标签可以添加到:
-
Pod
-
Node
-
Service
-
Deployment
等资源上。
标签的作用
标签主要有三个用途:
1 资源选择
例如:
Service 可以通过标签选择 Pod:
selector:
app: nginx
这样流量就会转发到这些 Pod。
2 分类资源
例如:
区分不同环境:
env: dev
env: prod
3 批量管理
例如:
删除某个版本的 Pod:
version=v1.0
常见标签示例
例如:
version: v1.1
release: stable
env: dev
app: myapp
标签格式规则
标签是:
key=value
例如:
app.kubernetes.io/component=database
标签 Key 分为两部分:
prefix/name
例如:
prefix 通常是:
DNS 子域名
例如:
Kubernetes 官方推荐标签
例如:
| 标签 | 作用 |
|---|---|
| app.kubernetes.io/name | 应用名称 |
| app.kubernetes.io/instance | 应用实例 |
| app.kubernetes.io/version | 应用版本 |
| app.kubernetes.io/component | 组件 |
| app.kubernetes.io/part-of | 所属系统 |
| app.kubernetes.io/managed-by | 管理工具 |
六、标签选择器(Label Selector)
标签选择器可以:
筛选一组资源
Kubernetes 支持两种方式:
1 等值选择
2 集合选择
1 等值选择
例如:
environment=production
Pod 示例:
bash
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
2 节点选择示例
例如:
nodeSelector:
accelerator: nvidia-tesla-p100
Pod 就会调度到:
带 GPU 的节点
3 集合选择
支持操作符:
in
notin
exists
示例:
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
含义:
| 表达式 | 含义 |
|---|---|
| environment in (production,qa) | 选择 production 或 qa |
| tier notin | 排除某些值 |
| partition | 只要存在这个标签 |
| !partition | 不存在该标签 |
也可以组合使用:
partition in (customerA, customerB), environment != qa
总结
Kubernetes 的核心可以总结为三层:
控制平面
节点组件
插件系统
整体工作流程可以简单理解为:
用户 -> API Server
-> Scheduler
-> Node
-> kubelet 创建 Pod
-> 容器运行时启动容器