【K8s】06 - Label

【K8s】06 - Label

一:Label概述

Label(标签)是Kubernetes系统中一个比较重要的概念,给某个资源对象(Node、Pod、Service等)定义一个Label,就相当于给它打了一个标签

然后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过label对资源进行分区和管理

Label具有如下的特点:

  • 一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node、Pod、Service等
  • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上
  • Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除

我们可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作

示例如下:这是一个有 environment: productionapp: nginx 标签的 Pod 配置文件

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:		# 定义标签集合
    environment: production   # 第一个标签 key: environment, value: production
    app: nginx # 第二个标签 key: app value: nginx
spec: # 规格说明
  containers: # Pod容器列表
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

二:Label Selector

Label标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector(标签选择器):

  • Label用于给某个资源对象定义标签
  • Label Selector用于查询和筛选拥有某些标签的资源对象

在这里插入图片描述
在这里插入图片描述
API 目前支持两种类型的选择算符:基于等值的和基于集合的

1:基于等值的

基于等值或基于不等值的需求允许按标签键和值进行过滤。 匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。

可接受的运算符有 ===!= 三种。 前两个表示相等(并且是同义词),而后者表示不相等

  • app = nginx:匹配所有具有标签app=nginx的资源对象
  • environment != prod:匹配所有不具有标签environment = prod的资源对象,比如environment = devenvironment = qa

2:基于集合的

基于集合的标签需求允许你通过一组值来过滤键。 支持三种操作符:in、notin 和 exists(只可以用在键标识符上)。例如:

  • release in(stable, beta):匹配所有具有标签release = stable或者release = beta的资源对象
  • tier not in(backend):匹配所有不具有标签 tier = backend 的资源对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号 , 进行分隔即可,例如app=nginx,environment!=prod等等

复杂查询下Selector的示例:

selector:
  matchLabels:		# 由 {key,value} 对组成的映射
    app: nginx
  matchExpressions:			# Pod 选择算符需求的列表
  	# 可以使用的操作包括In、NotIn、Exists、DoesNotExist
    - { key: tier , operator: In , values: [frontend]} 
    - { key: environment, operator: NotIn, values: [dev]}

三:Label相关操作

1:yaml文件定义标签

以nginx Pod为例,Label被定义在其metadata中,如下:

apiVersion: v1
kind: Pod
metadata:
	labels:
		app: nginx
		pod-template-hash: 748c667d99 # 声明两个标签,都是k, v形式
	name: nginx-748c667d99-test

然后我们就可以在Service、RC等管理对象中通过Label Selector(标签选择器)设置需要关联Pod的Label,如下:

apiVersion: v1
kind: Service
metadata:
	labels:
		app: nginx
	name: nginx
	namespace: default
spec: # Service 规格说明
	selector:
		app: nginx # 定义标签选择器

2:查看标签(–show-labels)

kubectl get xxx 命令默认不会列出任何标签,使用 --show-labels 选项来查看。

$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-748c667d99-6d5s9   1/1     Running   0          35m
 
$ kubectl get pod --show-labels # 用这种方式可以列出标签信息
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          35m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        7d8h
nginx        NodePort    10.103.144.31   <none>        80:32327/TCP   34m
 
$ kubectl get svc --show-labels # 用这种方式可以列出标签信息
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    LABELS
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        7d8h   component=apiserver,provider=kubernetes
nginx        NodePort    10.103.144.31   <none>        80:32327/TCP   35m    app=nginx

3:筛选标签(-l, -L)

查看匹配标签条件的pod:

$ kubectl get pod --show-labels 
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          41m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl get pod -l app=nginx # 要求列出有标签app: nginx的 pod, -l -> label 后面接着过滤条件
NAME                     READY   STATUS    RESTARTS   AGE
nginx-748c667d99-6d5s9   1/1     Running   0          42m
 
$ kubectl get pod -l app=nginx1 # 没有的提示
No resources found in default namespace.

