k8s中label和selector的基本概念以及使用方法

概述

在k8s中有一个非常核心的概念,就是label(标签),以及对label的使用,label selector

 label(标签)

定义:

  标签这个概念和现实生活中的标签其实没有什么区别,如,苹果是水果,冰箱是家电,都是一种标签,类似的。在k8s中,一个label就是key/value对如:app:nginx

  这个标签可以有使用者自己定义,然后附加到k8s中的资源对象上,比如,pod,node上等等

特性:

label有如下的一些特点:

  • label可以被附加到各种资源对象上
  • 一个资源对象可以定义任意数量的label
  • 同一个label可以被添加到任意数量的资源对象上

label selector(标签选择器):

当我们给一组对象,比如有10个pod,打上不同的标签之后,当我们需要选择期中的部分,或者全部作为使用目标的时候,就可以使用label selector来实现这个操作,标签选择器中指定具体的过滤的条件,然后就能在10个pod中过滤出满足我们要求的这些pod

定义标签:

创建一个pod的定义文件中,指定标签

apiVersion: v1
kind: Namespace
metadata:
  name: ns-label
spec: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-label
  labels:
    app: nginx-label
  namespace: ns-label
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
      env: label
  template:
    metadata:
      labels:
        app: nginx
        env: label
    spec:
      containers:
      - name: label-nginx
        image: nginx:1.15
        ports:
        - containerPort: 80
      restartPolicy: Always

在模板中,通过以下方式来定义label

    metadata:
      labels:
        app: nginx
        env: label

创建pod并查看标签,可以看到不同的标签

[root@k8s-master01 ns-slx-study]# kubectl get pod --show-labels -n ns-label
NAME                          READY   STATUS    RESTARTS   AGE    LABELS
nginx-label-c4758cff4-h8bz5   1/1     Running   0          7m2s   app=nginx,env=label,pod-template-hash=c4758cff4
nginx-label-c4758cff4-ltkrq   1/1     Running   0          7m2s   app=nginx,env=label,pod-template-hash=c4758cff4
[root@k8s-master01 ns-slx-study]#

 label selector:

我们可以通过标签选择来筛选出满足我们的要求的对象。所谓的标签选择就是过滤,有几种方式:

#过滤出ns-lanel namespace下所有包含env=label的pod
[root@k8s-master01 ns-slx-study]# kubectl -n ns-label get pod -l env=label --show-labels
NAME                          READY   STATUS    RESTARTS   AGE   LABELS
nginx-label-c4758cff4-h8bz5   1/1     Running   0          11m   app=nginx,env=label,pod-template-hash=c4758cff4
nginx-label-c4758cff4-ltkrq   1/1     Running   0          11m   app=nginx,env=label,pod-template-hash=c4758cff4

几个常用命令,我就不演示了:

#在ns(命名空间):ns-label下,过滤出包含env=nginx,env=label的pod
kubectl -n ns-label get pod -l 'env=nginx,env=label' --show-labels
#在ns(命名空间):ns-label下,过滤出包含env=ngin或者env=label或者env=ssd的pod
kubectl -n ns-label get pod -l 'env in (nginx,label,ssd)' --show-labels
#在ns(命名空间):ns-label下,过滤出包含env=ngin或者env=label或者env=ssd,同时app=nginx的pod
kubectl -n ns-label get pod -l 'app=nginx,env in (nginx,label,ssd)' --show-labels
#在ns(命名空间):ns-label下,过滤出不包含env=ngin或者env=label或者env=ssd的pod
kubectl -n ns-label get pod -l 'env notin (nginx,label,ssd)' --show-labels
#在ns(命名空间):ns-label下,过滤出不是env=nginx,env=label的pod
kubectl -n ns-label get pod -l 'env!=nginx,env!=label' --show-labels

基于集合匹配的方式:

  selector:
    matchLabels:
      app: nginx
      env: online
    matchExpressions:
     - {key: release, operator: In, values: [stable] }
     - {key: app,operator: NotIn, values: [nginx02,nginx03] }
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx06
        env: online
        release: stable

语法:

    matchExpressions:
     - {key: release, operator: In, values: [stable] }
     - {key: app,operator: NotIn, values: [nginx02,nginx03] }

 

posted @ 2023-02-26 00:47  百因必有果  阅读(1213)  评论(0编辑  收藏  举报