标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对
旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义
标签可以用于组织和选择对象的子集
标签可以在创建时附加到对象,随后可以随时添加和修改
每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的
因为标签是能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的
标签使用户能够以松散耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射。
服务部署和批处理流水线通常是多维实体(例如,多个分区或部署、多个发行序列、多个层,每层多个微服务)。 管理通常需要交叉操作,这打破了严格的层次表示的封装,特别是由基础设施而不是用户确定的严格的层次结构。
"release" : "stable"
, "release" : "canary"
"environment" : "dev"
, "environment" : "qa"
, "environment" : "production"
"tier" : "frontend"
, "tier" : "backend"
, "tier" : "cache"
"partition" : "customerA"
, "partition" : "customerB"
"track" : "daily"
, "track" : "weekly"
标签的 Key 对于给定对象必须是唯一的
它是一个键值对
有效的标签键有2个段:可选的前缀和名称,用斜杠/
分隔
[a-z0-9A-Z]
开头和结尾.
分隔的一系列 DNS 标签/
如果省略前缀,则假定标签键对于用户是私有的
如果向最终用户对象添加标签的自动系统组件,例如: kube-scheduler
、kube-controller-manager
、 kube-apiserver
、kubectl
或其他第三方自动化工具,必须指定前缀
kubernetes.io/
和 k8s.io/
前缀是为 Kubernetes 核心组件保留的
有效的标签值:
[a-z0-9A-Z]
)开头和结尾-
)、下划线(_
)、点(.
)和字母或数字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
以一个最基础的deploy对象为例
对于指令式来说
通过kubectl label --help
查看了一个示例
kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
##执行几次部署
kubectl create deploy nginx-demo1 --image=nginx:1.21-alpine
kubectl create deploy nginx-demo2 --image=nginx:latest
kubectl create deploy tomcat-demo1 --image=tomcat:latest
kubectl get deploy -owide
##kubectl label pods foo unhealthy=true
kubectl label deploy nginx-demo1 image=nginx-1.21-alpine
##加参数覆盖即可
kubectl label deploy nginx-demo1 image=nginx-1.21-alpine-test --overwrite
kubectl label deploy nginx-demo1 image-
对于yaml文件
通过定义在metadata
下面来形成标签
kubectl explain deploy
kubectl explain deploy.metadata
kubectl explain deploy.metadata.labels
######################################################
Map of string keys and values
##label-demo.yaml##
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tomcat-demo ## 标签1
environment: production ## 标签2
name: tomcat-demo
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-demo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
spec:
containers:
- image: tomcat
name: tomcat
resources: {}
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
environment-demo: production-demo
name: tomcat-demo
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-demo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
spec:
containers:
- image: tomcat
name: tomcat
resources: {}
因为标签不支持唯一性,实际环境中许多对象携带着相同的标签
基于等值或基于不等值的需求允许按标签键和值进行过滤。 匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。 可接受的运算符有 =、== 和 != 三种。 前两个表示相等(并且是同义词),而后者表示不相等。
这个东西应该就是快速查找用的吧
##我们按照这个模板准备3次部署
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
environment: dev
#environment: qa
#environment: production
name: tomcat-demo
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-demo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
spec:
containers:
- image: tomcat
name: tomcat
resources: {}
#########对于tomcat-demo1#########
Labels: app=tomcat-demo1
environment=dev
#########对于tomcat-demo2#########
Labels: app=tomcat-demo2
environment=qa
#########对于tomcat-demo3#########
Labels: app=tomcat-demo3
environment=production
###我要查一下标签中environment=dev的部署信息
kubectl get deploy -l environment=dev -owide
###多查几个条件(逗号是且的关系,都要满足)
kubectl get deploy -l environment=dev,app=tomcat-demo1 -owide
kubectl get deploy -l environment=dev,app=tomcat-demo1,app=tomcat-demo3 -owide
kubectl get deploy -l app!=tomcat-demo3 -owide
kubectl get deploy -l app==tomcat-demo3 -owide
基于集合的标签需求允许你通过一组值来过滤键。 支持三种操作符:in、notin 和 exists(只可以用在键标识符上)
示例说明:
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
第一个示例选择了所有键等于 environment
并且值等于 production
或者 qa
的资源。
第二个示例选择了所有键等于 tier
并且值不等于 frontend
或者 backend
的资源,以及所有没有 tier
键标签的资源。
第三个示例选择了所有包含了有 partition
标签的资源;没有校验它的值。
第四个示例选择了所有没有 partition
标签的资源;没有校验它的值。
###我要找出标签信息为environment的值为dev、qa
kubectl get deploy -l 'environment in (dev, qa)' -owide
### 找出键environment并且值不等于dev、qa的
kubectl get deploy -l 'environment notin (dev,qa)' -owide
kubectl get nodes --show-labels
[root@k8s-01 ~]# kubectl get nodes k8s-01 --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-01 Ready control-plane,master 9d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
[root@k8s-01 ~]#
kubectl label nodes k8s-01 disktype=ssd
看下节点信息
[root@k8s-01 ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-01 Ready control-plane,master 9d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-02 Ready worker 9d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-02,kubernetes.io/os=linux,node-role.kubernetes.io/worker=
k8s-03 Ready worker 9d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-03,kubernetes.io/os=linux,node-role.kubernetes.io/worker=
[root@k8s-01 ~]#
给任意工作节点打一个标签
kubectl label nodes k8s-02 environment=dev
准备一个 pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector: ## 节点选择器,表示该pod调度到有environment: dev标签的节点上
environment: dev
运行一下
kubectl apply -f pod.yaml
检查一下调度情况
kubectl describe pod nginx
可以看到默认调度器调度到k8s-02
节点上了
层层解释一下,注解这个东西
kubectl explain deploy.metadata.annotations
注解(Annotations) 存储的形式是键/值对:
/
分隔
.
)分隔的 DNS 标签, 总计不超过 253 个字符,后跟斜杠(/
)kube-scheduler
,kube-controller-manager
,kube-apiserver
,kubectl
或其他第三方组件),必须为终端用户添加注解前缀。[a-z0-9A-Z]
)开头和结尾-
),下划线(_
),点(.
)和字母数字以下是一些例子,用来说明哪些信息可以使用注解来记录:
由声明性配置所管理的字段。 将这些字段附加为注解,能够将它们与客户端或服务端设置的默认值、 自动生成的字段以及通过自动调整大小或自动伸缩系统设置的字段区分开来。
构建、发布或镜像信息(如时间戳、发布 ID、Git 分支、PR 数量、镜像哈希、仓库地址)。
指向日志记录、监控、分析或审计仓库的指针。
可用于调试目的的客户端库或工具信息:例如,名称、版本和构建信息。
用户或者工具/系统的来源信息,例如来自其他生态系统组件的相关对象的 URL。
轻量级上线工具的元数据信息:例如,配置或检查点。
负责人员的电话或呼机号码,或指定在何处可以找到该信息的目录条目,如团队网站。
从用户到最终运行的指令,以修改行为或使用非标准功能。
你可以将这类信息存储在外部数据库或目录中而不使用注解, 但这样做就使得开发人员很难生成用于部署、管理、自检的客户端共享库和工具。
对于指令式来说
我们部署了一次应用kubectl create deploy tomcat --image=tomcat
查看一下这次部署的注解信息kubectl describe deploy tomcat
kubectl annotate --help
##
kubectl annotate deploy tomcat author='whale'
对于yaml来说
这是一次部署信息
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
environment: production
name: tomcat-demo
annotations: # 这是注解
imageregistry: https://hub.docker.com/
author: whale
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-demo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat-demo
spec:
containers:
- image: tomcat
name: tomcat
resources: {}