文章目录
- [1. 前言](#1. 前言)
- [2. 名称与唯一标识](#2. 名称与唯一标识)
- [3. 标签:资源分组的核心标识](#3. 标签:资源分组的核心标识)
-
- [3.1 核心概念](#3.1 核心概念)
- [3.2 标准语法与字符规范](#3.2 标准语法与字符规范)
- [3.3 常用标签约定](#3.3 常用标签约定)
- [3.4 案例演示](#3.4 案例演示)
- [3.5 官方标准化推荐标签](#3.5 官方标准化推荐标签)
- [4. 标签选择器:基于标签筛选资源](#4. 标签选择器:基于标签筛选资源)
-
- [4.1 基于等值的选择器](#4.1 基于等值的选择器)
- [4.2 基于集合的选择器(更灵活)](#4.2 基于集合的选择器(更灵活))
- [4.3 核心资源的选择器配置](#4.3 核心资源的选择器配置)
- [5. 命名空间:资源硬隔离机制](#5. 命名空间:资源硬隔离机制)
-
- [5.1 核心概念](#5.1 核心概念)
- [5.2 四大初始默认命名空间](#5.2 四大初始默认命名空间)
- [5.3 案例演示](#5.3 案例演示)
-
- [1)YAML 创建自定义命名空间](#1)YAML 创建自定义命名空间)
- 2)资源指定归属命名空间
- 3)命令行操作
- [5.4 命名空间 DNS 机制](#5.4 命名空间 DNS 机制)
- [5.5 命名空间与标签的使用区别](#5.5 命名空间与标签的使用区别)
- [5.6 生产最佳实践](#5.6 生产最佳实践)
- [6. 字段选择器:基于资源的原生字段筛选](#6. 字段选择器:基于资源的原生字段筛选)
-
- [6.1 核心特性](#6.1 核心特性)
- [6.2 案例演示](#6.2 案例演示)
- [6.3 字段选择器 vs 标签选择器](#6.3 字段选择器 vs 标签选择器)
1. 前言
在 K8s 集群中,所有资源/对象(Pod、Deployment、Service 等)都附带元数据信息,这些元数据不直接参与业务运行,却是集群资源调度、筛选、隔离、生命周期管理的核心依据。
很多新手容易混淆标签与注解 、标签选择器与字段选择器 、命名空间隔离与标签分组的使用场景,本文将分层拆解所有核心知识点,结合实战案例厘清差异与用法。
2. 名称与唯一标识
Kubernetes 集群中每一个资源对象,都具备两类核心唯一标识:名称 (Name)与 唯一ID (UID)。二者作用维度不同,是区分、定位、管控集群所有资源的基础,也是理解资源重名、冲突、复用问题的核心前提。
定义名称示例:
yml
metadata:
name: nginx-demo
之前在 Kubernetes 系列【6】K8s 对象 中已经介绍过了。
3. 标签:资源分组的核心标识
3.1 核心概念
标签是附加到 K8s 资源(Pod、Deployment、Service 等)的键值对 ,核心作用是资源分组、筛选、归类 。标签仅用于用户与集群的资源识别,不具备系统核心语义,不会影响资源本身的运行逻辑。
标签支持在资源创建时定义,也可随时动态新增、修改,是实现集群资源灵活管理的基础。
核心特性:
- 单个资源可定义多个标签,同一资源的标签 Key 必须唯一
- 支持多维分组(环境、层级、版本、业务分区等)
- 查询、筛选、调度效率极高,适配命令行与可视化工具
- 仅用于资源识别筛选,非描述性信息建议用注解存储
3.2 标准语法与字符规范
标签键(Key)由可选前缀 + 名称 组成,以斜杠(/)分隔:
-
名称段(必填) :
≤63字符,首尾为字母数字,中间可包含 `- _ .` -
前缀(可选) :合法
DNS子域,总长≤253字符,系统组件必须带前缀 -
保留前缀:
kubernetes.io/、k8s.io/,仅K8s核心组件可使用
标签值(Value)规范:
-
≤63字符,可为空值 -
非空值必须首尾为字母数字,中间支持 `- _ .`
注:部分特殊资源会在通用规范基础上,增加专属名称约束,需以官方最新文档为准。
3.3 常用标签约定
官方推荐通用标签规范,适配多工具联动,避免自定义标签混乱:
| 标签键 | 作用描述 | 示例值 |
|---|---|---|
| environment | 部署环境 | dev、qa、production |
| tier | 服务层级 | frontend、backend、cache |
| release | 版本类型 | stable、canary |
| partition | 业务分区 | customerA、customerB |
| track | 更新周期 | daily、weekly |
3.4 案例演示
带标签的 Pod 完整 YAML :
yaml
apiVersion: v1
kind: Pod
metadata:
name: label-demo
# 自定义双标签
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
配套完整实操命令,可直接批量复制执行:
bash
# ==================== 标签完整实操命令(创建、查看、筛选、修改) ====================
# 1. 创建带标签的 Pod 资源
kubectl apply -f label-demo.yaml
# 2. 简易查看 Pod 及标签信息(列表展示)
kubectl get pods
# 3. 专属命令查看 Pod 标签
kubectl get pod label-demo --show-labels
# 自定义列精准展示指定标签
kubectl get pod label-demo -L environment,app
# 4. 标签选择器筛选匹配 Pod
# 单标签筛选
kubectl get pods -l app=nginx
# 多标签组合筛选
kubectl get pods -l environment=production,app=nginx
# 5. 查看 Pod 完整标签 YAML 配置
kubectl get pod label-demo -o yaml
# 6. 动态修改/新增标签(无需重建Pod)
# 给所有 app=nginx 的 Pod 批量新增 tier=fe 标签
kubectl label pods -l app=nginx tier=fe
# 精准查看新增标签效果
kubectl get pods -l app=nginx -L tier
通过以上命令可完整验证:自定义标签成功绑定至 Pod,且支持通过 K8s 原生命令查看、筛选资源,真正实现标签的资源分组管理能力。
3.5 官方标准化推荐标签
前面我们自定义的 environment、app、tier 标签虽然能用,但存在一个致命问题:团队自定义标签不统一、工具识别不了。
如果 A 团队用 app=nginx,B 团队用 name=nginx,监控、告警、Helm、K8s 可视化面板就无法统一聚合应用资源,会出现统计错乱、资源漏纳管、批量操作失效等生产问题。
为此 Kubernetes 官方推出了一套统一标准化标签体系 ,固定前缀为 app\.kubernetes\.io/。
核心目的 :全集群、全工具、全团队统一收口,让所有云原生工具都能自动识别、归类、展示应用资源。所有生产应用,禁止乱用自定义业务标签,优先使用官方标准标签。
下面逐一拆解每一个标准标签的真实含义与落地场景:
| 标准化标签键 | 核心含义 & 落地场景 | 生产示例 |
|---|---|---|
| app.kubernetes.io/name | 应用基础名称 ,代表业务服务本身,固定不变。用于区分不同业务,是所有标准标签的基础标识。 特点:一个业务服务永久固定一个 name,版本迭代、实例扩容都不会变。 | mysql、nginx、user-api、order-service |
| app.kubernetes.io/instance | 应用实例唯一标识 ,区分「同一个应用的多套部署」。 场景:同一集群部署多套环境、多套租户实例。例如开发环境、测试环境、生产环境部署同一个 mysql,靠 instance 区分实例。Helm 部署资源时会自动生成该标签。 | mysql-prod、mysql-dev、blog-qa、user-online |
| app.kubernetes.io/version | 当前应用版本号 ,用于灰度发布、版本溯源、故障回溯。 场景:灰度升级时,集群同时存在 v1、v2 版本 Pod,通过 version 标签精准区分、分流流量、分别监控。 | 5.7.21、v1.2.0、20260709-release |
| app.kubernetes.io/component | 架构组件类型 ,区分一个应用内部的不同角色组件。 场景:一个完整业务包含前端、后端、数据库、缓存,靠 component 归类组件角色,方便分别管控、监控、扩容。 | frontend、backend、database、cache、mq |
| app.kubernetes.io/part-of | 归属上层业务 ,用于微服务聚合归类。 场景:user-api、order-api、pay-api 都属于 mall 商城业务,通过 part-of 把零散微服务聚合为一个大业务系统,便于整体统计资源。 | mall、blog-system、iot-platform |
| app.kubernetes.io/managed-by | 资源管理工具标识 ,记录资源由谁部署管理。 场景:区分 Helm、Kustomize、手动 YAML、CI/CD 流水线部署的资源,方便运维统计、迁移、清理资源。 | Helm、kustomize、jenkins |
标准标签完整落地 YAML 案例:
yaml
apiVersion: v1
kind: Pod
metadata:
name: standard-label-demo
# 全套官方标准化标签
labels:
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx-prod
app.kubernetes.io/version: "1.14.2"
app.kubernetes.io/component: frontend
app.kubernetes.io/part-of: web-business
app.kubernetes.io/managed-by: manual
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
4. 标签选择器:基于标签筛选资源
标签不具备唯一性,大量资源会共用同一标签,标签选择器 是 K8s 核心分组过滤机制,用于精准筛选带指定标签的资源,Service、Deployment、ReplicaSet 等资源均依赖其关联后端 Pod。
核心规则 :多个筛选条件用逗号分隔,默认逻辑与(&&),无逻辑或(||)运算符。

4.1 基于等值的选择器
通过标签键值相等/不相等筛选,支持运算符:=、==、!=(=与==等价)。
常用示例:
bash
# 1. environment=production
# 作用:只筛选【生产环境】所有资源
kubectl get pods -l environment=production
# 2. tier!=frontend
# 作用:筛选【所有不是前端】的资源(后端/缓存/数据库)
kubectl get pods -l tier!=frontend
# 3. environment=production,tier!=frontend
# 作用:组合筛选【生产环境 且 非前端】精准过滤出生产后端服务
# 生产最常用:只操作生产中间件、后端服务,避开前端
kubectl get pods -l environment=production,tier!=frontend
除了筛选现有资源,标签选择器最核心的生产用途:节点定向调度 。比如,通过 nodeSelector 可以强制 Pod 只调度到「带指定标签的节点」,常用于 GPU 算力、磁盘、机型、机房分区等专属节点调度。
完整可落地案例:
bash
# ========== 完整使用流程:GPU节点定向调度(一步不落) ==========
# 第一步:【前置必备】给集群GPU节点打专属标签(替换为你的节点名称)
# 作用:标记这台节点是P100显卡算力节点,供Pod精准匹配调度
kubectl label node k8s-node01 accelerator=nvidia-tesla-p100
# 第二步:创建GPU算力Pod,强制调度到上述标签节点
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
# 核心:节点标签选择器,锁定调度节点
nodeSelector:
accelerator: nvidia-tesla-p100
containers:
- name: cuda-test
image: "registry.k8s.io/cuda-vector-add:v0.1"
# 申请GPU硬件资源,必须搭配GPU节点使用
resources:
limits:
nvidia.com/gpu: 1
EOF
# 第三步:验证Pod调度节点是否生效
kubectl get pod cuda-test -o wide
# 第四步:验证GPU是否正常识别(进入容器测试)
kubectl exec -it cuda-test -- nvidia-smi
4.2 基于集合的选择器(更灵活)
支持多值匹配、键存在性判断,是等值选择算符的超集,适配复杂筛选场景。支持运算符:in、notin、exists、!exists。
常用示例:
bash
# 1. environment in (production, qa)
# 作用:筛选【环境是生产 或 QA】的资源(多值匹配、或逻辑)
kubectl get pods -l 'environment in (production, qa)'
# 2. tier notin (frontend, backend)
# 作用:筛选【层级不是前端、也不是后端】的资源(排除多值)
kubectl get pods -l 'tier notin (frontend, backend)'
# 3. partition
# 作用:exists 语法,筛选【存在 partition 标签】的所有资源,不看标签值
kubectl get pods -l partition
# 4. !partition
# 作用:!exists 语法,筛选【没有 partition 标签】的资源
kubectl get pods -l '!partition'
# 5. 组合复杂筛选:存在partition标签 + 环境不属于qa
# 生产场景:过滤固定分区、非测试环境的正式业务资源
kubectl get pods -l 'partition,environment notin (qa)'
4.3 核心资源的选择器配置
很多新手最大误区:以为所有 K8s 资源的选择器语法都一样。
实际生产严格分为两类:
-
简单资源 (
Service、ReplicationController):只支持matchLabels等值匹配(只能用=精准匹配) -
高级控制器资源 (
Deployment、RS、DaemonSet、Job):支持 matchLabels + matchExpressions 混合匹配 (等值 + 集合in/notin/exists复杂筛选)
核心原因 :Service 是面向四层/七层网关,只需要精准固定后端;Deployment 是面向灰度、分批、多版本管理,需要复杂筛选能力。
1)简单资源(Service、RC):仅支持等值匹配
语法限制 :不支持 in、notin、exists,只能写固定键值对等值匹配。
逻辑:所有标签必须同时满足(逻辑与) ,只要 Pod 标签不完全一致,就不会被关联。
完整可直接运行案例:
yaml
# Service 只能用 matchLabels 精准匹配
apiVersion: v1
kind: Service
metadata:
name: redis-svc
spec:
selector:
component: redis
environment: production
ports:
- port: 6379
targetPort: 6379
只有同时满足以下两个条件的 Pod 才会被该 Service 纳入后端:
-
标签
component=redis -
标签
environment=production
只要缺一个、或者值不对,直接剔除,不会容错、不会模糊匹配。
2)高级资源(Deployment、RS、DaemonSet、Job):支持混合匹配
能力:同时支持「精准固定标签 + 复杂集合筛选」,生产灰度、多环境混布必备。
整体逻辑 :matchLabels && matchExpressions 同时成立
两个字段的作用分工:
-
matchLabels:基础固定匹配(必须满足) -
matchExpressions:复杂集合条件(in/notin/exists/!exists)
完整生产可复用案例:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-demo
spec:
replicas: 2
# 高级组合选择器
selector:
# 第一层:基础精准匹配(硬性必须满足)
matchLabels:
component: redis
# 第二层:复杂集合筛选(灵活多条件)
matchExpressions:
# 条件1:tier 标签值必须是 cache 或 backend
- key: tier
operator: In
values: ["cache", "backend"]
# 条件2:环境不能是开发环境
- key: environment
operator: NotIn
values: ["dev"]
# 条件3:必须带有 partition 标签(不关心值)
- key: partition
operator: Exists
template:
metadata:
labels:
component: redis
tier: cache
environment: production
partition: web
spec:
containers:
- name: redis
image: redis:6-alpine
这个 Deployment 只会管理同时满足所有条件 的 Pod:
- 必须拥有
component=redis(matchLabels硬性兜底) tier只能是cache/backend二选一environment绝对不能是dev- 必须存在
partition标签(有无即可,不限值)
5. 命名空间:资源硬隔离机制
5.1 核心概念
命名空间是 K8s 提供的资源硬隔离机制,将同一集群资源划分为多个独立分组,实现多团队、多项目、多环境的资源隔离与配额管控,是集群资源分层治理的核心基础。

1. 资源层面限制(强隔离)
-
同名资源互不冲突 :同命名空间同类型资源名称唯一,跨命名空间可以完全重名(
dev/prod可同时存在nginx服务)。 -
不可嵌套:命名空间只能平铺,不支持父子嵌套层级。
-
隔离范围有限 :仅隔离「命名空间级资源」(
Pod/Deployment/Service/ConfigMap);集群级资源全局共享无隔离 (Node、PV、StorageClass、CRD、RBAC` 集群权限),所有命名空间共用。
2. 网络访问限制(默认互通、无隔离)
-
默认跨命名空间可以直接互通 !命名空间只隔离资源对象,不隔离网络。
-
default空间的Pod可以直接访问dev/prod空间的Service,默认无任何拦截。 -
想要网络隔离必须手动配置
NetworkPolicy,否则多空间只是"逻辑分组",并非安全隔离。
3. 权限与配额限制
-
默认集群管理员权限可操作所有命名空间资源。
-
需配合
RBAC做权限隔离、ResourceQuota做资源总量限制、LimitRange做单资源配额,否则命名空间无任何资源上限约束。
5.2 四大初始默认命名空间
| 命名空间 | 作用说明 |
|---|---|
| default | 默认工作空间,未指定命名空间的资源默认归属此处,生产不建议使用 |
| kube-system | 存放K8s系统核心组件资源(kube-apiserver、kube-scheduler等) |
| kube-public | 公共可读空间,所有用户(含未认证)可读取,存放集群公共资源 |
| kube-node-lease | 存放节点租约对象,用于集群检测节点心跳与健康状态 |
5.3 案例演示
1)YAML 创建自定义命名空间
生产优先使用 YAML 文件管理命名空间,可配置标签、注解,方便版本管控与流水线部署。
yml
# namespace-dev.yaml:创建dev开发命名空间
apiVersion: v1
kind: Namespace
metadata:
# 命名空间名称,遵循RFC1123标签规范
name: dev
# 可自定义标签,用于分组筛选、权限管控
labels:
env: development
team: dev-group
annotations:
creator: ops-admin
create-time: 2026-07-11
bash
# 创建指定命名空间的Pod
kubectl apply -f pod-dev.yaml
# 【重点】必须加-n指定空间才能查到!
# 不指定-n 默认只查default空间,会出现资源找不到的假象
kubectl get pods -n dev
2)资源指定归属命名空间
在资源 yaml 的 metadata 中配置 namespace 字段,即可将资源固定部署到指定命名空间,不写则默认归属 default 空间。
yml
# pod-dev.yaml:部署Pod到dev命名空间
apiVersion: v1
kind: Pod
metadata:
name: ns-demo-pod
# 强制归属dev命名空间(必须提前创建)
namespace: dev
labels:
env: dev
app: demo
spec:
containers:
- name: nginx
image: nginx:1.14.2
3)命令行操作
bash
# 查看所有命名空间
kubectl get namespace
# 指定命名空间创建/查询资源
kubectl run nginx --image=nginx --namespace=dev
kubectl get pods --namespace=dev
# 设置默认命名空间(永久生效)
kubectl config set-context --current --namespace=dev
# 查看当前默认命名空间
kubectl config view --minify | grep namespace:
5.4 命名空间 DNS 机制
集群内 Service 会自动生成 DNS 域名:服务名.命名空间.svc.cluster.local
-
同命名空间:直接使用服务名访问
-
跨命名空间:必须使用完整
FQDN域名访问
5.5 命名空间与标签的使用区别
-
命名空间 :用于强隔离、资源配额管控,适合多团队、多环境隔离
-
标签 :用于灵活分组、资源筛选,同一命名空间内区分不同业务、版本资源
-
最佳实践:多环境用命名空间隔离,同环境多业务用标签分组
5.6 生产最佳实践
-
环境隔离用命名空间 :
dev/test/prod分空间隔离,杜绝环境互相干扰。 -
同环境业务分组用标签 :
prod空间内,用environment/tier/part`-of` 标签区分不同业务、组件,不滥用命名空间。 -
多团队弱隔离 :命名空间
+ RBAC +配额,限制各团队资源用量与操作权限。 -
多客户强隔离:独立集群/虚拟集群,不依赖命名空间做租户强隔离,规避共享控制面、节点干扰风险。
-
禁止业务资源部署 default 空间,统一自定义业务命名空间,方便资源规整与清理。
-
生产必配网络策略:关闭跨命名空间默认互通,实现最小网络访问权限。
命名空间擅长环境、项目维度的资源规整与逻辑隔离 ,不擅长安全、租户级强隔离;轻量隔离用命名空间,严格多租户用多层隔离方案或独立集群。
6. 字段选择器:基于资源的原生字段筛选
很多新手容易混淆:标签选择器筛的是「自定义标签」 ,而字段选择器筛的是资源「自带原生固定字段」(命名空间、状态、名称、重启策略等)。
字段选择器语法更简单、场景更固定,只支持等值/不等值判断 ,不支持 in/notin/exists 复杂集合运算,常用于快速过滤资源状态、归属空间等系统固有属性。下面全程配套可直接复制执行的实操命令,跑完即可看懂效果。
区别于标签选择器,字段选择器 是基于资源原生固定字段(名称、命名空间、运行状态等)筛选资源,而非自定义标签。

6.1 核心特性
-
支持运算符:
=、==、!=,无集合运算、无或逻辑 -
筛选对象:
K8s资源与生俱来的原生字段(metadata、spec、status下内置字段) -
多条件逗号分隔,默认逻辑与(同时满足所有条件)
-
不支持自定义字段筛选,只能用官方预设的可筛字段
-
支持运算符:
=、==、!=,不支持 in/notin/exists 集合运算 -
所有资源通用字段:
metadata.name、metadata.namespace -
不同资源拥有专属可筛选字段(
Pod状态、Service类型等) -
多条件逗号分隔,逻辑与匹配
6.2 案例演示
bash
# 1. 筛选【所有处于运行中】的Pod(核心常用)
# 匹配原生字段:status.phase = Running
kubectl get pods --field-selector status.phase=Running
# 2. 筛选【非默认命名空间】的所有Service
# 匹配原生字段:metadata.namespace != default
kubectl get svc --all-namespaces --field-selector metadata.namespace!=default
# 3. 多条件组合筛选:非运行中 + 重启策略为Always的Pod
# 同时满足:状态非Running && 重启策略=Always
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
# 4. 精准筛选指定名称的资源(精准定位单资源)
kubectl get pod running-pod --field-selector metadata.name=running-pod
bash
# 筛选所有运行中的Pod
kubectl get pods --field-selector status.phase=Running
# 筛选非default命名空间的Service
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
# 筛选非运行中、重启策略为Always的Pod
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
6.3 字段选择器 vs 标签选择器
| 对比项 | 标签选择器 | 字段选择器 |
|---|---|---|
| 筛选依据 | 用户自定义标签 | 资源原生内置字段 |
| 运算符能力 | 等值 + 集合(in/notin/exists) | 仅等值/不等值 |
| 灵活度 | 极高,可自由分组业务 | 固定,只能筛系统固有属性 |
| 典型场景 | 业务分组、灰度筛选、服务关联 | 状态过滤、空间过滤、资源巡检 |