我们知道使用 pod 控制器创建的 pod,在 pod 故障以后重建后的 pod ip 地址和名称是变化的,为了解决 pod 访问问题,我们特此创建了 service,我们访问 service 的 ip 地址就可以正常访问到 pod;那么问题来了,service 是怎样去关联 pod 的呢?在 k8s 上如果使用 pod 控制创建的 pod,在 pod 发生故障以后,对应 pod 会被对应的控制器重启或重建,一个 pod 重建以后,对应的 ip 地址和名称都是会发生变化的,所以靠 ip 地址和名称关联 pod 是不行的;那靠什么关联 pod 呢?在 k8s 上是使用的标签和标签选择器的机制实现资源和资源间相互关联的。
什么是标签?它的作用是干嘛用的?
所谓标签就是指一个键值数据,在 k8s 上任何资源都可以拥有标签;我们可以在创建资源时在配置清单中指定,也可以创建好资源以后再使用命令添加标签;有了标签以后,我们后续就可以根据标签来管理对应的资源;一个资源可以拥有多个标签,同时一个标签也可以附加给多个资源;我们可以理解为标签就是用来逻辑的对资源进行分组,拥有相同标签的资源为一组;标签的作用是方便用户管理资源;比如在 k8s 上运行了几百个 pod,我们想要管理功能相同的 pod,就可以把具有相似功能的 pod 附加同一个标签,然后要管理这些 pod 的时,直接指定拥有指定标签的 pod 即可。
一、什么是 Kubernetes 标签
要学习 k8s 标签,需要从以下几个方面来学习。 首先,我们需要知道什么是 k8s 标签。
在 k8s 中,标签(Labels)是附加到 k8s 对象(比如 Pods)上的键值对。
标签的一个示例如下所示:
“metadata”:{
“labels”:{
“key1” : ”value1”
“key2” : ”value2”
}
}
标签的作用主要有两点:
- 一是标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。
- 二是标签可以用于组织和选择对象的子集。
标签的特点主要有如下三点:
- 每个对象都可以定义一组键值标签。
- 每个键对于给定对象必须是唯一的。
- 标签能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的。
二、设计标签的目的
设计标签的主要目的是使用户能够以松耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射。
有如下几个示例标签,例如:
在区分发行版本的时候,可以指定:
- “release” : “canary”
- “release” : “dev”
- “release” : “beta”
- “release” : “stable”
- ……
在定义运行环境时,可以指定:
- “environment”: “dev”
- “environment”: “qa”
- “environment”: “production”
- ……
三、标签的语法
接着,我们来学习下标签的语法。
1. 前缀:
- 前缀是可选的;
- 如果指定,前缀必须是 DNS 子域:由点 “.” 分割的一系列 DNS 标签,总共不超过 253 个字符,后跟斜杠 “/”;
- 如果省略前缀,则假定标签键对用户是私有的。向最终用户对象添加标签的自动系统组件(例如:kube-scheduler、kube-controller-manager、kube-apiserver、kubctl 或其他第三方自动化工具)必须指定前缀
2. 名称:
- 名称段是必需的
- 必须小于等于 63 个字符,以字母数字字符 “[a-z0-9A-Z]” 开头和结尾,带有破折号 “—”,下划线 “_”,点 “.” 和之前的字母数字
3. 小结:有效的标签值
- 必须为 63 个字符或更少(可以为空);
- 除非标签值为空,必须以字母数字字符 “[a-z0-9A-Z]” 开头和结尾;
- 包含破折号 “—”,下划线 “_”,点 “.” 和之前的字母数字
示例:是一个有 environment 为 qa,同时 app 为 nginx 标签的 pod 配置文件。
apiVersion:v1
kind:Pod
metadata:
name:label-demo
labels:
environment:production
app:nginx
spec:
containers:
-name:nginx
Image:nginx:1.14.2
Ports:
-containerPort:80
四、标签选择运算符
然后,我们来学习下标签选择运算符。 标签选择运算符分为两种:
- 一种是基于等值的需求:基于等值或基于不等值的需求允许按标签键和值进行过滤。 可接受的运算符有 “=”、“==”、“!=”。
- 一种是基于集合的需求:基于集合的标签需求允许你通过一组值来过滤键。 持有三种操作符:“in”、“notin”、“exists”。
最后,我们来学习下如何使用 API 来使用标签。 前面提到的两种标签选择算符都可以通过 REST 客户端用于 list 或者 watch 资源。
基于等值的需求可以使用如下命令来获取 pods。
Kubectl get pods –l environment-production,tier=frontend
基于集合的需求可以使用如下命令来获取 pods。
Kubectl get pods –l ‘environment in (production),tier in (frontend)’
五、标签的使用
K8S 中资源标签 label
1. 说明
标签 label:
- 资源标志
- 格式 key=value
- 可添加删除多个标签
标签选择器 label selector:
- 用于选择资源
name=name1
name!=name1
name in (name1,name2)
name not in (name1,name2)
2. 指令
(1) 帮助:
kubectl label --help
(2) 打标签:
pod:kubectl label pods busybox app=busybox
node:kubectl label node k8s-node01 k8s-node02 env=test
(3) 查看:
- 查看 pods 为 busybox 的标签:
kubectl get pods busybox --show-labels
- 查看默认名称空间下所有 pod 资源的标签:
kubectl get pods --show-labels
- 查看指定名称空间:
kubectl get pods -n kube-system --show-labels
(4) 更新:
加上–overwrite 参数修改标签:
kubectl get pods -n kube-system --show-labels
(5) 通过标签筛选:
- 列出默认名称空间下标签 key 是 app 的 pod,不显示标签:
kubectl get pods -l app
- 列出默认名称空间下标签 key 是 app、值是 busybox 的 pod,不显示标签:
kubectl get pods -l app=busybox
- 多个筛选条件:
kubectl get po -l version!=v1,app=nginx
(6) 删除:
pod:kubectl label po busybox app- -n kube-public
node:kubectl label node k8s-node02 env-
3. 配置
(1) 创建 label-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
version: "1.0.0"
env: "test"
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
(2) 创建
kubectl create -f label-nginx.yaml
(3) 删除
kubectl delete -f label-nginx.yaml
以上就是 K8s 标签的介绍。