容器编排系统之K8s资源标签、标签选择器、资源注解
前文我们聊到了使用k8s资源配置清单定义资源的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14132890.html;今天我们来聊下资源标签,标签选择器以及资源注解相关话题;
1、标签和标签选择器
对于pod来讲,我们知道使用pod控制器创建的pod在pod故障以后,重建后的pod它的ip地址和名称是变化的,为了解决pod访问问题,我们特此创建了service,我们访问service的ip地址就可以正常访问到pod;那么问题来了,service是怎样去关联pod的呢?我们知道在k8s上如果pod使用pod控制创建的pod,在pod发生故障以后,对应pod会被对应的控制器重启或重建,一个pod重建以后,对应的ip地址和名称都是会发生变化的,所以靠ip地址和名称关联pod是不行的;那靠什么关联pod呢?在k8s上是使用的标签和标签选择器的机制实现资源和资源见相互关联的;
什么是标签?它的作用是干嘛用的?
所谓标签就是指一个键值数据,在k8s上任何资源都可以拥有标签;我们可以在创建资源时在配置清单中指定,也可以创建好资源以后再使用命令添加标签;有了标签以后,我们后续就可以根据标签来管理对应的资源;一个资源可以拥有多个标签,同时一个标签也可以附加给多个资源;我们可以理解为标签就是用来逻辑的对资源进行分组,拥有相同标签的资源为一组;标签的作用是方便用户管理资源;比如在k8s上运行了几百个pod,我们想要管理功能相同的pod,就可以把具有相似功能的pod附加同一个标签,然后要管理这些pod的时,直接指定拥有指定标签的pod即可;标签中的健名称通常由键前缀和键名组成,键前缀和键名用“/”分割,键前缀可以省略,键名最多只能使用63个字符,可使用字母,数字,连接号(-),下划线,点号等字符,并且只能以数字或字母开头和结尾;键前缀必须为dns子域名格式且不能超过253个字符,省略前缀时,健将视为用户的私有数据;有前缀可以视为k8s第三方组件可以应用的资源;不过kubernetes.io这个前缀是预留给k8s核心组件使用,所以我们在定义键前缀时,不能使用“kubernetes.io”;
标签选择器
所谓标签选择器是指一组表达式,主要用来表达标签查询条件或选择标准;在k8s上支持两种类型的标签选择器,一种是基于等值关系的选择器,一种是基于集合关系的选择器;基于等值关系的选择器,通常可以用=、==或!=这些操作符来表示关系;前两个表示同一个意思相等,后面的!=表示不等;基于集合关系的选择器可以用in,notin和exists这三个操作符;in表示指定键名的值在给定的列表中就表示满足条件;notin和in相反;exists表示是否存在对应的键名,比如key表示所有存在此键名标签的资源;!key表示所有不存在此键名标签的资源;此外在使用标签选择器时遵循以下逻辑,第一如果同时指定多个选择器时,选择器之间是逻辑与的关系,表示指定的选择器都要同时满足;第二使用空值的标签选择器意味着每个资源都被选中;第三空的标签选择器将无法选出任何资源;空值和空的选择器是两会事,一个是有键名但其值为空,另一个是连键名都没有;
示例:在资源清单中定义标签
[root@master01 ~]# cat pod-demo5.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-demo5
namespace: testing
labels:
app: nginx
env: testing
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
hostPort: 8080
name: web
protocol: TCP
[root@master01 ~]#
提示:在资源清单中使用labels字段来定义标签,该字段的值是一个字符型字典;键名和值是用户自定义的;
应用资源配置清单
[root@master01 ~]# kubectl apply -f pod-demo5.yaml
pod/nginx-pod-demo5 created
[root@master01 ~]# kubectl get pod -n testing
NAME READY STATUS RESTARTS AGE
nginx-pod-demo 1/1 Running 1 6d23h
nginx-pod-demo5 1/1 Running 0 12s
[root@master01 ~]#
查看pod是类出显示标签
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h <none>
nginx-pod-demo5 1/1 Running 0 78s app=nginx,env=testing
[root@master01 ~]#
提示:查看pod时可以使用--show-labels选项来显示对应pod的标签;标签较多时,也可以使用-L来指定显示那些标签;
显示指定标签
[root@master01 ~]# kubectl get pod -n testing -L app
NAME READY STATUS RESTARTS AGE APP
nginx-pod-demo 1/1 Running 1 6d23h
nginx-pod-demo5 1/1 Running 0 3m2s nginx
[root@master01 ~]# kubectl get pod -n testing -L app,env
NAME READY STATUS RESTARTS AGE APP ENV
nginx-pod-demo 1/1 Running 1 6d23h
nginx-pod-demo5 1/1 Running 0 3m10s nginx testing
[root@master01 ~]#
使用命令管理标签
修改标签
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h <none>
nginx-pod-demo5 1/1 Running 0 8m42s app=nginx,env=testing
[root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo5 app=ngx
error: 'app' already has a value (nginx), and --overwrite is false
[root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo5 app=ngx --overwrite
pod/nginx-pod-demo5 labeled
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h <none>
nginx-pod-demo5 1/1 Running 0 9m1s app=ngx,env=testing
[root@master01 ~]#
提示:使用kubectl label命令修改标签时必须添加--overwrite选项来指定强制覆盖原有标签的值;
使用添加新标签
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h <none>
nginx-pod-demo5 1/1 Running 0 11m app=ngx,env=testing
[root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo app=ngx env=testing
pod/nginx-pod-demo labeled
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h app=ngx,env=testing
nginx-pod-demo5 1/1 Running 0 12m app=ngx,env=testing
[root@master01 ~]#
删除标签
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h app=ngx,env=testing
nginx-pod-demo5 1/1 Running 0 12m app=ngx,env=testing
[root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo app-
pod/nginx-pod-demo labeled
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h env=testing
nginx-pod-demo5 1/1 Running 0 14m app=ngx,env=testing
[root@master01 ~]#
提示:删除标签只需要在要删除的标签键名后面加上“-”号即可;
示例:使用标签选择器过滤出标签为app=ngx-dep的资源
[root@master01 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-dep-5bc4d8cc74-cvkbc 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74
myapp-dep-5bc4d8cc74-gmt7w 1/1 Running 2 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74
myapp-dep-5bc4d8cc74-gqhh5 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74
ngx-dep-5c8d96d457-w6nss 1/1 Running 1 7d3h app=ngx-dep,pod-template-hash=5c8d96d457
[root@master01 ~]# kubectl get pod -l "app=ngx-dep" -L app
NAME READY STATUS RESTARTS AGE APP
ngx-dep-5c8d96d457-w6nss 1/1 Running 1 7d3h ngx-dep
[root@master01 ~]#
提示:使用标签选择器来过滤资源,需要用-l选项来指定标签选择器;
查看app!=ngx-dep的pod
[root@master01 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-dep-5bc4d8cc74-cvkbc 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74
myapp-dep-5bc4d8cc74-gmt7w 1/1 Running 2 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74
myapp-dep-5bc4d8cc74-gqhh5 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74
ngx-dep-5c8d96d457-w6nss 1/1 Running 1 7d3h app=ngx-dep,pod-template-hash=5c8d96d457
[root@master01 ~]# kubectl get pod -l "app!=ngx-dep" -L app
NAME READY STATUS RESTARTS AGE APP
myapp-dep-5bc4d8cc74-cvkbc 1/1 Running 1 7d2h myapp-dep
myapp-dep-5bc4d8cc74-gmt7w 1/1 Running 2 7d2h myapp-dep
myapp-dep-5bc4d8cc74-gqhh5 1/1 Running 1 7d2h myapp-dep
[root@master01 ~]#
指定多个标签选择器过滤资源
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 6d23h env=testing
nginx-pod-demo3 1/1 Running 0 3m24s app=nginx,env=test,rel=stable
nginx-pod-demo4 1/1 Running 0 3m48s app=nginx,env=testing,rel=stable
nginx-pod-demo5 1/1 Running 0 31m app=ngx,env=testing
[root@master01 ~]# kubectl get pod -n testing -l "app=nginx,env=testing"
NAME READY STATUS RESTARTS AGE
nginx-pod-demo4 1/1 Running 0 4m21s
[root@master01 ~]# kubectl get pod -n testing -l "app=nginx,env!=testing"
NAME READY STATUS RESTARTS AGE
nginx-pod-demo3 1/1 Running 0 4m30s
[root@master01 ~]#
使用基于集合关系的标签选择器
[root@master01 ~]# kubectl get pod -n testing --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod-demo 1/1 Running 1 7d env=testing
nginx-pod-demo3 1/1 Running 0 5m33s app=nginx,env=test,rel=stable
nginx-pod-demo4 1/1 Running 0 5m57s app=nginx,env=testing,rel=stable
nginx-pod-demo5 1/1 Running 0 33m app=ngx,env=testing
[root@master01 ~]# kubectl get pod -n testing -l "app in (ngx,nginx)"
NAME READY STATUS RESTARTS AGE
nginx-pod-demo3 1/1 Running 0 6m20s
nginx-pod-demo4 1/1 Running 0 6m44s
nginx-pod-demo5 1/1 Running 0 34m
[root@master01 ~]# kubectl get pod -n testing -l "app notin (ngx,nginx)"
NAME READY STATUS RESTARTS AGE
nginx-pod-demo 1/1 Running 1 7d
[root@master01 ~]# kubectl get pod -n testing -l "app"
NAME READY STATUS RESTARTS AGE
nginx-pod-demo3 1/1 Running 0 6m56s
nginx-pod-demo4 1/1 Running 0 7m20s
nginx-pod-demo5 1/1 Running 0 34m
[root@master01 ~]# kubectl get pod -n testing -l '!app'
NAME READY STATUS RESTARTS AGE
nginx-pod-demo 1/1 Running 1 7d
[root@master01 ~]#
提示:!在shell环境中有特殊的意义,所以在指定!key时需要用单引号强应用;
2、资源注解
在k8s上除了可以使用标签来给资源附加自定义元数据外,也可以使用注解给资源附加自定义元数据;标签和注解两者不同的是,标签可以用于标签选择器,而注解不能,它只是为方便用户在给对应资源添加自定义元数据提供一个接口,其次在标签中,标签的的键名和值都不能超过63个字符,而在资源注解中不受字符大小的限定,它可大可小,值可以为结构化数据或非结构化数据;对于在标签中禁止使用的字符,在资源注解中都不受限制;
查看注解
提示:查看注解可以使用describe子命令来查看,对应Annotations字段就是用来标注对应资源的注解信息;也可以使用kubectl get 使用-o选项输出为yaml格式的信息;找到对应的Annotations字段信息即可;
使用命令添加注解
[root@master01 ~]# kubectl annotate pod/ngx-dep-5c8d96d457-w6nss description="this is nginx pod "
pod/ngx-dep-5c8d96d457-w6nss annotated
[root@master01 ~]# kubectl describe pod ngx-dep-5c8d96d457-w6nss|grep "Annotations"
Annotations: description: this is nginx pod
[root@master01 ~]#
使用资源配置清单添加注解
[root@master01 ~]# cat pod-demo5.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-demo5
namespace: testing
labels:
app: nginx
env: testing
annotations:
descriptions: "this is test pod "
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
hostPort: 8080
name: web
protocol: TCP
[root@master01 ~]#
提示:使用资源配置清单定义注解信息需要用到annotations字段,该字段的值为一个字符型字典;
应用配置清单
[root@master01 ~]# kubectl apply -f pod-demo5.yaml
pod/nginx-pod-demo5 configured
[root@master01 ~]#
查看对应资源的注解
[root@master01 ~]# kubectl get pods -n testing
NAME READY STATUS RESTARTS AGE
nginx-pod-demo 1/1 Running 1 7d
nginx-pod-demo3 1/1 Running 0 45m
nginx-pod-demo4 1/1 Running 0 45m
nginx-pod-demo5 1/1 Running 0 73m
[root@master01 ~]# kubectl describe -n testing pod/nginx-pod-demo5|grep "Annotations"
Annotations: descriptions: this is test pod
[root@master01 ~]#
以上就是在k8s上使用标签,标签选择器以及资源注解相关话题的说明;
容器编排系统之K8s资源标签、标签选择器、资源注解的更多相关文章
- 容器编排系统之Kubernetes基础入门
一.kubernetes简介 1.什么是kubernetes?它是干什么用的? kubernetes是google公司用go语言开发的一套容器编排系统,简称k8s:它主要用于容器编排:所谓容器编排简单 ...
- 通过重新构建Kubernetes来实现更具弹性的容器编排系统
通过重新构建Kubernetes来实现更具弹性的容器编排系统 译自:rearchitecting-kubernetes-for-the-edge 摘要 近年来,kubernetes已经发展为容器编排的 ...
- 容器编排系统k8s之Ingress资源
前文我们了解了k8s上的service资源的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14161950.html:今天我们来了解下k8s上的In ...
- 容器编排系统K8s之PV、PVC、SC资源
前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...
- 容器编排系统K8s之ConfigMap、Secret资源
前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...
- 容器编排系统K8s之crd资源
前文我们了解了k8s节点污点和pod的对节点污点容忍度相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14255486.html:今天我们来聊一下扩展 ...
- 容器编排系统K8s之HPA资源
前文我们了解了用Prometheus监控k8s上的节点和pod资源,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14287942.html:今天我们来了解下 ...
- 容器编排系统之Pod生命周期、健康/就绪状态探测以及资源限制
前文我们了解了在k8s上的资源标签.标签选择器以及资源注解相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14141080.html:今天我们来聊下k8 ...
- 容器编排系统K8s之访问控制--用户认证
前文我们聊到了k8s的statefulset控制器相关使用说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14201103.html:今天我们来聊一下k8 ...
随机推荐
- 批量反编译.class
使用dj java Decompiler软件,安装后,安装目录会有个jad.exe程序 控制台执行: jad -o -r -dF:\output_dir -sjava F:\class_root_di ...
- docker下启动单机nacos
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server 参数说明: MODE standalo ...
- 新鲜出炉!凭借着这份面试宝典,我终于拿下了字节跳动的offer!
前言 我做Java也十来年了,现在也算是中层管理,每次招聘都需要找一些面试题,干脆自己整理了一份,这份面试宝典是从我 去年开始收集的,一方面是给公司招聘用,另一方面也是想用它,来挖掘自己在 Java ...
- 详解CorelDRAW中刻刀工具的具体运用
通过CorelDRAW,我们可以将一个对象拆分为两个对象,使用刻刀工具就可以将对象一分为二,保存为一个由两个或者多个子路径组成的对象,可以指定是否要自动闭合路径,或者是否一直将它们打开. CDR刻刀工 ...
- guitar pro系列教程(二十四):Guitar Pro 7 中文界面的介绍
用过Guitar Pro这款软件的小伙伴们都知道,Guitar Pro这款吉他软件因为是国外开发商研发的,所以软件最初都是英文版本,对于国内的的吉他爱好者来说,在软件使用上还是很不方便的.随着Guit ...
- FL studio系列教程(十七):FL Studio走带面板介绍
FL Studio走带面板主要是用来控制播放.录音以及调整歌曲速度的,除此之外还可以用来选择样本剪辑.下面就来详细地看一下这部分菜单. 1.样本/歌曲模式 样本/歌曲模式主要是用来切换样本和歌曲两种模 ...
- linux常见目录
- 基于gin的golang web开发:docker
Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...
- Java蓝桥杯练习——杨辉三角形
问题描述: 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. 下面给出了杨辉三角形的前4行: 1 1 1 ...
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的错误问题
最近想再购买一台虚拟服务器做项目测试,之前在西部数码购买的已经过期了,在同事的推荐下去搬瓦工购买了一台服务器,听他介绍在这里购买服务器很便宜($19.99/年)而且还是国外的,看着相比之前的确实挺便宜 ...