K8s学习笔记(八) K8s资源对象
在 Kubernetes(K8s)中,资源对象(Resource Object) 是集群的核心抽象,用于定义和描述集群的期望状态(Desired State),例如 “运行哪些应用”“应用需要多少资源”“如何访问应用” 等。K8s 的控制平面(如 kube-controller-manager、kube-scheduler)会持续监控这些资源对象,将集群的实际状态(Actual State) 调整为期望状态,这一过程称为 “调和(Reconciliation)”。
1 资源对象的核心属性
所有 K8s 资源对象都通过 YAML 或 JSON 格式定义,且包含以下 5 个核心字段(缺一不可),其余字段为各资源的特有配置:
字段名 | 作用说明 | 示例值 |
---|---|---|
apiVersion | 资源所属的 API 版本(不同资源有不同版本,如v1 、apps/v1 ) | apps/v1 (Deployment 所属版本) |
kind | 资源的类型(如 Pod、Deployment、Service) | Deployment |
metadata | 资源的元数据(唯一标识、标签、注释等) | name: nginx-deploy``labels: app: nginx |
spec | 资源的期望状态(核心配置,如 Pod 的容器镜像、资源限制、副本数等) | replicas: 3 (期望 3 个副本) |
status | 资源的实际状态(由 K8s 自动维护,用户不可手动修改,如当前副本数、运行状态) | readyReplicas: 3 (实际 3 个就绪副本) |
2 资源对象的分类(按功能)
K8s 资源对象数量众多,按核心功能可分为 6 大类,以下是每类中最常用、最核心的资源:
2.1 工作负载资源(Workload Resources)
用于定义应用的运行方式(副本数、生命周期、更新策略等),是部署应用的核心载体。
资源名称 | API 版本 | 作用范围 | 核心作用 | 关键特性 |
---|---|---|---|---|
Pod | v1 | 命名空间级 | 最小部署单元,包含 1 个或多个共享网络 / 存储的容器 | 生命周期短暂(重启 IP 变化);容器共享localhost 网络;需通过控制器管理 |
ReplicationController(RC) | v1 | 命名空间级 | 早期副本控制器,确保指定数量的 Pod 运行(已被 ReplicaSet 替代) | 仅支持等值标签选择器;无回滚能力;逐步被淘汰 |
ReplicaSet(RS) | apps/v1 | 命名空间级 | RC 的升级版,支持集合标签选择器,管理 Pod 副本 | 标签选择器更灵活(如app in (nginx, apache) );通常被 Deployment 间接管理 |
Deployment | apps/v1 | 命名空间级 | 无状态应用控制器,基于 RS 实现,支持滚动更新、回滚、扩缩容 | 自动维护 RS 和 Pod;支持更新策略(maxSurge /maxUnavailable );生产首选 |
StatefulSet | apps/v1 | 命名空间级 | 有状态应用控制器,为 Pod 提供固定标识(名称、网络、存储) | Pod 名称固定(如web-0 );存储与 Pod 绑定;支持有序启停 / 更新;适合数据库集群 |
DaemonSet | apps/v1 | 命名空间级 | 确保所有(或指定)Node 运行 1 个 Pod 副本 | 新 Node 加入时自动部署;适合节点级服务(日志收集、监控代理) |
Job | batch/v1 | 命名空间级 | 一次性任务控制器,确保 Pod 成功完成(退出码 0)后终止 | 支持重试失败 Pod;可设置并行数(parallelism )和完成数(completions ) |
CronJob | batch/v1 | 命名空间级 | 定时任务控制器,基于 Cron 表达式周期性触发 Job | 支持时区设置;历史任务保留策略;可暂停任务(suspend: true ) |
HorizontalPodAutoscaler(HPA) | autoscaling/v2 | 命名空间级 | 基于指标自动扩缩容 Pod 副本数(关联 Deployment/StatefulSet/RS) | 支持 CPU / 内存、自定义指标(如 QPS);可设置最小 / 最大副本数 |
2.2 服务发现与网络资源(Service Discovery & Networking)
用于暴露应用访问入口、管理网络规则,解决 Pod 动态 IP 的访问问题。
资源名称 | API 版本 | 作用范围 | 核心作用 | 关键特性 |
---|---|---|---|---|
Service(SVC) | v1 | 命名空间级 | 为一组 Pod 提供固定访问 IP 和端口,实现内部负载均衡 | 类型:ClusterIP (集群内)、NodePort (节点端口)、LoadBalancer (云负载均衡);通过标签选择器关联 Pod |
EndpointSlice | discovery.k8s.io/v1 | 命名空间级 | 存储 Service 关联的 Pod 网络端点(IP + 端口),替代传统 Endpoint | 支持 IPv4/IPv6 双栈;自动分片,提升大规模集群性能;Service 默认依赖此资源 |
Endpoint | v1 | 命名空间级 | 早期存储 Service 端点的资源(被 EndpointSlice 替代,仅兼容旧版本) | 直接存储 Pod 的 IP 和端口;无分片机制,大规模集群性能差 |
Ingress | networking.k8s.io/v1 | 命名空间级 | 管理外部 HTTP/HTTPS 流量入口,通过域名 / 路径转发到 Service | 需 Ingress Controller(如 Nginx)生效;支持 SSL 证书、路径重写、限流 |
IngressClass | networking.k8s.io/v1 | 集群级 | 定义 Ingress 使用的控制器类型(如区分不同 Nginx 实例) | 每个 Ingress 需关联一个 IngressClass;避免不同控制器冲突 |
NetworkPolicy | networking.k8s.io/v1 | 命名空间级 | 定义 Pod 间的网络访问规则(允许 / 拒绝通信) | 需网络插件支持(如 Calico);控制入站(ingress )和出站(egress )流量 |
Gateway | gateway.networking.k8s.io/v1 | 命名空间级 / 集群级 | 定义网络网关(如负载均衡器、API 网关),作为流量入口的抽象 | 标准化网关配置;支持 TCP/UDP/HTTP;与 Ingress 互补,更灵活 |
ServiceExport | multicluster.x-k8s.io/v1alpha1 | 命名空间级 | 跨集群服务导出(多集群场景) | 将本地 Service 暴露到其他集群;需配合 ServiceImport 使用 |
ServiceImport | multicluster.x-k8s.io/v1alpha1 | 命名空间级 | 跨集群服务导入(多集群场景) | 引用其他集群导出的 Service;实现跨集群服务发现 |
2.3 配置与存储资源(Configuration & Storage)
用于管理应用配置、敏感信息和数据持久化,实现配置与代码分离。
资源名称 | API 版本 | 作用范围 | 核心作用 | 关键特性 |
---|---|---|---|---|
ConfigMap(CM) | v1 | 命名空间级 | 存储非敏感配置数据(环境变量、配置文件) | 键值对存储;可通过环境变量或文件挂载到 Pod;修改后需重启 Pod 生效(除非热加载) |
Secret | v1 | 命名空间级 | 存储敏感数据(密码、证书),数据经 Base64 编码(非加密) | 类型:Opaque (通用)、docker-registry (镜像仓库凭证)、tls (证书);需配合外部工具(如 Vault)加密 |
PersistentVolume(PV) | v1 | 集群级 | 集群级持久化存储资源,抽象底层存储(云盘、NFS 等) | 生命周期独立于 Pod;支持访问模式(ReadWriteOnce /ReadOnlyMany 等);容量固定 |
PersistentVolumeClaim(PVC) | v1 | 命名空间级 | Pod 对存储的请求声明,向 PV 申请存储 | 与 PV 通过 StorageClass 或属性匹配;Pod 通过 PVC 挂载存储,无需关心底层细节 |
StorageClass(SC) | storage.k8s.io/v1 | 集群级 | 动态创建 PV 的模板,避免手动创建 PV | 关联存储插件(provisioner );支持设置存储性能(如 SSD);可定义回收策略 |
VolumeSnapshot | snapshot.storage.k8s.io/v1 | 命名空间级 | 存储卷快照(基于 PVC 创建) | 需存储插件支持;用于数据备份 / 恢复;可基于快照创建新 PVC |
VolumeSnapshotClass | snapshot.storage.k8s.io/v1 | 集群级 | 定义 VolumeSnapshot 的创建规则(如快照保留策略) | 关联快照插件(snapshotter );类似 StorageClass 的快照版本 |
CSI Driver | storage.k8s.io/v1 | 集群级 | 注册容器存储接口(CSI)驱动,扩展 K8s 存储能力 | 允许第三方存储集成(如 Ceph、GlusterFS);替代传统 in-tree 存储插件 |
2.4 集群管理资源(Cluster Management)
用于管理集群节点、命名空间、资源配额等集群级配置。
资源名称 | API 版本 | 作用范围 | 核心作用 | 关键特性 |
---|---|---|---|---|
Node | v1 | 集群级 | 描述集群中的工作节点(物理机 / 虚拟机),记录资源和状态 | 状态:Ready /NotReady ;可标记污点(taints )和容忍(tolerations );支持标签分组 |
Namespace(NS) | v1 | 集群级 | 实现资源隔离(如开发 / 测试 / 生产环境) | 默认 NS:default 、kube-system 、kube-public ;NS 内资源名称唯一 |
ResourceQuota(RQ) | v1 | 命名空间级 | 限制命名空间内的资源使用总量(如 CPU、内存、Pod 数量) | 防止单个 NS 过度占用资源;支持硬限制(hard )和范围限制 |
LimitRange(LR) | v1 | 命名空间级 | 为命名空间内的 Pod / 容器设置默认资源限制(CPU / 内存)和请求(requests) | 避免 Pod 无限制使用资源;可设置最小 / 最大资源值、默认请求 / 限制 |
PodDisruptionBudget(PDB) | policy/v1 | 命名空间级 | 确保 Pod 在自愿中断(如节点升级)时的最小可用副本数 | 避免因维护操作导致服务不可用;支持minAvailable (最小可用)或maxUnavailable (最大不可用) |
RuntimeClass | node.k8s.io/v1 | 集群级 | 定义容器运行时(如 containerd、CRI-O)的配置,为 Pod 指定运行时 | 支持不同 Pod 使用不同运行时;可配置隔离级别(如虚拟机级隔离) |
Lease | coordination.k8s.io/v1 | 命名空间级 | 用于领导者选举(如控制器选举主节点)和心跳检测 | 轻量级资源;通过 TTL 机制自动过期;kubelet 与 apiserver 的心跳依赖此资源 |
2.5 安全资源(Security)
用于控制访问权限、证书管理、安全上下文等,保障集群安全。
资源名称 | API 版本 | 作用范围 | 核心作用 | 关键特性 |
---|---|---|---|---|
ServiceAccount(SA) | v1 | 命名空间级 | 为 Pod 提供访问 K8s API 的身份凭证(替代用户账户) | 默认 Pod 使用default SA;通过 RoleBinding 授权;自动挂载token 到 Pod |
Role | rbac.authorization.k8s.io/v1 | 命名空间级 | 定义命名空间内的权限(如允许查看 Pod、创建 Deployment) | 权限基于 API 资源(如pods 、deployments )和操作(get 、create ) |
ClusterRole | rbac.authorization.k8s.io/v1 | 集群级 | 定义集群级权限(如查看 Node、管理 Namespace) | 作用于整个集群;可被 RoleBinding 引用到特定 NS |
RoleBinding | rbac.authorization.k8s.io/v1 | 命名空间级 | 将 Role/ClusterRole 绑定到主体(用户、SA、组) | 仅在当前 NS 内生效;绑定 ClusterRole 时,权限范围限定在 NS 内 |
ClusterRoleBinding | rbac.authorization.k8s.io/v1 | 集群级 | 将 ClusterRole 绑定到主体,授予集群级权限 | 作用于整个集群;适合管理员权限配置 |
SecretProviderClass | secrets-store.csi.x-k8s.io/v1 | 集群级 | 从外部密钥管理系统(如 Vault、AWS Secrets Manager)挂载密钥到 Pod | 需 CSI 驱动支持;自动同步外部密钥更新 |
CertificateSigningRequest(CSR) | certificates.k8s.io/v1 | 集群级 | 申请 K8s 集群签名的证书(如节点证书、SA 证书) | 需管理员审批(approve );用于加密通信(如 etcd TLS、API Server 证书) |
PodSecurityContext | 嵌入 Pod.spec 中 | 命名空间级 | 定义 Pod 的安全上下文(如运行用户、SELinux 标签、特权模式) | 控制容器权限;可限制root 用户运行;设置readOnlyRootFilesystem 增强安全 |
PodSecurityPolicy(PSP) | 已废弃(被 PodSecurityContext 替代) | - | 早期控制 Pod 安全的资源,已在 v1.25 移除,功能合并到 SecurityContext | 不再推荐使用,改用 Namespace 的 PodSecurity 标准 |
2.6 元数据与扩展资源(Metadata & Extensions)
用于资源标记、自定义资源扩展、事件记录等辅助功能。
资源名称 | API 版本 | 作用范围 | 核心作用 | 关键特性 |
---|---|---|---|---|
Label | 嵌入 metadata 中 | 所有资源 | 键值对标签,用于资源筛选和关联(如 Service 通过 Label 选择 Pod) | 可动态修改;支持多标签组合筛选(app=nginx,env=prod ) |
Annotation | 嵌入 metadata 中 | 所有资源 | 键值对注释,存储非筛选用的附加信息(如构建时间、作者) | 不用于资源选择;内容可包含 JSON 等复杂结构;无大小限制(建议精简) |
Event | v1 | 命名空间级 | 记录集群事件(如 Pod 创建、节点故障),用于排障 | 由组件自动生成;包含类型(Normal /Warning )、原因、涉及资源 |
CustomResourceDefinition(CRD) | apiextensions.k8s.io/v1 | 集群级 | 扩展 K8s API,定义自定义资源(如MyApp 、Database ) | 允许用户创建自定义资源类型;配合 Operator 实现复杂应用管理 |
CustomResource(CR) | 基于 CRD 定义 | 命名空间级 / 集群级 | CRD 实例,即用户创建的自定义资源对象 | 结构由 CRD 定义;可通过 kubectl 操作,与内置资源类似 |
PriorityClass | scheduling.k8s.io/v1 | 集群级 | 定义 Pod 的优先级,影响调度和驱逐顺序 | 优先级高的 Pod 优先调度;资源不足时,低优先级 Pod 先被驱逐 |
PodTemplate | v1 | 命名空间级 | Pod 模板,被 Deployment、StatefulSet 等控制器引用,避免重复配置 | 控制器通过模板创建 Pod;修改模板会触发控制器更新 Pod |
3 资源对象的核心设计理念
- 声明式 API:所有资源通过 YAML/JSON 定义 “期望状态”,K8s 控制平面自动调和实际状态与期望状态(无需手动编写操作步骤)。
- 标签与选择器:通过
Label
和selector
实现资源关联(如 Service 关联 Pod、Deployment 管理 RS),是 K8s 灵活调度和管理的核心。 - 命名空间隔离:大部分资源属于命名空间级,通过 Namespace 实现多环境 / 多团队的资源隔离;集群级资源(如 Node、CRD)作用于整个集群。
- 扩展能力:通过 CRD 允许用户自定义资源,结合 Operator 模式可将复杂应用(如数据库集群)封装为 K8s 原生资源管理。