查看匹配标签key的pod:

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          43m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl get pod -L app  # 要求列出标签中有app这个key的pod集合,-L -> Label,后面接的是过滤标签的key      
NAME                     READY   STATUS    RESTARTS   AGE   APP
nginx-748c667d99-6d5s9   1/1     Running   0          43m   nginx
 
$ kubectl get pod -L pod-template-hash
NAME                     READY   STATUS    RESTARTS   AGE   POD-TEMPLATE-HASH
nginx-748c667d99-6d5s9   1/1     Running   0          44m   748c667d99

多个匹配条件之间使用逗号分开,多个条件之间是“and”关系。例如:

# 选择release为stable或者beta的pod
kubectl get pod -l 'release in (stable, beta)' --show-labels
 
# 选择release为stable或者beta但不包括env=test的pod
kubectl get pod -l env!=test,'release in (stable, beta)' --show-labels

4:添加标签(kubectl label)

给名为nginx 的 pod 添加 Label:environment=dev

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          45m   app=nginx,pod-template-hash=748c667d99

# 注意语法:kubectl label pod [pod_name] k=v
$ kubectl label pod nginx-748c667d99-6d5s9 environment=dev # 给指定的pod添加标签
pod/nginx-748c667d99-6d5s9 labeled

$ kubectl get pod --show-labels # 再次检查,发现添加成功
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          46m   app=nginx,environment=dev,pod-template-hash=748c667d99

5:更新标签(–override)

把名为 nginx 的 pod 修改 Label 为 environment=test,且覆盖现有的value。

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-2trsf   1/1     Running   0          60s   app=nginx,environment=dev,pod-template-hash=748c667d99
 
#使用--overwrite覆盖
$ kubectl label pod nginx-748c667d99-2trsf environment=test --overwrite
pod/nginx-748c667d99-2trsf labeled
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
nginx-748c667d99-2trsf   1/1     Running   0          2m12s   app=nginx,environment=test,pod-template-hash=748c667d99

如果更新的时候标签不存在会创建一个新的标签

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-q2j2r   1/1     Running   0          44s   app=nginx,env=test,pod-template-hash=748c667d99
 
# 更新一个不存在的标签release=stable,那么k8s将会创建新的标签,自动添加上去
$ kubectl label pod nginx-748c667d99-q2j2r release=stable  --overwrite
pod/nginx-748c667d99-q2j2r labeled
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE    LABELS
nginx-748c667d99-q2j2r   1/1     Running   0          105s   app=nginx,env=test,pod-template-hash=748c667d99,release=stable

6:删除标签(-)

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
nginx-748c667d99-2trsf   1/1     Running   0          2m12s   app=nginx,environment=test,pod-template-hash=748c667d99
 
#标签名后面加个“-”就代表要删除该标签
$ kubectl label pod nginx-748c667d99-2trsf environment-    
pod/nginx-748c667d99-2trsf unlabeled
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE    LABELS
nginx-748c667d99-2trsf   1/1     Running   0          5m6s   app=nginx,pod-template-hash=748c667d99

除了给Pod添加Label之外,Service、Node等对象也是可以添加标签的

例如某个应用需要运行在一个或者多个固定的节点上,我们就可以给Node节点添加特定的Label

这样k8s调度的时候,只会将Pod调度到具有特定Label的节点上。

四:Label的使用场景

一些常用的Label示例如下:

  • “release” : “stable”, “release” : “canary”
  • “environment” : “dev”, “environment” : “qa”, “environment” : “production”
  • “tier” : “frontend”, “tier” : “backend”, “tier” : “cache”
  • “partition” : “customerA”, “partition” : “customerB”
  • “track” : “daily”, “track” : “weekly”

有一些常用标签的例子;可以任意制定自己的约定。 但是要始终记住标签的 Key 对于给定对象必须是唯一的。

Label Selector在Kubernetes中的重要使用场景如下:

  • kube-controller进程通过在资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,使Pod副本数量始终符合预期设定的全自动控制流程。
  • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
  • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值