什么是标签
标签(Label)是附件在 Kubernetes 对象上的一组键值对,其意图是按照对用户有意义的方式来标识 Kubernetes 资源,同时,又不对 Kubernetes 的核心逻辑产生影响。
标签可以用来组织和选择一组 Kubernetes 对象。我们可以在创建 Kubernetes 对象的时候为其添加标签,也可以在创建以后为其添加标签。
每个 Kubernetes 对象可以有多个标签,但同一个对象的标签的 key 必须是唯一的。
示例:
metadata:
labels:
key1: value1
key2: value2
为什么要使用标签?
使用标签(Label)可以高效的查询和监听 Kubernetes 资源,在 Kubernetes 界面工具(如:Kubernetes DashBoard)和 kubectl 中,标签使用的非常普遍。
使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。
应用程序的部署或者批处理程序的部署通常是多维度的(如:多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象的时候,很多时候要针对某一个维护的条件做整体操作,如:将某个版本的程序整体删除。这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就非常的便捷。
标签的语法
标签是一组键值对(key/value),标签的 key 有两个部分:可选的前缀和标签名,通过 /
分隔。
- 标签前缀:
-
- 标签前缀部分是可选的。
-
- 如果指定,必须是一个 DNS 的子域名,如:k8s.eip.work 。
-
- 不能多余 253 个字符。
-
- 使用
/
和标签名分隔。
- 使用
- 标签名:
-
- 标签名部分是必须的。
-
- 不能多余 63 个字符。
-
- 必须由字母、数字开始和结尾。
-
- 可以包含字母、数字、减号(
-
)、下划线(_
)、小数点(.
)。
- 可以包含字母、数字、减号(
如果省略标签前缀,则标签的 key 就被认为是专属于用户的。Kubernetes 的系统组件(如:kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向 Kubernetes 对象添加标签的时候,必须指定一个前缀。
kubernetes.io/
和k8s.io/
这两个前缀是 Kubernetes 核心组件预留的。
- 标签的 value :
-
- 不能多于 63 个字符。
-
- 可以为空字符串。
-
- 如果不为空,则必须由字母、数字开始和结尾。
-
- 如果不为空,可以包含字母、数字、减号(
-
)、下划线(_
)、小数点(.
)。
- 如果不为空,可以包含字母、数字、减号(
示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels: # 标签
app: nginx
environment: prod
spec:
containers:
- name: nginx
image: nginx
标签选择器
通常来讲,会有多个 Kubernetes 对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器是 Kubernetes 中最主要的分类和筛选手段。
Kubernetes 的 api-server 支持两种形式的标签选择器,equality-based 基于等式的
和 set-based 基于集合的
。标签选择器可以包含多个条件,并使用逗号进行分隔,此时只要满足所有条件的 Kubernetes对象才会被选中。
-
基于等式的标签选择器,可以使用三种操作符
=
、==
、!=
。前两个操作符含义是一样的,都代表相等;后一个操作符代表不相等。# 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象 kubectl get pods -l environment=production,tier=frontend # 选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象 kubectl get pods -l tier != frontend # 选择所有包含 `partition` 标签的对象 kubectl get pods -l partition # 选择所有不包含 `partition` 标签的对象 kubectl get pods -l !partition
-
基于集合标签选择器,可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、exists。
# 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象 kubectl get pods -l environment in (production, qa) # 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象 kubectl get pods -l tier notin (frontend, backend) # 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象 kubectl get pods -l partition,environment notin (qa)
标签的操作
添加临时标签
kubectl label pod nginx-pod hello=world
更新标签
kubectl label pod nginx-pod hello=java --overwrite
删除标签
kubectl label pod nginx-pod hello-
示例
修改前面的yaml如下,添加标签:
apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-pod # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
lifecycle: # 生命周期配置
postStart: # 容器创建之后执行,如果失败会重启容器
exec: # 在容器启动的时候,执行一条命令,修改掉Nginx的首页内容
command: ["/bin/sh","-c","echo postStart ... > /usr/share/nginx/html/index.html"]
preStop: # 容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作
exec: # 在容器停止之前停止Nginx的服务
command: ["/usr/sbin/nginx","-s","quit"]
command: # 指定容器启动时执行的命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
ports:
- name: http # 端口名称
containerPort: 80 # 描述容器内要暴露什么端口
protocol: TCP # 描述该端口是基于哪种协议通信的
env: # 环境变量
- name: JVM_OPTS # 环境变量名称
value: '-Xms128m -Xmx128m' # 环境变量的值
resources:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心
memory: 128Mi # 限制内存最少使用 128兆
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
容纳后创建Pod:
kubectl create -f nginx-label.yaml
# pod/nginx-pod created
然后可以查看Pod的标签:
kubectl get po --show-labels
结果如下:
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 77s test=1.0.0,type=app
下面我临时加一个label:
kubectl label po nginx-pod env=dev1
# pod/nginx-pod labeled
结果如下:
kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 4m57s env=dev1,test=1.0.0,type=app
注意:这种临时加的标签,下次重新创建Pod时就没有了,如果想还有,在yaml文件中加。
下面看看如何使用标签选择器查询:
# 单个标签查询
kubectl get po -l type=app
# 多个标签查询
kubectl get po -l type=app,env=dev1
# in查询
kubectl get po -l 'type in (app, web)'