zoukankan      html  css  js  c++  java
  • 容器编排系统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上使用标签,标签选择器以及资源注解相关话题的说明;

  • 相关阅读:
    ElasticSearch学习记录
    用java代码手动控制kafkaconsumer偏移量
    kafka0.9.0及0.10.0配置属性
    kafka常用命令
    kafka消费者客户端(0.9.0.1API)
    kafka入门教程链接
    编程内功
    bzoj3145:[Feyat cup 1.5]Str
    3 SpringBoot与微服务
    2 微服务存在的问题和解决方案
  • 原文地址:https://www.cnblogs.com/qiuhom-1874/p/14141080.html
Copyright © 2011-2022 走看看