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
了解网站控制器的功能
启动后,控制器立即开始通过以下URL 请求查看网站对象:
http://localhost:8080/apis/extensions.example.com/v1/websites?watch=true
通过识别主机名和端口,控制器不直接连接到API服务器,而是连接到kubectl proxy进程。该进程在同一个po中的sidecar容器中运行,并充当API服务器的ambassador。代理将请求转发给API服务器,并同时处理TLS加密认证。
通过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服务器。
3、验证自定义对象
在kubernetes1.8版本中,自定义对象的验证作为alpha特性被引入。如果想要让API服务器验证自定义对象,需要再API服务器中启用CustomResoureceValidation特性,并在CRD中指定一个JSON schema。
4、为自定义对象提供自定义API服务器
如果想要更好的支持在kubernetes中添加自定义对象,最好的方式是使用你自己的API服务器,并让他直接与客户端进行交互。
API服务器聚合
每个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