K8s学习笔记 (11)
@ wgjak47 | 星期一,八月 5 日,2019 年 | 5 分钟阅读 | 更新于 星期一,八月 5 日,2019 年

k8s学习笔记

集群扩展

Kubernetes是一个高度开放可扩展的架构,可以通过自定义资源类型CRD来定义自己的类型,还可以自己来扩展API服务,用户的使用方式跟Kubernetes的原生对象无异。

使用自定义资源扩展API

自定义资源是对Kubernetes API的扩展,kubernetes中的每个资源都是一个API对象的集合。

自定义资源

使用CustomResourceDefinition创建自定义资源

扩展API

自定义资源实际上是为了扩展kubernetes的API,向kubenetes API中增加新类型,可以使用以下三种方式:

  • 修改kubenetes的源码,显然难度比较高,也不太合适
  • 创建自定义API server并聚合到API中
  • 1.7以下版本编写TPR,kubernetes1.7及以上版本用CRD

编写API的几点原则:

  • 你的API是否属于声明式的
  • 是否想使用kubectl命令来管理
  • 是否要作为kubenretes中的对象类型来管理,同时显示在kubernetes dashboard上
  • 是否可以遵守kubernetes的API规则限制,例如URL和API group、namespace限制
  • 是否可以接受该API只能作用于集群或者namespace范围
  • 想要复用kubernetes API的公共功能,比如CRUD、watch、内置的认证和授权等

CRD

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
# 名称必须符合下面的格式:<plural>.<group>
name: crontabs.stable.example.com
spec:
# REST API使用的组名称:/apis/<group>/<version>
group: stable.example.com
# REST API使用的版本号:/apis/<group>/<version>
version: v1
# Namespaced或Cluster
scope: Namespaced
names:
# URL中使用的复数名称: /apis/<group>/<version>/<plural>
plural: crontabs
# CLI中使用的单数名称
singular: crontab
# CamelCased格式的单数类型。在清单文件中使用
kind: CronTab
# CLI中使用的资源简称
shortNames:
- ct
# 自定义kubectlget的时候额外现实哪些列
additionalPrinterColumns:
- name: Spec
type: string
description: The cron spec defining the interval a CronJob is run
JSONPath: .spec.cronSpec
- name: Replicas
type: integer
description: The number of jobs launched by the CronJob
JSONPath: .spec.replicas
- name: Age
type: date
JSONPath: .metadata.creationTimestamp

-----
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
# 对于具有终止器的一个对象,删除请求仅仅是为metadata.deletionTimestamp字段设置一个值,
# 而不是删除它,这将触发监控该对象的控制器执行他们所能处理的任意终止器。等到所有终结器执行完成   # 后才会删除该对象。
# 值metadata.deletionGracePeriodSeconds控制轮询更新之间的间隔。
finalizers:
- finalizer.stable.example.com
spec:
cronSpec: "* * * * /5"
image: my-awesome-cron-image

自定义API验证

可以通过openapi v3验证自定义对象。但是schema有一下限制:

  • 字段default、nullable、discriminator、readOnly、writeOnly、xml、 deprecated 和 $ref 不能设置。
  • 该字段 uniqueItems 不能设置为 true。
  • 该字段 additionalProperties 不能设置为 false。

例子:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
version: v1
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
# 类别是自定义资源所属的分组资源的列表
categoires:
- all
validation:
# openAPIV3Schema 适用于验证自定义对象的 schema。
openAPIV3Schema:
properties:
spec:
properties:
cronSpec:
type: string
pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10

子资源

例子:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
# subresources describes the subresources for custom resources.
subresources:
# status enables the status subresource.
status: {}
# scale enables the scale subresource.
scale:
# specReplicasPath defines the JSONPath inside of a custom resource that corresponds to Scale.Spec.Replicas.
specReplicasPath: .spec.replicas
# statusReplicasPath defines the JSONPath inside of a custom resource that corresponds to Scale.Status.Replicas.
statusReplicasPath: .status.replicas
# labelSelectorPath defines the JSONPath inside of a custom resource that corresponds to Scale.Status.Selector.
labelSelectorPath: .status.labelSelector
状态(status)
  • 状态和规范节分别由自定义资源内的 JSONPath .status 和 .specJSONPath 表示。
  • PUT /status 对子资源的请求采用自定义资源对象,并忽略除状态节之外的任何更改。
  • PUT /status 对子资源的请求仅验证自定义资源的状态节。
  • PUT/ POST/ PATCH 请求自定义资源忽略更改状态节。
  • 对 spec 节的任何更改都会增加 .metadata.generation 的值。
  • 在 CRD OpenAPI 验证模式的根目录中只允许以下构造:
  • Description
  • Example
  • ExclusiveMaximum
  • ExclusiveMinimum
  • ExternalDocs
  • Format
  • Items
  • Maximum
  • MaxItems
  • MaxLength
  • Minimum
  • MinItems
  • MinLength
  • MultipleOf
  • Pattern
  • Properties
  • Required
  • Title
  • Type
  • UniqueItems
扩展(scale)

启用 scale 子资源后,将公开自定义资源的子资源 /scale。该 autoscaling/v1.Scale 对象作为有效负载发送 /scale。 要启用 scale 子资源,CustomResourceDefinition 中需要定义以下值。

  • SpecReplicasPath 在与之对应的自定义资源中定义 JSONPath Scale.Spec.Replicas
  • StatusReplicasPath 在与之对应的自定义资源中定义 JSONPath Scale.Status.Replicas
  • LabelSelectorPath在与之对应的自定义资源中定义 JSONPath Scale.Status.Selector

自定义控制器

单纯设置了自定义资源,并没有什么用,只有跟自定义控制器结合起来,才能将资源对象中的声明式API翻译成用户所期望的状态。自定义控制器可以用来管理任何资源类型,但是一般是跟自定义资源结合使用。

API聚合

Aggregated(聚合的)API server是为了将原来的API server这个巨石(monolithic)应用给拆分成,为了方便用户开发自己的API server集成进来,而不用直接修改kubernetes官方仓库的代码,这样一来也能将API server解耦,方便用户使用实验特性。这些API server可以跟core API server无缝衔接,使用kubectl也可以管理它们。

APIService

APIService是用来表示一个特定的GroupVersion的中的server。例子:

apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
name: v1alpha1.custom-metrics.metrics.k8s.io
spec:
# 当与该服务通信时,禁用TLS证书认证。强加建议不要设置这个参数,默认为 false。应该使用CABundle代替。
insecureSkipTLSVerify: true
# 与该APIService通信时引用的service,其中要注明service的名字和所属的namespace,如果为空的话,则所有的服务都会该API groupversion将在本地443端口处理所有通信。
group: custom-metrics.metrics.k8s.io
# 该组API的处理优先级,如果相同,则使用字典序
groupPriorityMinimum: 1000
# VersionPriority控制其组内的API版本的顺序
versionPriority: 5
service: name: api
namespace: custom-metrics
version: v1alpha1