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: v1kind: Podmetadata: name: label-demo labels: environment: production app: nginxspec: 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: v1kind: Podmetadata: name: nginx-testspec: 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: v1kind: Podmetadata: 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 podskubectl 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的主要内容,如果未能解决你的问题,请参考以下文章

Atom编辑器入门到精通 Atom使用进阶

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Atom编辑器入门到精通 Atom使用进阶

第二篇:二进制部署K8s集群进阶使用

K8s进阶

K8s进阶