注解/字段选择器

This commit is contained in:
huanqing.shao
2019-10-15 22:28:58 +08:00
parent a30f08d14d
commit 9bc96eefad
5 changed files with 158 additions and 6 deletions

View File

@ -1,14 +1,87 @@
---
# vssueId: 133
vssueId: 138
layout: LearningLayout
description: Kubernetes教程_标签Label是附加在Kubernetes对象上的一组名值对_其意图是按照对用户有意义的方式来标识Kubernetes对象_同时_又不对Kubernetes的核心逻辑产生影响_标签可以用来组织和选择一组Kubernetes对象
description: Kubernetes教程_注解annotation可以用来向Kubernetes对象的metadata.annotations字段添加任意的信息_Kubernetes的客户端或者自动化工具可以存取这些信息以实现其自定义的逻辑
meta:
- name: keywords
content: Kubernetes 教程,Kubernetes Annotation,Kubernetes 注解
---
# 注解 annotation
# 注解annotation
<AdSenseTitle>
注解annotation可以用来向 Kubernetes 对象的 `metadata.annotations` 字段添加任意的信息。Kubernetes 的客户端或者自动化工具可以存取这些信息以实现其自定义的逻辑。
[[TOC]]
</AdSenseTitle>
## 向Kubernetes对象添加注解
Kubernetes 对象的 `metadata` 字段可以添加自定义的标签label或者注解annotation。标签用来选择对象或者用来查找符合指定条件的一组对象。与此相对注解不是用来标记对象或者选择对象的。`metadata` 中的注解可以很大,也可以很小;可以是结构化的,也可以是非结构化的;还可以包括标签中不允许出现的字符。
与标签相似,注解也是 key/value map例如
``` yaml
metadata:
annotations:
key1: value1
key2: value2
```
类似于下面的信息可以记录在注解中:
* 声明式配置层用到的状态信息。
* Build、release、image信息例如 timestamp、release ID、git branch、PR number、image hash、registry address
* 日志、监控、分析、审计系统的参数
* 第三方工具所需要的信息,例如 name、version、build information、URL
* 轻量级的发布工具用到的信息例如config、checkpoint
* 负责人的联系方式,例如,电话号码、网址、电子信箱
* 用户用来记录备忘信息的说明,例如,对标准镜像做了什么样的修改、维护过程中有什么特殊信息需要记住
下面是一个来自于实际 Deployment 的注解:
``` yaml
metadata:
annotations:
deployment.kubernetes.io/revision: 7 # 由Deployment控制器添加用于记录当前发布的修改次数
k8s.eip.work/displayName: busybox # Kuboard添加Deployment显示在Kuboard界面上的名字
k8s.eip.work/ingress: false # Kuboard添加根据此参数显示Deployment是否配置了Ingress
k8s.eip.work/service: none # Kuboard添加根据此参数显示Deployment是否配置了Service
```
除了使用注解,您也可以将这类信息存放在一个外部的数据库,然而,在使用、分享这些信息的时候,可能会变得难以管理。
## 句法和字符集
注解是一组名值对。
注解的 key 有两个部分:可选的前缀和标签名,通过 `/` 分隔。
* 注解名:
* 标签名部分是必须的
* 不能多于 63 个字符
* 必须由字母、数字开始和结尾
* 可以包含字母、数字、减号`-`、下划线`_`、小数点`.`
* 注解前缀:
* 注解前缀部分是可选的
* 如果指定必须是一个DNS的子域名例如k8s.eip.work
* 不能多于 253 个字符
* 使用 `/` 和标签名分隔
如果省略注解前缀,则注解的 key 将被认为是专属于用户的。Kubernetes的系统组件例如kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件向用户的Kubernetes对象添加注解时必须指定一个前缀。
`kubernetes.io/` 和 `k8s.io/` 这两个前缀是 Kubernetes 核心组件预留的。Kuboard 使用 `k8s.eip.work` 这个前缀。
下面的例子中Pod包含一个注解 `imageregistry: https://hub.docker.com/`
``` yaml
apiVersion: v1
kind: Pod
metadata:
name: annotations-demo
annotations:
imageregistry: "https://hub.docker.com/"
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
```

View File

@ -0,0 +1,77 @@
---
# vssueId: 138
layout: LearningLayout
description: Kubernetes教程_字段选择器Field_Selector可以用来基于的一个或多个字段的取值来选取一组Kubernetes对象_下面有一些示例性的字段选择器
meta:
- name: keywords
content: Kubernetes 教程,Kubernetes Field Selector, K8S教程, K8S 教程
---
# 字段选择器
<AdSenseTitle>
[[TOC]]
</AdSenseTitle>
## 概述
字段选择器Field Selector可以用来基于的一个或多个字段的取值来选取一组Kubernetes对象。下面有一些示例性的字段选择器
* `metadata.name=my-service`
* `metadata.namespace!=default`
* `status.phase=Pending`
下面的 `kubectl` 命令选择了所有字段 `status.phase` 的取值为 `Running` 的 Pod
``` sh
kubectl get pods --field-selector status.phase=Running
```
::: tip
字段选择器本质上是一个 `filter`。默认情况下,没有添加 selector/filter 时,代表着指定资源类型的所有对象都被选中。下面个两个 kubectl 查询时等价的:
``` sh
kubectl get pods
kubectl get pods --field-selector ""
```
:::
## 支持的字段
不同的 Kubernetes 对象类型,可以用来查询的字段不一样。所有的对象类型都支持的两个字段是 `metadata.name` 和 `metadata.namespace`。在字段选择器中使用不支持的字段,将报错。例如:
``` sh
kubectl get ingress --field-selector foo.bar=baz
```
输出结果为:
```
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"
```
## 支持的操作符
字段选择器中可以使用的操作符有 `=`、`==`、`!=` `=` 和 `==` 含义相同)。例如,下面的 `kubectl` 命令,查询不在 `default` 名称空间中的 Service
``` sh
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
```
## 多选择器
可以指定多个字段选择器,用逗号 `,` 分隔。下面的 `kubectl` 命令查询所有的 `status.phase` 不等于 `Running` 且 `spec.restartPolicy` 等于 `Always` 的 Pod
``` sh
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
```
## 多种对象类型
字段选择器可以跨资源类型使用。下面的 `kubectl` 命令查询所有的不在 `default` 名称空间的 StatefulSet 和 Service
``` sh
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
```

View File

@ -52,13 +52,13 @@ metadata:
* 可以包含字母、数字、减号`-`、下划线`_`、小数点`.`
* 标签前缀:
* 标签前缀部分是可选的
* 如果指定必须是一个DNS的子域名例如project.company.com
* 如果指定必须是一个DNS的子域名例如k8s.eip.work
* 不能多于 253 个字符
* 使用 `/` 和标签名分隔
如果省略标签前缀,则标签的 key 将被认为是专属于用户的。Kubernetes的系统组件例如kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件向用户的Kubernetes对象添加标签时必须指定一个前缀。
`kubernetes.io/` 和 `k8s.io/` 这两个前缀是 Kubernetes 核心组件预留的。
`kubernetes.io/` 和 `k8s.io/` 这两个前缀是 Kubernetes 核心组件预留的。Kuboard 使用 `k8s.eip.work` 这个前缀。
标签的 value 必须:
* 不能多于 63 个字符