Label(标签)是 Kubernetes 中用于标识和选择资源对象的核心机制,本质是附加到资源(如 Pod、Node、Service 等)上的键值对(Key-Value)。
一、核心概念与作用
1.概念
在Kubernetes(k8s)中,标签(Labels)和选择器(Selectors)是用于组织和筛选Pod以及其他Kubernetes资源的关键机制。通过使用标签和选择器,你可以轻松地管理和定位到特定的资源实例,这对于资源的调度、部署策略的制定以及服务的编排至关重要。
Label 以 key=value 形式标记资源,例如 env=prod、role=backend,用于表示资源的特性(如环境、版本、角色)
2.特点
-
一个资源可拥有多个 Label(如同时标记 env=prod 和 app=nginx)。
-
同一 Label 可被添加到多个资源上。
-
支持动态增删改,无需重建资源。
3.用途
-
资源分组:按维度(环境、版本、架构)对资源分类,便于批量操作。
-
精细调度:通过 Label Selector 选择特定资源(如将 Pod 调度到指定 Node)。
-
服务关联:Service 通过 Label 关联后端 Pod,实现流量路由。
二、基础命令
1.查看标签
# 查看所有 Pod 的 Label
kubectl get pods --show-labels
# 查看 Node 的 Label
kubectl get nodes --show-labels
# 按列显示特定 Label
# 显示 env 和 app 列:cite[1]:cite[3]
kubectl get pods -L env,app
2.添加标签
#给node节点添加标签
kubectl label nodes node-2 IngressProxy=true
#给pod添加标签方式一
kubectl label pods nginx-78c796f476-g6rn9 role=backend
#给pod添加标签方式二
[root@master231 pod]# cat 10-pods-labesl.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
# 给Pod资源添加标签
labels:
app: nginx
env: prod
spec:
containers:
- name: web
image: nginx:1.22.0
#给pod添加标签方式三
kubectl label -f 10-pods-labesl.yaml role=backend
3.修改标签
#需加 --overwrite 覆盖更新
kubectl label --overwrite pod nginx-78c796f476-g6rn9 role=pc
4.删除标签
kubectl label pod nginx-78c796f476-g6rn9 role-
可以看到role标签已经被删除
5.根据标签筛选资源
#筛选role=app的资源
kubectl get pods -l role=app
# 基于集合筛选(Set-based)
# 支持 in, notin, !=:cite[2]:cite[8]
kubectl get pods -l 'env in (prod, dev), tier!=backend'
可以看到只会查出对应标签的资源
三、Label Selector(选择器)
1.标签选择器类型
-
基于等值(Equality-based)的选择器:使用等式运算符进行精确匹配。
-
基于集合(Set-based)的选择器:支持更复杂的集合运算,比如in(值在集合中)、not in(值不在集合中)、exists(键存在,不关心值)。
2.Selector 在 K8s 对象中的应用
2.1 Service 关联 Pod
[root@master-1 ~]# cat service-nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
# 基于标签选择器关联Pod
selector:
app: nginx
env: test # 选择所有含 app=nginx且env=test标签的 Pod
# 配置端口映射
ports:
# 指定Service服务本身的端口号
- port: 8888
# 后端Pod提供服务的端口号
targetPort: 80
[root@master-1 ~]# kubectl apply -f service-nginx.yaml
#发现已经关联上pod啦
[root@master-1 ~]# kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-78c796f476-84768 1/1 Running 0 15s 10.244.1.3 node-2 <none> <none>
pod/nginx-78c796f476-gcvwg 1/1 Running 0 15s 10.244.1.2 node-2 <none> <none>
pod/nginx-78c796f476-zbb9b 1/1 Running 0 15s 10.244.0.3 node-1 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 7d3h <none>
service/nginx-service NodePort 10.0.0.83 <none> 8888:31957/TCP 6s app=nginx,env=test
[root@master-1 ~]# kubectl describe svc nginx-service
Name: nginx-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx,env=test
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.0.0.83
IPs: 10.0.0.83
Port: <unset> 8888/TCP
TargetPort: 80/TCP
NodePort: <unset> 31957/TCP
Endpoints: 10.244.0.3:80,10.244.1.2:80,10.244.1.3:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
2.2 Deployment 管理 Pod
[root@master-1 ~]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
#基于标签关联pod,会关联env=test或者env=prod的pod
selector:
matchExpressions:
- key: env
values:
- "test"
- "prod"
operator: In
template:
metadata:
#为pod设置了两个标签
labels:
app: nginx
env: test
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
[root@master-1 ~]# kubectl apply -f nginx.yaml
#operator: In
# 定义key和value之间的关系,有以下几种关系:
# In:
# key的值,在vlaues列表中任意其一即可。
# NotIn:
# key的值,不能在values列表中。
# Exists:
# 只有有key就行,value任意。如果是Exists,则不允许定义values字段。
# DoesNotExist:
# 不能包含指定的key。其他的key和value任意。如果是DoesNotExist,则不允许定义values字段。
可以看到使用deploy部署了三个pod
2.3 通过标签选择器Node 调度(NodeSelector)
将pod调度到指定标签的节点上
[root@master-1 ~]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
#基于标签关联pod,会关联env=test或者env=prod的pod
selector:
matchExpressions:
- key: env
values:
- "test"
- "prod"
operator: In
template:
metadata:
#为pod设置了两个标签
labels:
app: nginx
env: test
spec:
# 基于节点的标签进行调度,将Pod调度到包含key为type,value为ssd的节点上。
nodeSelector:
app: test
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
[root@master-1 ~]# kubectl apply -f nginx.yaml
发现结果将pod全部调度到含有app=test标签的node-2节点上了
四、总结
Label 是 Kubernetes 多维度资源管理的基石,通过 标识 + 选择器 实现:
-
资源分类(如按环境分组)
-
动态调度(如定向部署到 SSD 节点)
-
服务发现(如 Service 关联后端 Pod)
掌握 Label 的定义、操作及选择器使用,是高效管理 K8s 集群的关键技能。