概念:
Label:是Kubernetes系列中另外一个核心概念。是一组绑定到K8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。
这个标签可以由使用者自己来进行定义,然后附加到k8s中的资源对象上,比如,pod上,node上等等
Label selector(标签选择器):对一组对象(Node,Pod,Service,RC)打上了不同的标签之后,当我们要选择其中的部分,或者全部作为使用目标的时候,就可以使用label selector来实现这个操作,标签选择器中指定具体的过滤的条件
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-label
namespace: beijing
spec:
selector:
matchLabels:
app: nginx
env: prod
replicas: 2
template:
metadata:
labels:
app: nginx
env: prod
spec:
containers:
- image: harbor.ops.bsnbase.com/fabric/nginx:1.21.6
name: nginx
在pod的模板中,通过以下的方式来定义label
spec.template:
metadata:
labels:
app: nginx
env: prod
# 查询pod 并显示label
[root@master1 beijing]# kubectl get pod -n beijing --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
init-busybox-77b9f4dccc-j8d62 1/1 Running 0 43h 10.233.66.236 node2 <none> <none> name=init-busybox,pod-template-hash=77b9f4dccc
pod-label-7879c4469b-qf8cw 1/1 Running 0 6m58s 10.233.66.4 node2 <none> <none> app=nginx,env=prod,pod-template-hash=7879c4469b
pod-label-7879c4469b-shphs 1/1 Running 0 6m58s 10.233.66.3 node2 <none> <none> app=nginx,env=prod,pod-template-hash=7879c4469b
#过滤出所有包含app=nginx的pod
[root@master1 beijing]# kubectl get pod -l 'app=nginx' --show-labels -o wide -n beijing
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod-label-7879c4469b-qf8cw 1/1 Running 0 7m43s 10.233.66.4 node2 <none> <none> app=nginx,env=prod,pod-template-hash=7879c4469b
pod-label-7879c4469b-shphs 1/1 Running 0 7m43s 10.233.66.3 node2 <none> <none> app=nginx,env=prod,pod-template-hash=7879c4469b
#过滤出所有包含app=nginx的pod, 通过逗号隔开,表示2个条件要同时的满足,也就是AND的关系
[root@master1 beijing]# kubectl get pod -l 'app=nginx,env=prod' --show-labels -o wide -n beijing
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod-label-7879c4469b-qf8cw 1/1 Running 0 7m59s 10.233.66.4 node2 <none> <none> app=nginx,env=prod,pod-template-hash=7879c4469b
pod-label-7879c4469b-shphs 1/1 Running 0 7m59s 10.233.66.3 node2 <none> <none> app=nginx,env=prod,pod-template-hash=7879c4469b
这样,就通过标签实现了一个基本的过滤,同时,当一个资源对象要和另外的对象进行关联的时候,比如,service要关联pod,也是通过label过滤的方式来实现的。
上面是在命令行中的一个基本的使用。
在yaml中的使用也是类似的,只是要放在Selector的部分。
yaml配置中的标签选择表达式
我们以service为示例,来测试下标签的选择:
apiVersion: v1
kind: Service
metadata:
name: service-label
namespace: beijing
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
env: prod
这里的过滤条件是2个,就是同时满足的意思
spec.selector:
app: nginx
env: prod
查看service关联的pod的结果:
#查看service信息
[root@master1 beijing]# kubectl get svc -n beijing service-label -o wide --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR LABELS
service-label ClusterIP 10.233.4.255 <none> 80/TCP 12m app=nginx,env=prod <none>
#查询Service 的目标 Pod 集合
[root@master1 beijing]# kubectl get endpoints -n beijing -o wide --show-labels
NAME ENDPOINTS AGE LABELS
glusterfs-dynamic-00f74685-dc00-46e4-81b6-2a8013f8486d 10.0.49.57:1,10.0.49.56:1,10.0.49.55:1 3d2h gluster.kubernetes.io/provisioned-for-pvc=blocktxs
glusterfs-dynamic-ff90deca-9fc8-4c9e-899e-feb0bd59c8c8 10.0.49.57:1,10.0.49.56:1,10.0.49.55:1 3d2h gluster.kubernetes.io/provisioned-for-pvc=ca-certs
service-label 10.233.66.3:80,10.233.66.4:80 12m <none>