系列目录
在为对象定义好 Label 后, 其他对象就可以通过 Label 来对对象进行引用. Label 的最常见的用法便是通过 spec.selector 来引用对象.
- apiVersion: v1
- kind: ReplicationController
- metadata:
- name: nginx
- spec:
- replicas: 3
- selector:
- App: nginx
- template:
- metadata:
- labels:
- App: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- ports:
- - containerPort: 80
关于 Label 的用法重点在于这两步:
通过 template.metadata.labels 字段为即将新建的 Pod 附加 Label. 在上面的例子中, 新建了一个名称为 nginx 的 Pod, 它拥有一个键值对为 App:nginx 的 Label.
通过 spec.selector 字段来指定这个 RC 管理哪些 Pod. 在上面的例子中, 新建的 RC 会管理所有拥有 App:nginxLabel 的 Pod. 这样的 spec.selector 在 Kubernetes 中被称作 Label Selector.
1.1. Label 的定义
我们通常使用 metadata.labels 字段, 来为对象添加 Label.Label 可以为多个. 一个简单的例子如下:
- apiVersion: v1
- kind: Pod
- metadata:
- name: nginx
- labels:
- App: nginx
- release: stable
- spec:
- containers:
- - name: nginx
- image: nginx
- ports:
- - containerPort: 80
上面的描述文件为名为 nginx 的 Pod 添加了两个 Label, 分别为 App: nginx 和 release: stable.
注: label 为任意键值对, 只要 selector 在选择的时候匹配即可
1.1.1. 常见的 Label
一般来说, 我们会给一个 Pod(或其他对象) 定义多个 Label, 以便于配置, 部署等管理工作. 例如: 部署不同版本的应用到不同的环境中; 或者监控和分析应用 (日志记录, 监控, 报警等). 通过多个 Label 的设置, 我们就可以多维度的 Pod 或其他对象进行精细化管理. 一些常用的 Label 示例如下:
- relase: stable
- release: canary
- environment: dev
- environemnt: qa
- environment: production
- tier: frontend
- tier: backend
- tier: middleware
- ......
上面说过, Label 是自定义的一些 key/value 对, 你可以随心所欲的设置, 但是强烈建议按照一定的惯例或者组织内部规则, 以便维护管理
1.2. Label Selector
带有 Label 的对象创建好之后, 我们就可以通过 Label Selector 来引用这些对象.
通常我们通过描述文件中的 spec.selector 字段来指定 Label, 从而 Kubernetes 寻找到所有包含你指定 Label 的对象, 进行管理.
Kubernetes 目前支持两种类型的 Label Selector:
基于等式的 Selector(Equality-based)
基于集合的 Selector(Set-based)
RC 只支持基于等式的 Selector, 而 RS 两种 Selector 都支持. 而 RC 是很早版本就建议弃用的特征, 因此实际项目中强烈建议使用 Deployment 来代替 Repliation Controller (RC)
1.2.1. 基于等式的 Selector
上文中创建 RC 的例子中的使用的就是基于等式的 Selector. 基于等式的 Selector 通过等式类的表达式来进行筛选. 例如:
App=nginx 选择所有 Label 中 key 为 App,value 为 nginx 的对象.
env!=dev 选择所有 Label 中 key 为 env,value 不等于 dev 的对象.
1.2.2. 基于集合的 Selector
基于集合的 Selector 通过集合操作的表达式来进行筛选. 例如
name in (Redis-master, Redis-slave) 选择所有 Label 中 key 为 name, 并且 value 为 Redis-master 或 Redis-slave 的对象.
env not in (dev) 选择所有 Label 中 key 为 env, 并且 value 不为 dev 的对象.
使用 Label 可以给对象创建一组或多组标签, Service,ReplicationController ReplicaSet,Deployment 等组件则通过 Label Selector 来定位需要管理的对象, Label 和 Label Selector 共同构成了 Kubernetes 系统中最核心的应用模型, 使得对象能够精细分组, 同时实现了集群的高可用性.
来源: https://www.cnblogs.com/tylerzhou/p/11020761.html