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