1. Label

Label是附着到object上(例如Pod)的键值对。可以在创建object的时候指定,也可以在object创建后随时指定。Labels的值对系统本身并没有什么含义,只是对用户才有意义。在一个资源中,key是唯一的。

1.1. 标签的查看

  • 显示pod的所有标签

    1. [root@hdss7-21 ~]# kubectl get pods -n app --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. pod-01 1/1 Running 0 95s app=nginx,release=connary,tier=frontend,version=v1.12
    4. pod-02 1/1 Running 2 2d app=nginx,release=stable,version=v1.12
    5. pod-03 1/1 Running 0 4m29s app=nginx,release=alpha,version=v1.12
    6. pod-04 1/1 Running 0 3m5s app=nginx,release=stable,version=v1.13
  • 显示包含tier标签的pod

    [root@hdss7-21 ~]# kubectl get pods -n app --show-labels -l tier
    NAME     READY   STATUS    RESTARTS   AGE     LABELS
    pod-01   1/1     Running   0          2m42s   app=nginx,release=connary,tier=frontend,version=v1.12
    
  • 显示v1.13稳定版本的pod

    [root@hdss7-21 ~]# kubectl get pods -n app --show-labels -l release=stable,version=v1.13
    NAME     READY   STATUS    RESTARTS   AGE     LABELS
    pod-04   1/1     Running   0          4m52s   app=nginx,release=stable,version=v1.13
    

    1.2. 常用的标签字段

    | Key | Values | 说明 | | —- | —- | —- | | release | stable,canary,alpha,bate | 版本。常用的是稳定版、金丝雀版本、内测版、公测版 | | environment | dev,qa,gray,production | 环境。开发环境、测试环境、灰度环境、生产环境 | | tier | frontend,backend,cache | 层级。前端、后端、缓存 | | partition | customerA,customerB | 模块。业务A,业务B | | version | v1.1,v1.2 | 版本号。v1.1,v1.2 |

1.3. 标签的语法

Key的语法规则:

  • Key可以有两部分组成:prefix和name,使用 / 连接prefix和name。其中prefix必须为集群内dns能解析的域,不得超过253个字符;name长度不超过63的字符。kubernetes.io 、k8s.io 为kubernetes集群组件保留的prefix。大部分资源很少使用prefix,一般仅由name作为key。
  • name必须由字母或数字开头和结尾,中间可以用 中划线、下划线和点连接

