Kubernetes 从入门到精通-label标签

       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 集群的关键技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liux3528

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值