目录
Label
简介
语法
创建时指定标签
查看Label
标签选择器(Label Selector)
简介
基于等值的标签选择器
基于集合的标签选择器
标签选择器常用命令
将节点打上标签
使用Nodeselector选择节点
使用Node affinity
Label
简介
标签(Label)是附在kubernetes对象(如pod,deployment等)上的键值对(key-value),可以在创建时指定,也可以在创建后指定。
Label的值本身不具备具体含义,但可以通过label来筛选对象特定的子集,便于管理。
每一个对象可以有多个标签。
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
语法
标签由一组键值对构成。
Label key的组成:
Key值必须是唯一的
不得超过63个字符
可以使用前缀,使用/分隔,前缀必须是DNS子域,不得超过253个字符,系统中的自动化组件创建的label必须指定前缀,kubernetes.io/由kubernetes保留
起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点
Label value的组成:
不得超过63个字符
起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点
创建时指定标签
labelpod.yaml文件创建一个pod。
在创建时指定两个label
App:busybox
Version:new
kind: Pod
apiVersion: v1
metadata:
name: labelpod
labels: 👍
app: busybox
version:new
spec:
containers:
- name: labelpod
image: busybox
args:
- /bin/sh
- -c
- sleep 30000
查看Label
#通过命令—show-labels可以查看指定对象的所有label
root@k8s-master runfile]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
labelpod 1/1 Running 0 22m app=busybox,version=new
#同样可以使用label指令在已创建的对象上添加标签
root@k8s-master runfile]# kubectl label pods labelpod time=2019
pod/labelpod labeled
[root@k8s-master runfile]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
labelpod 1/1 Running 0 30m app=busybox,time=2019,version=new
标签选择器(Label Selector)
简介
标签不具备唯一性,在通常情况下,多个不同的对象有着相同的标签。
通过标签选择器,用户或客户端可以指定批量的对象进行操作。标签选择器也是kubernetes的核心分组方式。
目前支持两种标签选择器,基于等值的(equality-based)和基于集合的(set-based)。
基于等值的标签选择器
Equality-based标签选择器允许用标签的key和values过滤。有三种运算符可以使用,分别是“=”,“==”和“!=”。前两种运算符同义,代表相等,后一种代表不相等。
#查看有特定标签的对象
[root@k8s-master runfile]# kubectl get pods -l time=2019 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
labelpod 1/1 Running 0 51m app=busybox,time=2019,version=new
#查看不包括特定标签的对象
[root@k8s-master runfile]# kubectl get pods -l time!=2019 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
mypod1 1/1 Running 0 19m <none>
基于集合的标签选择器
#Set-based 的标签条件允许用一组value来过滤key。支持三种操作符: in , notin 和 exists(仅针对于key符号) 。
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
#两种标签选择器也可以混用,如:
partition in (customerA, customerB),environment!=qa
标签选择器常用命令
#查看pod,并显示app标签的值
[root@k8s-master runfile]# kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
mypod 2/2 Running 0 19s nginx
#筛选pod中标签为app=nginx的pod
[root@k8s-master runfile]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
mypod 2/2 Running 0 3m1s
将节点打上标签
#将节点2打上标签
Kubectl label nodes k8s-node2 env=test
#查看节点上的env标签
[root@k8s-master runfile]# kubectl get node -L env
NAME STATUS ROLES AGE VERSION ENV
k8s-master Ready master 21d v1.14.1
k8s-node1 Ready <none> 21d v1.14.1
k8s-node2 Ready <none> 21d v1.14.1 test
#也可以使用--show-labels命令查看所有标签
Kubectl get nodes --show-labels
使用Nodeselector选择节点
编辑yaml文件如右,创建deployment
查看pod所在节点位置,可以看到创建出来的pod都运行在Node2上。
本实验nodeselector使用的是哪一种选择器?
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
nodeSelector:
env: test
使用Node affinity
#继续使用上一页的yaml文件,将nodeselector替换为下图所示内容。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- test
#查看pod运行节点,依然全部运行在node2上