Kubernetes 集群组件详解

目录

[一、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 网络插件)

Calico

Flannel

[Gateway API](#Gateway API)

[2 服务发现](#2 服务发现)

[3 可视化管理](#3 可视化管理)

[4 基础设施插件](#4 基础设施插件)

KubeVirt

[五、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

例如:

app.kubernetes.io/name

prefix 通常是:

DNS 子域名

例如:

app.kubernetes.io


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

-> 容器运行时启动容器

相关推荐
Hi202402172 小时前
AI编程助手Claude Code、Codex、OpenCode一站式Docker环境
docker·容器·ai编程
Keanu-2 小时前
【无标题】
docker·云原生
Benszen3 小时前
Kubernetes容器编排:从入门到精通
云原生·容器·kubernetes
⑩-3 小时前
服务注册与发现的原理?Nacos vs Eureka?
spring cloud·云原生·eureka
匀泪4 小时前
云原生(docker部署,使用,构建)
云原生·eureka
geek_Chen014 小时前
轻量级虚拟机--Docker使用手册
docker·容器
嘟嘟 嘟嘟嘟4 小时前
让AI帮我部署一套3节点K8S集群
云原生·容器·kubernetes
奋斗的蛋黄5 小时前
Docker 核心知识点
运维·docker·容器
Benszen6 小时前
K8S存储管理:从Volume到PV/PVC详解
云原生·容器·kubernetes