标签和选择器

1. 标签(Labels)
标签是附着在 k8s 资源(Pod、Node、Service、Deployment 等)上的键值对,用于对资源进行标识和分类,本身不具备任何语义,仅用于筛选和分组。
特点:
- 键值对形式:key=value,键名需符合规范(如不能超过 63 个字符,只能包含字母、数字、-、_、.,且不能以 kubernetes.io/ 开头)。
- 可动态添加 / 修改:无需重启资源即可更新标签。
- 多标签:一个资源可绑定多个标签(如 app=nginx,env=prod,region=cn-north)。
2. 选择器(Selectors)
选择器是筛选标签的规则,k8s 通过选择器找到匹配标签的资源,是实现资源关联、调度控制的核心手段。
类型:
- 等值选择器:精确匹配,支持 =/==(相等)、!=(不等)。
- 集合选择器:模糊匹配,支持 in(在集合内)、notin(不在集合内)、exists(标签存在)。
二、核心使用场景与实操案例
场景 1:给资源打标签(以 Node 和 Pod 为例)
1. 给 Node 打标签(用于 Pod 调度到指定节点)
# 查看集群所有 Node
kubectl get nodes
# 给指定 Node 打标签:key=env, value=prod
kubectl label nodes <node-name> env=prod
# 覆盖已存在的标签(添加 --overwrite)
kubectl label nodes <node-name> env=test --overwrite
# 查看 Node 的标签
kubectl describe node <node-name> | grep Labels
2. 定义 Pod 时直接指定标签
# pod-with-labels.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels: # 给 Pod 打标签
app: nginx
env: test
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.24
执行创建:
kubectl apply -f pod-with-labels.yaml
场景 2:通过选择器筛选资源(核心调度 / 关联逻辑)
1. 基础筛选:kubectl 命令行用选择器查资源
# 等值选择器:查所有 env=test 的 Pod
kubectl get pods -l env=test
# 多条件:查 app=nginx 且 env=test 的 Pod
kubectl get pods -l app=nginx,env=test
# 集合选择器:查 env 为 test 或 prod 的 Pod
kubectl get pods -l 'env in (test,prod)'
# 查没有 env 标签的 Pod
kubectl get pods -l 'env notin (test,prod)'
2. 调度核心:NodeSelector(Pod 调度到指定标签的 Node)
通过 Pod 的 nodeSelector 字段,指定只调度到带有某标签的 Node 上,这是最基础的 k8s 调度策略。
# pod-node-selector.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-prod
labels:
app: nginx
env: prod
spec:
containers:
- name: nginx
image: nginx:1.24
nodeSelector: # 选择器:只调度到 env=prod 的 Node
env: prod
执行创建后,Pod 只会被调度到之前打了 env=prod 标签的 Node 上:
3. 资源关联:Service 通过选择器关联 Pod
Service 是 k8s 中暴露 Pod 网络的核心资源,它通过 selector 字段匹配 Pod 标签,实现对 Pod 的流量转发(即使 Pod 重建,IP 变化,Service 也能自动关联)。
# service-with-selector.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector: # 选择器:匹配 app=nginx 的所有 Pod
app: nginx
ports:
- port: 80
targetPort: 80
执行创建后,Service 会自动关联所有带有 app=nginx 标签的 Pod:
kubectl apply -f service-with-selector.yaml
# 查看 Service 关联的 Endpoints(即匹配的 Pod IP)
kubectl get endpoints nginx-service
4. 控制器关联:Deployment 通过选择器管理 Pod
Deployment 是管理 Pod 副本的控制器,它的 spec.selector 匹配 Pod 模板的标签,确保控制器能精准管理自己创建的 Pod。
# deployment-with-selector.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector: # 选择器:匹配 app=nginx 的 Pod
matchLabels:
app: nginx
template: # Pod 模板:创建的 Pod 带 app=nginx 标签
metadata:
labels:
app: nginx
env: test
spec:
containers:
- name: nginx
image: nginx:1.24
执行后,Deployment 会创建 3 个带 app=nginx 标签的 Pod,且能通过选择器监控、管理这些 Pod:
kubectl apply -f deployment-with-selector.yaml
# 查看 Deployment 管理的 Pod
kubectl get pods -l app=nginx
三、高级用法:集合选择器(更灵活的筛选)
当需要更复杂的筛选逻辑时,可使用集合选择器(主要用于资源定义中,如 Deployment、Service):
# 示例:Deployment 使用集合选择器
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-multi-env
spec:
replicas: 2
selector:
matchExpressions: # 集合选择器规则
- key: env
operator: In # 匹配 env 在 (test,prod) 中的 Pod
values: [test, prod]
- key: app
operator: Exists # 匹配带有 app 标签的 Pod(无论值是什么)
template:
metadata:
labels:
app: nginx
env: test
spec:
containers:
- name: nginx
image: nginx:1.24
总结
- 标签是 k8s 资源的 "标识",键值对形式,可动态修改,用于分类和筛选资源。
- 选择器是匹配标签的规则,分为等值(=/!=)和集合(in/notin/exists)两类,是调度、资源关联的核心。
- 核心应用:NodeSelector 实现 Pod 调度到指定 Node、Service 关联 Pod、Deployment 管理 Pod,都是通过标签 + 选择器实现。
标签和选择器是 k8s 调度的基础,掌握它们是理解后续高级调度策略(如 NodeAffinity、Taints/Tolerations)的前提。