周濡霈 发表于 2025-6-3 10:36:20

K8s新手系列之Label标签和Label选择器

概述

官网:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/
在K8s中,Label(标签) 是用于标识和组织集群资源(如Pod、Service、Deployment、Node等)的核心机制,其主要作用就是在各种资源上添加表示,用来对它们进行区分和选择。
Label的特点


[*]一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
[*]一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
[*]Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
Label的定义规则

Key的定义规则


[*]kubernetes.io/ 和 k8s.io/ 前缀是为 Kubernetes 核心组件保留的。
[*]格式:[前缀/]名称
[*]前缀(可选):DNS子域格式(如 k8s.example.com/),不超过253字符。
[*]名称:不超过63字符,允许字母、数字、-、_、.,且需以字母或数字开头和结尾
Value的定义规则


[*]必须为 63 个字符或更少(可以为空)
[*]除非标签值为空,必须以字母数字字符()开头和结尾
[*]包含破折号(-)、下划线(_)、点(.)和字母或数字
Label的操作

给资源添加Label

方式一:在资源清单中指定

可以在资源文件中的metadata.labels中指定标签。以定义Pod为例:
# 创建Pod
# cat pod-label.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-label
# 添加label标签,标签以key: value的形式定义
labels:
    app: nginx
spec:
containers:
- name: nginx-container
    image: nginx
# kubectl apply -f pod-label.yaml
pod/pod-label created

# 验证是否定义成功
# kubectl get pod pod-label --show-labels
NAME      READY   STATUS    RESTARTS   AGE   LABELS
pod-label   1/1   Running   0          49s   app=nginx方式二:直接在已存在的资源上添加Label

语法:
kubectl label pods <pod-name> <labelKey=value>示例:在上述创建Pod中添加一个新的label
# 添加label
# kubectl label pods pod-label env=dev
pod/pod-label labeled
# 验证是否添加成功
# kubectl get pod pod-label --show-labels
NAME      READY   STATUS    RESTARTS   AGE   LABELS
pod-label   1/1   Running   0          4m10s   app=nginx,env=dev修改资源中指定的LabelValue

Label的Key无法进行修改,只能进行删除,或者添加一个新的Key,将原来的Key进行删除,形成修改的假象,这里我们主要讲解修改Label的Value
语法:
kubectl label pods <pod-name> <labelKey=value> --overwrite示例:将上述Pod的env的value修改为prod
# 修改Label
# kubectl label pods pod-label env=prod --overwrite
pod/pod-label labeled
# 验证是否修改成功
# kubectl get pod pod-label --show-labels
NAME      READY   STATUS    RESTARTS   AGE   LABELS
pod-label   1/1   Running   0          12m   app=nginx,env=prod查看资源中的Label

示例:
# 查看指定资源的Label
# kubectl get pod --show-labels
NAME                READY   STATUS    RESTARTS   AGE   LABELS
pod-label         1/1   Running   0          13m   app=nginx,env=prod
static-web-node02   1/1   Running   0          18m   role=myrole

# 查看指定资源的Label列
# kubectl get pod -L env,app
NAME                READY   STATUS    RESTARTS   AGE   ENV    APP
pod-label         1/1   Running   0          13m   prod   nginx
static-web-node02   1/1   Running   0          18m删除资源中的Label

语法:
# 注意,labelKey后有一个"-"减号kubectl label pods <pod-name> <labelKey=value>-示例:删除上述Pod中的env的label
# 删除Label
# kubectl label pod pod-label env-
pod/pod-label unlabeled

# 验证是否删除成功
# kubectl get pod pod-label --show-labels
NAME      READY   STATUS    RESTARTS   AGE   LABELS
pod-label   1/1   Running   0          18m   app=nginxLabel选择器

官网文档:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/#label-selectors
在Kubernetes中,Label选择器(Label Selector) 是用于根据标签(Label)筛选和操作资源的核心机制。
Kubernetes中支持两种类型的Label选择器
等式选择器

通过精确匹配标签的键和值来筛选资源,支持以下操作符:

[*]=或者==:匹配key等于指定value的资源
# 选择所有包含 `env=prod` 标签的Pod
kubectl get pods -l env=prod

[*]!=:匹配键值不等于指定值的资源
# 选择所有不包含 `tier=frontend` 标签的Pod
kubectl get pods -l tier!=frontend集合选择器

通过集合操作符(如 in、notin、exists)灵活筛选资源,支持更复杂的条件。

[*]in:指定key的value在指定的集合中
# 选择 `env` 是 `prod` 或 `staging` 的Pod
kubectl get pods -l "env in (prod, staging)"

[*]notin: key的value不在指定集合中
kubectl get pods -l "env notin (frontend, backend)"

[*]exists:key必须存在(不关心value)
# 选择存在env这个key的Pod
kubectl get pods -l "env,app"

[*]doesnotexist:key必须不存在
# 选择不包含 `tier`、`test` 标签的Pod,
# 注意!!!这里需要使用单引号,使用双引号可能导致bash不解析
kubectl get pods -l '!tier,!test'通过Label操作K8s的资源

通过Label查看指定的资源

语法:
kubectl get <resource-type> -l <label-operation> -n <namespace>示例:
# 查看label为app=nginx的Pod
# kubectl get pod -l "app=nginx"
NAME      READY   STATUS    RESTARTS   AGE
pod-label   1/1   Running   0          37m

# 查看calico-system名称空间下指定的Label存在的Pod
# kubectl get po -l "app.kubernetes.io/name" -n calico-system
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-585c6db9c7-9wm4p   1/1   Running   1 (6d22h ago)   6d23h
calico-node-64sq8                        1/1   Running   0               22h
calico-node-kgkmk                        1/1   Running   0               22h
calico-node-vn47d                        1/1   Running   0               22h
calico-typha-666d79c78b-65szp            1/1   Running   1 (6d22h ago)   6d23h
calico-typha-666d79c78b-n9mjq            1/1   Running   1 (6d22h ago)   6d23h
csi-node-driver-92w48                      2/2   Running   4 (6d22h ago)   6d23h
csi-node-driver-96tfv                      2/2   Running   2 (6d22h ago)   6d23h
csi-node-driver-wbf7v                      2/2   Running   2 (6d22h ago)   6d23h通过Label删除资源

语法:
kubectl delete <resource-type> -l <label> -n <namespace>示例:
# 通过label删除Pod
# kubectl delete po -l "app=nginx"
pod "pod-label" deleted

# 验证是否删除成功
# kubectl get po pod-label
Error from server (NotFound): pods "pod-label" not found资源文件中使用选择器

示例:Deployment中使用

在Deployment中,spec.selector 用于选择目标Pod。常用 matchLabels 或 matchExpressions:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
    matchLabels:
      app: nginx   # 精确匹配标签 app=nginx
    matchExpressions:# 集合选择器(可选)
      - {key: env, operator: In, values: }
template:
    metadata:
      labels:
      app: nginx
      env: prod
    # ... Pod配置示例:Service中使用

Service通过 spec.selector 选择Pod:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
    app: nginx   # 选择所有包含 app=nginx 标签的Pod
ports:
    - protocol: TCP
      port: 80
      targetPort: 9376Label及Label选择器的使用场景


[*]批量操作资源:通过标签选择器批量操作符合条件的资源
[*]服务发现:Service通过选择器关联Pod,实现动态流量路由
[*]多维度分组:按照业务、环境、层级等多维度管理资源
[*]通过标签区分新旧版本Pod,逐步切换流量

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: K8s新手系列之Label标签和Label选择器