k8s基础4-标签和选择器
k8s基础4-标签和选择器
一、标签是什么
标签是k8s特色的管理方式,便于分类管理资源对象。
一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
一个资源拥有多个标签,可以实现不同维度的管理。
可以使用标签选择器来指定能使用哪些标签。
标签(Label)是附加在Kubernetes对象上的一组名值对,其意图是按照对用户有意义的方式来标识Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。标签可以用来组织和选择一组Kubernetes对象。您可以在创建Kubernetes对象时为其添加标签,也可以在创建以后再为其添加标签。每个Kubernetes对象可以有多个标签,同一个对象的标签的 Key 必须唯一,例如:
metadata:
labels:
key1: value1
key2: value2
使用标签(Label)可以高效地查询和监听Kubernetes对象,在Kubernetes界面工具(如 Kubenetes Dashboard 或 Kuboard)和 kubectl 中,标签的使用非常普遍。那些非标识性的信息应该记录在注解
为什么要使用标签
使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。
应用程序的部署或者批处理程序的部署通常都是多维度的(例如,多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象时,很多时候要针对某一个维度的条件做整体操作,例如,将某个版本的程序整体删除,这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就会非常地便捷
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=value
key:只能使用 字母 数字 _ - . (只能以字母数字开头,不能超过63给字符)
value: 可以为空 只能使用 字母 数字开头
1、定义标签
kubectl get pods --show-labels #查看pod所有标签信息
kubectl get pods -l app #过滤包含app的标签
kubectl get pods -L app #过滤包含app的标签及显示值
kubectl label pods pod-demo release=canary #给pod-demo增加标签
kubectl label pods pod-demo release=stable --overwrite #修改标签
三、标签选择器
给资源打上标签后,可以使用标签选择器过滤指定的标签
标签选择器目前有两个:基于等值关系和基于集合关系
等值关系操作符:=, == , !=
#使用格式 kubectl get pods -l run=myapp kubectl get pods -l run=myapp --show-labels kubectl get pods -l run!=client --show-labels
集合关系的操作符:in,notin,exists
#使用格式 kubectl get pods -l "run in (client,myapp,alpha)" --show-labels #三个值有一个匹配上都可以 kubectl get pods -l "run notin (client,myapp,alpha)" --show-labels
3.1、小试牛刀
1 通过主机标签或者主机名,把pod部署到匹配的节点
1、匹配符合条件的标签,部署pod
2、给node02节点打标签,如果多个主机都有ssd标签,会随机匹配某一个
kubectl label nodes node02.linux.com disktype=ssd #给node02打上ssd标签 kubectl get nodes --show-labels
2 b、修改yaml文件,增加标签选择器
[root@master manifests]# cat pod-with-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-nodeselector
labels:
env: testing
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
nodeSelector:
disktype: ssd
3、创建pod,验证
kubectl create -f pod-with-nodeselector.yaml
kubectl get nodes -o wide
4 通过主机名,部署pod到指定的主机**
4.1方式一
[root@master manifests]# cat pod-with-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-nodeselector
labels:
env: testing
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
nodeSelector:
kubernetes.io/hostname: node01.linux.com
4.2 方式二:使用sepc.nodeName**
[root@master manifests]# cat pod-with-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-nodeselector
labels:
env: testing
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
nodeName: node01.linux.com
四 句法和字符集
标签是一组名值对(key/value pair)。标签的 key 可以有两个部分:可选的前缀和标签名,通过 / 分隔。
1 标签名
标签名部分是必须的
不能多于 63 个字符
必须由字母、数字开始和结尾
可以包含字母、数字、减号-、下划线_、小数点.
标签前缀:
标签前缀部分是可选的
如果指定,必须是一个DNS的子域名,例如:k8s.eip.work
不能多于 253 个字符
使用 / 和标签名分隔
如果省略标签前缀,则标签的 key 将被认为是专属于用户的。Kubernetes的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的Kubernetes对象添加标签时,必须指定一个前缀。
kubernetes.io/ 和 k8s.io/ 这两个前缀是 Kubernetes 核心组件预留的。Kuboard 使用 k8s.eip.work 这个前缀。
2 标签的 value 必须
不能多于 63 个字符
可以为空字符串
如果不为空,则
必须由字母、数字开始和结尾
可以包含字母、数字、减号-、下划线_、小数点.
例如,下面的例子中的Pod包含两个标签 environment: production 和 app:nginx
五 标签选择器选择方式
与 name 和 UID 不同,标签不一定是唯一的
。通常来讲,会有多个Kubernetes对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器(label selector)
是 Kubernetes 中最主要的分类和筛选手段。
Kubernetes api server支持两种形式的标签选择器,equality-based 基于等式
的 和set-based 基于集合
的。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的 Kubernetes 对象才会被选中。
如果使用空的标签选择器或者不指定选择器,其含义由具体的 API 接口决定。
1-基于等式的选择方式
Equality- 或者 inequality-based 选择器可以使用标签的名和值来执行过滤选择
。只有匹配所有条件的对象才被选中(被选中的对象可以包含未指定的标签)。可以使用三种操作符 =、==、!=。前两个操作符含义是一样的,都代表相等,后一个操作符代表不相等。例如:
选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
environment = production
选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象
tier != frontend
也可以使用逗号分隔的两个等式environment=production,tier!=frontend,
此时将选中所有 environment 为 production 且 tier 不为 frontend 的对象。
以 Pod 的节点选择器 为例,下面的 Pod 可以被调度到包含标签 accelerator=nvidia-tesla-p100
的节点上:
apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
containers:
- name: cuda-test
image: "k8s.gcr.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-p100
2-基于集合的选择方式
Set-based 标签选择器可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、exists。
例如:
# 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
environment in (production, qa)
# 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
tier notin (frontend, backend)
# 选择所有包含 `partition` 标签的对象
partition
# 选择所有不包含 `partition` 标签的对象
!partition
可以组合多个选择器,用 , 分隔,, 相当于 AND 操作符。例如:
# 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象
partition,environment notin (qa)
基于集合的选择方式是一个更宽泛的基于等式的选择方式,例如,environment=production 等价于 environment in (production);environment!=production 等价于 environment notin (production)。
基于集合的选择方式可以和基于等式的选择方式可以混合使用,例如:partition in (customerA, customerB),environment!=qa
六 API查询条件引用
1 Kubernetes对象引用
某些 Kubernetes 对象中(例如,Service和Deployment),使用标签选择器指定一组其他类型的 Kubernetes 对象(例如,Pod)
2 Service
Service 中通过 spec.selector 字段来选择一组 Pod,并将服务请求转发到选中的 Pod 上。
在 yaml 或 json 文件中,标签选择器用一个 map 来定义,且支持基于等式的选择方式,例如:
- 感谢你赐予我前进的力量