20、K8S-控制资源-标签选择器
1、基础知识
1.1、简介
Kubernetes通过标签来管理对应或者相关联的各种资源对象,Lable是kubernetes中的核心概念之一。
1.2、特点
1、创建: Lable通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除
2、作用: 一个资源对象可以定义多个Lable,同一个Lable也可以关联多个资源对象上去
3、本质: lable本质上是一个key/value键值对,其中key与value由用户自己指定,Lable可以附加到各种资源对象上(比如我们学过的Node和Pod等)。
注意: key的命名:由"字母、数字、_、.、-"这五类组成,只能以字符或数字作为开头和结尾。 标签名称不能多于63个字符
1.3、应用目的
Labe1关联到各种资源对象上,通过对Lable的管理从而达到对同Lable的资源进行分组管理(分配、调度、配置、部署等)。 常用标签使用场景: 版本标签: "release" : "stable","release" : "canary", "release" : "beta".。 环境标签: "environment" : "dev","environment" : "qa","environment": "prod"。 应用标签: "app" : "ui","app" : "as", "app" : "pc", "app" : "sc""。 架构层级标签: "tier" : "frontend","tier" : "backend", "tier" : "cache". 分区标签: "partition" : "customerA","partition": "customerB"。 品控级别标签: "track" : "daily","track" : "week1y"。
1.4、操作方法
1.4.1、yaml令行方法
yaml方法:
在特定的属性后面按照指定方式增加内容即可,格式如下:
labels:
key: value
注意:
labels 是 一个
1.4.2、命令行方法
查看标签:kubectl get pods -l label_name=label_value 参数: -l 就是指定标签条件,获取指定资源对象,=表示匹配,!= 表示不匹配 如果后面的选择标签有多个的话,使用逗号隔开 如果针对标签的值进行范围过滤的话,可以使用如下格式: -l "label_name in|notin (value1, value2, value3, ...)"
增加标签:kubectl label 资源类型 资源名称 label_name=label_value 参数: 同时增加多个标签,只需要在后面多写几个就可以了,使用空格隔开 默认情况下,已存在的标签是不能修改的,使用 --overwrite=true 表示强制覆盖
删除标签:
label_name=label_value样式写成 label_name- ,表示删除label
2、简单实践
2.1、资源文件方式
2.1.1、资源清单
cat > pod-test.yml<<'EOF' apiVersion: v1 kind: Pod metadata: name: nginx-test labels: app: nginx spec: containers: - name: nginx image: 192.168.10.33:80/k8s/my_nginx:v1 env: - name: HELLO value: "Hello kubernetes nginx" EOF
2.1.2、还没有增加标签的查询
master1 ]# kubectl get pods ... Labels: <none> ...
2.1.3、应用清单并且查询标签
master1 ]# kubectl apply -f pod-test.yml pod/nginx-test created master1 ]# kubectl get pod nginx-test --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-test 1/1 Running 0 31s app=nginx
2.1.4、通过标签过滤查询pod
master1 ]# kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE nginx-test 1/1 Running 0 92s
2.2、命令行方式
master1 ]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 --labels="app=nginx,env=prod" master1 ]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-test 1/1 Running 0 2m43s app=nginx,env=prod master1 ]# kubectl get pod -l app=nginx NAME READY STATUS RESTARTS AGE nginx-test 1/1 Running 0 2m57s
3、标签管理【命令行】
3.1、增加标签
kubectl label pod nginx-test version=1.0
3.2、查询标签
kubectl get pod --show-labels
3.3、删除标签
kubectl label pod nginx-test version-
4、标签选择器
4.1、基础知识
4.1.1、简介
Lablel附加到Kubernetes集群中的各种资源对象上,目的就是对这些资源对象进行分组管理,而分组管理的核心就是:Lablel Selector。 分组管理的原理: 我们可以通过Label Selector(标签选择器)查询和筛选某些特定Label的资源对象,进而可以对他们进行相应的操作管理,类似于我们的sql语句中where的条件: select * from where ...
Lablel Selector跟Label一样,不能单独定义,必须附加在一些资源对象的定义文件上。一般附加在RC和Service的资源定义文件中。
4.1.2、表达式
Label Selector使用时候有两种常见的表达式:等式和集合 等式: name = nginx 匹配所有具有标签 name = nginx 的资源对象 name != nginx 匹配所有不具有标签 name = nginx 的资源对象 集合: env in (dev, test) 匹配所有具有标签 env = dev 或者 env = test 的资 源对象 name not in (frontend) 匹配所有不具有标签 name = frontend 的资源对象
4.2、集合表达式
随着Kubernetes功能的不断完善,集合表达式逐渐有了两种规范写法:匹配标签、匹配表达式
4.2.1、匹配标签
matchLabels:
name: nginx
4.2.2、匹配表达式
matchExpressions: - {key: name, operator: NotIn, values: [frontend]} 常见的operator操作属性值有: In、NotIn、Exists、NotExists等 Exists和DostNotExist时,values必须为空,即 { key: environment, opetator: Exists,values:} 注意: 这些表达式,一般应用在RS、RC、Deployment等其它管理对象中。
4.3、应用场景
标签选择器的主要应用场景:
监控具体的Pod、负载均衡调度、定向调度,常用于 Pod、Node等资源对象
当设置 env=dev的Label Selector,则会匹配到Node1和Node2上的Pod
4.4、表达式过滤查询pod
4.4.1、等值过滤
# 等值过滤 master1 ]# kubectl get pods -l env=test # 等值过滤 master1 ]# kubectl get pods -l env==test
4.4.2、不相等
# 不相等
master1 ]# kubectl get pods -l app!=nginx
4.4.3、包含标签的key
# 包含app的key
master1 ]# kubectl get pods -l app
4.4.4、多条件过滤
# 多条件过滤 master1 ]# kubectl get pods -l "env in(test,prod)"
4.4.5、多条件过滤取反
# 多条件过滤取反 master1 ]# kubectl get pods -l "env notin(test,prod)"
4.5、service资源对象关联对应标签的Pod
4.5.1、创建3个Pod
kubectl run nginx-test1 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx' kubectl run nginx-test2 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx' kubectl run nginx-test3 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx' master1 ]# kubectl get pods --show-labels -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS nginx-test1 1/1 Running 0 63s 10.244.3.99 node1 <none> <none> app=nginx nginx-test2 1/1 Running 0 58s 10.244.3.100 node1 <none> <none> app=nginx nginx-test3 1/1 Running 0 52s 10.244.4.59 node2 <none> <none> app=nginx
4.5.2、创建service对象关联对应标签的Pod
cat >service-test.yml<<'EOF' kind: Service apiVersion: v1 metadata: name: service-test spec: selector: app: nginx ports: - name: http protocol: TCP port: 80 targetPort: 80 EOF master1 ]# kubectl apply -f service-test.yml # 访问集群IP地址,是负载至每个pod节点上 master1 ]# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service-test ClusterIP 10.103.165.52 <none> 80/TCP 61s app=nginx # 看到已经关联到相关的pod master1 ]# kubectl describe service service-test ... TargetPort: 80/TCP Endpoints: 10.244.3.100:80,10.244.3.99:80,10.244.4.59:80 ...