k8s的进阶--05
Posted 王佐的运维笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s的进阶--05相关的知识,希望对你有一定的参考价值。
Label(标签)是Kubernetes系统中另外一个核心概念。一个Label是 一个key=value的键值对,其中key与value由用户自己指定。Label可以被 附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对 象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的 资源对象上。Label通常在资源对象定义时确定,也可以在对象创建后 动态添加或者删除。
我们可以通过给指定的资源对象捆绑一个或多个不同的Label来实 现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调 度、配置、部署等管理工作。例如下边是一些常用的标签。
版本标签:release=stable, release=canary
环境标签:environment=dev , environment=qa, environment=production
架构标签:tier=frontend, tier=backend, tier=middleware
分区标签:partition=customerA, partition=customerB
质量管控标签:track=daily,track=weekly
使用标签(Label)可以高效地查询和监听Kubernetes对象,在Kubernetes界面工具(如 Kubenetes Dashboard 或 Kuboard)和 kubectl 中,标签的使用非常普遍。
标签格式如下:
metadata:
labels:
key1: value1
key2: value2
标签的句法和字符集:
签是一组名值对(key/value pair)。标签的 key 可以有两个部分:可选的前缀和标签名,通过 / 分隔。
标签名:
标签名部分是必须的
不能多于 63 个字符
必须由字母、数字开始和结尾
可以包含字母、数字、减号-、下划线_、小数点.
标签前缀:
标签前缀部分是可选的
如果指定,必须是一个DNS的子域名,例如:k8s.demo.work
不能多于 253 个字符
使用 / 和标签名分隔
如果省略标签前缀,则标签的 key 将被认为是专属于用户的。Kubernetes的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的Kubernetes对象添加标签时,必须指定一个前缀。
kubernetes.io/ 和 k8s.io/ 这两个前缀是 Kubernetes 核心组件预留的。Kuboard 使用 k8s.demo.work 这个前缀。
标签的 value 必须:
不能多于 63 个字符
可以为空字符串
如果不为空,则
必须由字母、数字开始和结尾
可以包含字母、数字、减号-、下划线_、小数点.
例如,下面的例子中的Pod包含两个标签 environment: production 和 app:nginx
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.18.1
ports:
- containerPort: 80
标签选择器:
与 name 和 UID 不同,标签不一定是唯一的。通常来讲,会有多个Kubernetes对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器(label selector)是 Kubernetes 中最主要的分类和筛选手段。
Kubernetes api server支持两种形式的标签选择器,equality-based 基于等式的 和 set-based 基于集合的。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的 Kubernetes 对象才会被选中。
如果使用空的标签选择器或者不指定选择器,其含义由具体的 API 接口决定。
基于等式的选择方式
Equality- 或者 inequality-based 选择器可以使用标签的名和值来执行过滤选择。只有匹配所有条件的对象才被选中(被选中的对象可以包含未指定的标签)。可以使用三种操作符 =、==、!=。前两个操作符含义是一样的,都代表相等,后一个操作符代表不相等。例如:
# 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
environment = production
# 选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象
tier != frontend
也可以使用逗号分隔的两个等式 environment=production,tier!=frontend,此时将选中所有 environment 为 production 且 tier 不为 frontend 的对象。
以 Pod 的节点选择器为例,下面的 Pod 可以被调度到包含标签 name=app01 的节点上:
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
spec:
containers:
- name: cuda-test
image: nginx:1.18.1
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
name: app01
基于集合的选择方式
Set-based 标签选择器可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、exists。例如:
# 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
environment in (production, qa)
# 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
tier notin (frontend, backend)
# 选择所有包含 `partition` 标签的对象
partition
# 选择所有不包含 `partition` 标签的对象
!partition
可以组合多个选择器,用 , 分隔,, 相当于 AND 操作符。例如:
# 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象
partition,environment notin (qa)
基于集合的选择方式是一个更宽泛的基于等式的选择方式,例如,environment=production 等价于environment in (production);environment!=production 等价于 environment notin (production)。
基于集合的选择方式可以和基于等式的选择方式可以混合使用,例如:partition in (customerA, customerB),environment!=qa
API:
查询条件
LIST 和 WATCH 操作时,可指定标签选择器作为查询条件,以筛选指定的对象集合。两种选择方式都可以使用,但是要符合 URL 编码,例如:
1.基于等式的选择方式:
?labelSelector=environment%3Dproduction,tier%3Dfrontend
2.基于集合的选择方式:
?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29
Kubernetes对象引用
某些 Kubernetes 对象中(例如,Service和Deployment),使用标签选择器指定一组其他类型的 Kubernetes 对象(例如,Pod)
Service
Service 中通过 spec.selector 字段来选择一组 Pod,并将服务请求转发到选中的 Pod 上。
在 yaml 或 json 文件中,标签选择器用一个 map 来定义,且支持基于等式的选择方式,例如:
"selector": {
"component" : "mysql",
}
或者
selector:
component: mysql
上面的例子中定义的标签选择器等价于 component=mysql 或 component in (mysql)。
注解annotation
Annotation,顾名思义,就是注解。Annotation可以将Kubernetes资源对象关联到任意的非标识性元数据。使用客户端(如工具和库)可以检索到这些元数据。Annotation与Label类似,也使用key/value键值对的形式进行定义。不同的Label具有严格的命名规则,它定义的是Kubernetes对象的元数据(Metadata),并且用于Label Selector。而Annotation则是用户任意定义的“附加”信息,以便于外部工具进行查找,很多时候,Kubernetes的模块自身会通过Annotation的方式标记资源对象的特殊信息。
向Kubernetes对象添加注解
Kubernetes 对象的 metadata 字段可以添加自定义的标签(label)或者注解(annotation)。标签用来选择对象或者用来查找符合指定条件的一组对象。与此相对,注解不是用来标记对象或者选择对象的。metadata 中的注解可以很大,也可以很小;可以是结构化的,也可以是非结构化的;还可以包括标签中不允许出现的字符。
与标签相似,注解也是 key/value map,例如:
metadata:
annotations:
key1: value1
key2: value2
类似于下面的信息可以记录在注解中:
声明式配置层用到的状态信息。
Build、release、image信息,例如 timestamp、release ID、git branch、PR number、image hash、registry address
日志、监控、分析、审计系统的参数
第三方工具所需要的信息,例如 name、version、build information、URL
轻量级的发布工具用到的信息,例如,config、checkpoint
用户用来记录备忘信息的说明,例如,对标准镜像做了什么样的修改、维护过程中有什么特殊信息需要记住
下面是一个来自于实际 Deployment 的注解:
metadata:
annotations:
deployment.kubernetes.io/revision: 7 # 由Deployment控制器添加,用于记录当前发布的修改次数
k8s.demo.work/displayName: busybox # Kuboard添加,Deployment显示在Kuboard界面上的名字
k8s.demo.work/ingress: false # Kuboard添加,根据此参数显示Deployment是否配置了Ingress
k8s.demo.work/service: none # Kuboard添加,根据此参数显示Deployment是否配置了Service
除了使用注解,您也可以将这类信息存放在一个外部的数据库,然而,在使用、分享这些信息的时候,可能会变得难以管理。
句法和字符集
注解是一组名值对。
注解的 key 有两个部分:可选的前缀和标签名,通过 / 分隔。
注解名:
标签名部分是必须的
不能多于 63 个字符
必须由字母、数字开始和结尾
可以包含字母、数字、减号-、下划线_、小数点.
注解前缀:
注解前缀部分是可选的
如果指定,必须是一个DNS的子域名,例如:k8s.demo.work
不能多于 253 个字符
使用 / 和标签名分隔
如果省略注解前缀,则注解的 key 将被认为是专属于用户的。Kubernetes的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的Kubernetes对象添加注解时,必须指定一个前缀。
kubernetes.io/ 和 k8s.io/ 这两个前缀是 Kubernetes 核心组件预留的。Kuboard 使用 k8s.demo.work 这个前缀。
下面的例子中,Pod包含一个注解 imageregistry: https://hub.docker.com/
apiVersion: v1
kind: Pod
metadata:
name: annotations-demo
annotations:
imageregistry: "https://hub.docker.com/"
spec:
containers:
- name: nginx
image: nginx:1.18.1
ports:
- containerPort: 80
字段选择器
字段选择器(Field Selector)可以用来基于的一个或多个字段的取值来选取一组Kubernetes对象。下面有一些示例性的字段选择器:
metadata.name=my-service
metadata.namespace!=default
status.phase=Pendin
下面的 kubectl 命令选择了所有字段 status.phase 的取值为 Running 的 Pod:
kubectl get pods --field-selector status.phase=Running
TIP
字段选择器本质上是一个 filter。默认情况下,没有添加 selector/filter 时,代表着指定资源类型的所有对象都被选中。下面个两个 kubectl 查询时等价的:
kubectl get pods
kubectl get pods --field-selector ""
支持的字段:
不同的 Kubernetes 对象类型,可以用来查询的字段不一样。所有的对象类型都支持的两个字段是 metadata.name 和 metadata.namespace。在字段选择器中使用不支持的字段,将报错。例如:
kubectl get ingress --field-selector foo.bar=baz
输出结果为:
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"
支持的操作符
字段选择器中可以使用的操作符有 =、==、!= (= 和 == 含义相同)。例如,下面的 kubectl 命令,查询不在 default 名称空间中的 Service:
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
多选择器
可以指定多个字段选择器,用逗号 , 分隔。下面的 kubectl 命令查询所有的 status.phase 不等于 Running 且 spec.restartPolicy 等于 Always 的 Pod:
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
多种对象类型
字段选择器可以跨资源类型使用。下面的 kubectl 命令查询所有的不在 default 名称空间的 StatefulSet 和 Service:
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
ps:最近的内容比较枯燥 都是一些概念性的东西,大家可以慢慢看。
麻烦点个在看支持下作者
以上是关于k8s的进阶--05的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情