Value的语法规则:

  • 长度不超过63个字符
  • 必须由字母或数字开头和结尾,中间可以用 中划线、下划线和点连接

    1.4. 打标签

    给Pod控制器打标签一般在 Yaml 文件中配置,可以参考 03-3-Pod控制器,给节点打标签通常是使用 kubectl 命令
    打标签:kubectl label node <node-name> key=value
    删标签:kubectl label node <node-name> key-
    改标签:kubectl label node <node-name> key=value --overwrite
    设角色:kubectl label node <node-name> node-role.kubernetes.io/<role-name>=
    删角色:kubectl label node <node-name> node-role.kubernetes.io/<role-name>-
    
    ``` [root@centos-7-52 ~]# kubectl get node NAME STATUS ROLES AGE VERSION centos-7-51 Ready master 7d16h v1.18.12 centos-7-52 Ready master 7d16h v1.18.12 centos-7-53 Ready master 7d16h v1.18.12 centos-7-54 Ready worker 7d16h v1.18.12 centos-7-55 Ready 7d16h v1.18.12

[root@centos-7-52 ~]# kubectl get node -l os No resources found in default namespace. [root@centos-7-52 ~]# kubectl label node centos-7-54 os=ubuntu-1804 # 增加标签 node/centos-7-54 labeled [root@centos-7-52 ~]# kubectl get node -l os NAME STATUS ROLES AGE VERSION centos-7-54 Ready worker 7d16h v1.18.12

[root@centos-7-52 ~]# kubectl label node centos-7-54 os=ubuntu-18.04-5 —overwrite # 改标签 node/centos-7-54 labeled [root@centos-7-52 ~]# kubectl get node -l os=ubuntu-18.04-5 NAME STATUS ROLES AGE VERSION centos-7-54 Ready worker 7d16h v1.18.12

[root@centos-7-52 ~]# kubectl label node centos-7-54 os- # 删标签 node/centos-7-54 labeled [root@centos-7-52 ~]# kubectl get node -l os=ubuntu-18.04-5 No resources found in default namespace.

[root@centos-7-52 ~]# kubectl label node centos-7-55 node-role.kubernetes.io/worker= # 加角色 node/centos-7-55 labeled [root@centos-7-52 ~]# kubectl get node NAME STATUS ROLES AGE VERSION centos-7-51 Ready master 7d16h v1.18.12 centos-7-52 Ready master 7d16h v1.18.12 centos-7-53 Ready master 7d16h v1.18.12 centos-7-54 Ready worker 7d16h v1.18.12 centos-7-55 Ready worker 7d16h v1.18.12

[root@centos-7-52 ~]# kubectl label node centos-7-55 node-role.kubernetes.io/worker- # 删角色 node/centos-7-55 labeled [root@centos-7-52 ~]# kubectl get node NAME STATUS ROLES AGE VERSION centos-7-51 Ready master 7d16h v1.18.12 centos-7-52 Ready master 7d16h v1.18.12 centos-7-53 Ready master 7d16h v1.18.12 centos-7-54 Ready worker 7d16h v1.18.12 centos-7-55 Ready 7d16h v1.18.12


---

<a name="RVJ43"></a>
## 2. Annotations
Label和Annotation都可以将元数据关联到Kubernetes资源对象。Label主要用于选择对象,可以挑选出满足特定条件的对象。相比之下,annotation 不能用于标识及选择对象。annotation中的元数据可多可少,可以是结构化的或非结构化的,也可以包含label中不允许出现的字符。annotation和label一样都是key/value键值对映射结构。<br />声明配置层管理的字段。使用annotation关联这类字段可以用于区分以下几种配置来源:

- 客户端或服务器设置的默认值,自动生成的字段或自动生成的 auto-scaling 和 auto-sizing 系统配置的字段。
- 创建信息、版本信息或镜像信息。例如时间戳、版本号、git分支、PR序号、镜像哈希值以及仓库地址。
- 记录日志、监控、分析或审计存储仓库的指针
- 可以用于debug的客户端(库或工具)信息,例如名称、版本和创建信息。
- 用户信息,以及工具或系统来源信息、例如来自非Kubernetes生态的相关对象的URL信息。
- 轻量级部署工具元数据,例如配置或检查点。
- 负责人的电话或联系方式,或能找到相关信息的目录条目信息,例如团队网站。

[root@hdss7-21 ~]# kubectl get node hdss7-21.host.com -o yaml apiVersion: v1 kind: Node metadata: annotations: node.alpha.kubernetes.io/ttl: “0” volumes.kubernetes.io/controller-managed-attach-detach: “true”


---

<a name="Yk4Ju"></a>
## 3. 选择器
<a name="gKT03"></a>
### 3.1. 标签选择器
Label不是唯一的,很多object可能有相同的label。通过label selector,客户端/用户可以指定一个object集合,通过label selector对object的集合进行操作。**多个条件使用“,”连接,表示AND的含义。**
<a name="MaUy3"></a>
#### 3.1.1. 标签选择器类型

- 基于等值的选择器
| Operators | Meanings |
| --- | --- |
| Key1=var1 | 存在key1,且key1的值为var1 |
| Key2==var2 | 存在key2,且key2的值为var2 |
| Key3!=var3 | 不存在key3,或者key3的值不为var3 |

- 基于集合的选择器
| Operators | Meanings |
| --- | --- |
| Key1   in (var1,var2) | 存在key1,且key1的值为var1或者var2 |
| Key2   notin (var1,var2) | 不存在key2,或者key2的值不为var1且不为var2 |
| Key3 | 存在key3 |
| ! key4 | 不存在key4 |

<a name="zdWcc"></a>
#### 3.1.2. 标签选择器的使用

[root@hdss7-21 ~]# kubectl get pods -n app —show-labels -l tier # 包含tier的pod NAME READY STATUS RESTARTS AGE LABELS pod-01 1/1 Running 0 45m app=nginx,release=connary,tier=frontend,version=v1.12 [root@hdss7-21 ~]# kubectl get pods -n app —show-labels -l “! tier” # 不包含tier的pod NAME READY STATUS RESTARTS AGE LABELS pod-02 1/1 Running 2 2d1h app=nginx,release=stable,version=v1.12 pod-03 1/1 Running 0 48m app=nginx,release=alpha,version=v1.12 pod-04 1/1 Running 0 47m app=nginx,release=stable,version=v1.13

[root@hdss7-21 ~]# kubectl get pods -n app —show-labels -l “release in (alpha,connary)” # 版本为alpha和connary的pod NAME READY STATUS RESTARTS AGE LABELS pod-01 1/1 Running 0 47m app=nginx,release=connary,tier=frontend,version=v1.12 pod-03 1/1 Running 0 50m app=nginx,release=alpha,version=v1.12

[root@hdss7-21 ~]# kubectl get pods -n app —show-labels -l “tier notin (backend,frontend)” # 不是前后端的pod NAME READY STATUS RESTARTS AGE LABELS pod-02 1/1 Running 2 2d1h app=nginx,release=stable,version=v1.12 pod-03 1/1 Running 0 52m app=nginx,release=alpha,version=v1.12 pod-04 1/1 Running 0 51m app=nginx,release=stable,version=v1.13

<a name="1R0V2"></a>
### 3.2. 字段选择器
字段选择器是基于字段来筛选资源的,平时用的很少,且支持的字段类型很少,目前仅支持:metadata.name, metadata.namespace, status.phase。操作符支持 =, ==, != 三种。

[root@hdss7-21 ~]# kubectl get pod -A —field-selector metadata.namespace!=app,status.phase=Running NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-ds-7cs4q 0/1 ImagePullBackOff 2 7d17h default nginx-ds-jdp7q 0/1 ImagePullBackOff 2 7d17h kube-system coredns-6b6c4f9648-nmc9v 1/1 Running 1 18h kube-system kubernetes-dashboard-76dcdb4677-z46pd 1/1 Running 3 6d4h kube-system traefik-ingress-h5pvj 1/1 Running 3 6d5h kube-system traefik-ingress-vtlch 1/1 Running 3 6d5h ```


image.png