Kubernetes学习笔记-kubernetes应用扩展-自定义API对象(1)20230622

1、CustomResourceDefinitions介绍

开发者只需要只需向kubernetes api服务器提交CRD对象,即可定义新的资源类型。成功提交CRD之后,就能通过API服务器提交JSON清单或者YAML清单的方式创建自定义资源,以及其他kubernetes资源实例

创建一个CRD对象

website-crd.yaml

apiVersion:apiextensions.k8s.io/v1beta1

kind:CustomResourceDefinition

metadata:

        name:websites.extensions.example.com

spec:

        scope:Namespaced

group:extensions.example.com

version:v1

names:

        kind:Website

        singular:website

        plural:website

命令行创建crd

$kubectl create -f website-crd-definition.yaml

创建自定义资源实例

一个自定义网站资源:kubia-website.yaml

apiVersion:extensions.example.com/v1

kind:Website

metadata:

        name:kubia

spec:

        gitRepo:https://github.com/luksa/kubia-website-example.git

 这个自定义资源的kind是website,而apiversion是由api组和你在crd中定义的版本号两部分组成的。

创建网站对象:

$kubectl create -f kubia-website.yaml 

检索自定义资源实例

$kubectl get websites

删除自定义资源实例

$kubectl  delete website kubia

注意:删除的是网站实例,而不是网站CRD资源。

2、使用自定义控制器自动定制资源

为了让你的网站对象运行在一个通过服务暴露的web服务器pod,需要构建和部署一个网站控制器,它能查看api服务器创建网站对象的过程,然后为每一个对象创建服务和web服务器pod

控制器将创建Deployment资源,而不是直接创建非托管pod,这样就能确保pod既能被管理,还能在遇到节点故障时继续正常工作。

使用网站控制器创建网站对象并创建Deployment和Service

Kubernetes学习笔记-kubernetes应用扩展-自定义API对象(1)20230622_第1张图片

了解网站控制器的功能

启动后,控制器立即开始通过以下URL 请求查看网站对象:

http://localhost:8080/apis/extensions.example.com/v1/websites?watch=true

通过识别主机名和端口,控制器不直接连接到API服务器,而是连接到kubectl proxy进程。该进程在同一个po中的sidecar容器中运行,并充当API服务器的ambassador。代理将请求转发给API服务器,并同时处理TLS加密认证。

Kubernetes学习笔记-kubernetes应用扩展-自定义API对象(1)20230622_第2张图片

通过HTTP GET请求打开链接,API服务器将针对任何网站对象的每个更改发送监听事件(watch event) 

每次创建新的网站对象时,API服务器都会发生ADDED监听事件。当控制器收到这样的事件时,就会在该监听事件所包含的网站对象中提取网站名称和Git存储库的url,然后将他们的json清单发布到api服务器,来创建Deployment和Service对象

Deployment资源包含一个具有两个容器的pod模版:其中一个容器运行nginx服务器,另一个容器则运行gitsync进程,用来保持本地目录与Git仓库的内容同步。本地目录通过一个emptyDir卷与nginx容器共享。作为一个NodePort Service,他通过每个节点上的随机端口公开你的web服务器pod(所有节点使用相同的端口)。这样,当Deployment对象创建一个pod时,用户既可以通过节点端口访问该网站。

当网站资源实例被删除时,API服务器还会发送DELETED监听事件。在收到监听事件厚,控制器就会删除之前创建的Deployment资源和Service资源。与此同时,控制器也会关闭并删除该网站提供服务的web服务器。

Kubernetes学习笔记-kubernetes应用扩展-自定义API对象(1)20230622_第3张图片

 3、验证自定义对象

在kubernetes1.8版本中,自定义对象的验证作为alpha特性被引入。如果想要让API服务器验证自定义对象,需要再API服务器中启用CustomResoureceValidation特性,并在CRD中指定一个JSON schema。

4、为自定义对象提供自定义API服务器

如果想要更好的支持在kubernetes中添加自定义对象,最好的方式是使用你自己的API服务器,并让他直接与客户端进行交互。

API服务器聚合

Kubernetes学习笔记-kubernetes应用扩展-自定义API对象(1)20230622_第4张图片

每个API服务器会负责存储他自己的资源,如上图,它可以云自己的etcd实例(或整个etcd集群),也可以通过创建CRD实例将其资源存储在核心API服务器的ectd存储中。在这种情况下,就需要先创建一个CRD对下,然后才能创建CRD实例。

注册一个自定义API服务器 

想要自定义API服务器添加到集群中,可以将其部署为一个pod并通过Service暴露。下一步,为了将它集成在主API服务中,需要部署一个描述APIService资源的YAML列表,如下代码:

APIService YAML定义

apiVersion:apiregistration.k8s.io/vbeta1

kind:APIService

metadata:

        name:v1alpha1.extensions.example.com

spec:

        group:extensions.example.com

        version:v1alpha1

        priority:150

        service:

                name:website-api

                namespace:default

创建以上代码 列表中的APIService资源后,被发送到主API服务器的包含extensions.example.com API组任何资源的客户端请求,会和v1alpha1版本号一起被转发到通过website-api Service公开的自定义API 服务器pod

你可能感兴趣的:(kubernetes,学习,笔记)