k8s 标签和注解
标签和标签选择器
标签
一、介绍
标签是一种简单却功能强大的Kubemetes特性, 不仅可以组织pod, 也可以组织所有其他的Kubemetes资源。 详细来讲, 标签是可以附加到资源的任意键值对,
用以选择具有该确切标签的资源(这是通过标答选择器完成的 )。 只要标签的key在资源内是唯一的,一个资源便可以拥有多个标签。 通常在我们创建资源时就会将标
签附加到资源上, 但之后我们也可以再添加其他标签, 或者修改现有标签的值, 而无须重新创建资源。
二、应用场景
对于微服务架构, 部署的微服务数量可以轻松超过20个甚至更多。 这些组件可能是副本(部署同一组件的多个副本)和多个不同的发布版本(stable、beta、canary等)同时运行。 这样一来可能会导致我们在系统中拥有数百个pod, 如果没有可以有效组织这些组件的机制, 将会导致产生巨大的混乱。
三、标签的作用
通过标签来标识标签的用途,通过标签批量对同一标签的pod 进行操作
四、相关操作
1、创建pod 时创建标签 vi test.yaml apiVersion: vl kind: Pod metada七a: name: kubia-manual-v2 labels: app-name: pay #两个标签被附加到 pod上 env: prd kubectl create -f test.yaml 2、查看pod 带有的标签 kubectl get pod --show-labels #标签单独一列显示 kubectl get pod -L app-name,env #列出所有pod ,把app-name,env 两个标签key单独作为两列显示 3、修改现有pod的标签 kubecl label pod pod-name creation method=manual #给已有pod 添加一个标签 kubecl label pod kubia-manual-v2 env=debug --overwrite #更改已有的标签
标签选择器
标签选择器允许我们选择标记有特定标签的pod子集, 并对这些 pod执行操作。 可以说标签选择器是一种能够根据是否包含具有特定值的特定标签来过滤资源的准则。
标签选择器根据资源的以下条件来选择资源:
• 包含(或不包含)使用特定键的标签 • 包含具有特定键和值的标签 • 包含具有特定键的标签, 但其值与我们指定的不同
标签选择器的使用
kubectl get pods -l app-name=pay #列出标签键值对为app-name=pay 的pod kubectl get po -1 env #列出标签key 为env 的pod kubectl get po -1 '!env' #列出标签key 不是env 的pod,注意只能是单引号 同理, 我们也可以将pod与以下标签选择器进行匹配: • creation_rnethod!=rnanual #选择带有creation_rnethod标签, 并且值不等于manual的pod • env in (prod, devel) #选择带有env标签且值为prod或devel的pod • env notin (prod, devel) #选择带有env标签, 但其值不是prod或devel的pod
标签选择器不仅帮助我们列出pod, 在对一个子集中的所有pod都执行操作时也具有重要意义。 例如, 在本章的后面我们将看到如何使用标签选择器来实现一次删除多个pod。 此外标签选择器不只是被kubectl使用, 它们在内部也被使用过。
使用标签和选择器来约束pod调度
由于Kubemetes将集群中的所有节点抽象为一个整体的大型部署平台, 因此对千你的pod 实际调度到哪个节点而言是无关紧要的。某些情况下, 我们希望对将pod调度到何处持一 定发言权, 你的硬件基
础设施并不是同质便是一个很好的例子。 如果你的某些工作节点使用机械硬盘, 而其他节点使用固态硬盘, 那么你 可能想将一些pod调度到 一组节点。
使用标签分类工作节点
kubectl label node gke-kubia-node-Orrx gpu=rue
通过节点选择器为创建的pod 选择节点
spec: nodeSelector. gpu:true"
注意:
我们不会特别说明pod应该调度到哪个节点上, 因为这将会使应用程序与基础架构强耦合, 从而违背了Kubemetes对运行在其上的应用程序隐藏实际 的基础架构的整个构想。 但如果你想对 一个 pod应该调度到哪里拥有发言权, 那就不应该直接指定 一个确切的节点, 而应该用某种方式描述对节点的需求, 使Kubemetes选择一个符合这些需求的节点。这恰恰可以通过节点标签和节点标签选择器完成。
我们也可以将pod调度到某个确定的节点,由于每个节点都有一个唯 一标签 , 其中键为kuberne七es.io/hostname, 值为该 节点的 实际主机名,因此我们也可以将pod调度到某个确定的节点。但如果节点处于离线状态,通过hostname 标签将nodeSelector设置为特定节点可能会导致pod不可调度。我们绝不应该考虑单个节点,而 是应该通过标签选择器考虑符合特定标准的逻辑节点组。
注解
除标签外,pod和其他对象还可以包含庄解。注解也是键值对,所以它们本质上与标签非常相似。但与标签不同,注解并不是为了保存标识信息而 存在的,它们不能像标签 一 样用千对对象进行分组。当我们可以通过标签选择器选择对象时,就不存在注解选择器这样的东西。
创建
vi test.yaml ... ... metadata: annotations: kuberne七es.io/created-by: {"kind":"Seria巨zedReference", "apiVersion": "vl", "reference":{"kind":"Rep巨ca巨onController", "namespace": "default",...
添加和修改
kubect1 annotate pod asdf mycompany.com/someannotation="foo bar"