DockOne微信分享(一二三):如何扩展Kubernetes管理的资源对象

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文讲的是DockOne微信分享(一二三):如何扩展Kubernetes管理的资源对象【编者的话】Kubernetes是一套容器化解决方案,也是一套资源管理的架构和标准;本次分享是基于我在饿了么现阶段容器化经验和理念的总结,探讨深化Kubernetes在企业内部的应用的方法, 介绍如何利用开源的API Server框架在企业内部打造和扩展Kubernetes管理的资源对象。
本文讲的是DockOne微信分享(一二三):如何扩展Kubernetes管理的资源对象【编者的话】Kubernetes是一套容器化解决方案,也是一套资源管理的架构和标准;本次分享是基于我在饿了么现阶段容器化经验和理念的总结,探讨深化Kubernetes在企业内部的应用的方法, 介绍如何利用开源的API Server框架在企业内部打造和扩展Kubernetes管理的资源对象。

【3 天烧脑式 Docker 训练营 | 上海站】随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛。本次培训我们理论结合实践,从Docker应该场景、持续部署与交付、如何提升测试效率、存储、网络、监控、安全等角度进行。

Kubernetes逐渐成熟,也成为许多公司容器化平台的首选,然而在落地当中,每个企业面对的问题场景多少也有些不一样的,总是希望对Kubernetes做改造,来更好的满足企业目前的需求。

然而fork一个Kubernetes分支出来并不是一个好的选择,那么有其他方案吗?

接下来,我们先了解下Kubernetes的API Server。
  1. API Server作为整个Kubernetes集群的核心组件,让所有资源可被描述和配置;这里的资源包括了类似网络、存储、Pod这样的基础资源也包括了replication controller、deployment这样的管理对象;
  2. API Server某种程度上来说更像是包含了一定逻辑的对象数据库;接口上更加丰富、自带GC、支持对象 间的复杂逻辑;当然API Server本身是无状态的 数据都在etcd当中;
  3. API Server提供基于RESTful的管理接口,支持增删改查和patch、监听的操作,其他组件通过和API Server的接口获取资源配置和状态,以实现各种资源处理逻辑。

在Kubernetes集群外打造另一个API Server来扩展Kubernetes的资源,与原生Kubernetes组成“联邦”;一来解除和社区版本的耦合,二来可以最大化定制需求,在一些场景下,这个方案更具灵活性和可操作性。

我们也部署了Kubernetes集群,但是也遇到了一些挑战。一是Kubernetes并不能解决所有容器化带来的问题,二来我们也看到了Kubernetes这套框架在扩展性、灵活性等方面优点,所以我们已经在积极尝试实践Kubernetes框架来延伸Kubernetes方案。

那么好实现吗?有没有现成的开源框架方便实现这个方案呢,而不需要大海捞针,在Kubernetes源码里去抽丝剥茧呢?

令人兴奋的是答案是肯定的,Kubernetes单独开源了API Server的开发框架

项目地址( https://github.com/kubernetes/apiserver.git ),需要说明的是这个项目本身和Kubernetes的代码保持同步的。

那么我们接下来就看下如何利用Kubernetes开源的框架构建特定资源的API Server。

由于已经有很多文章介绍API Server的架构这里不再赘述,我主要讲下如何使用框架,从添加一个资源的过程来了解这个框架。

先上架构图
apiserver.001_.jpeg


这里有几个概念要先介绍:
  • Scheme:定义了资源序列化和反序列化的方法以及资源类型和版本的对应关系;这里我们可以理解成一张纪录表。
  • Storage:是对资源的完整封装,实现了资源创建、删除、watch等所有操作。
  • APIGroupInfo:是在同一个Group下的所有资源的集合。

还需要注意的是:一个资源对应着两个版本;一个版本是用户访问的接口对象(yaml或者json通过接口传递的格式),另一个版本则是核心对象,实现了资源创建和删除等,并且直接参与持久化,对应了在etcd中存储,这两个版本的资源是需要相互转化的,并且转换方法需要事先注册在Scheme中。

接下来我们具体描述下API Server框架下资源的构建过程。

定义一个资源先要定义好核心对象:
type TestObjList struct {

    Items []TestObj 
}

type TestObj struct {} 

资源的核心对象是该类型资源的主体,参与操作资源的相关方法和持久化,另外除了定义对象本身,还需要定义其对应的list以便支持list接口。

然后定义该资源的"对外"版本-接口对象,可以和核心对象一样也可以不一样,例如,我们可以这样定义接口对象:
type TestObjList struct {

    Items []TestObj 
}

type TestObj struct {
    Number int
}   

但是Number值并不会被保存下来,因为核心对象中并没有这个值。

接下来实现资源向Scheme注册的接口函数 SchemeFunc---AddToScheme
func addKnownTypes(scheme *runtime.Scheme) error {
    scheme.AddKnownTypes(SchemeGroupVersion,
        &TestObj{},
        &TestObjList{},
    )
    metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
    return nil
}
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
AddToScheme = SchemeBuilder.AddToScheme  

那么我们就可以使用AddToScheme,把该对象类型(包括deepcopy和coversion方法)注册到Scheme。

资源要能被RESTful接口访问到,是需要构建实现rest.Storage接口的对象;我们可以借助Registry.Store(实现了标准的存储对象接口)实现:
type REST struct {
    *registry.Store
}

func NewREST() *REST {

    store := &registry.Store{}

    return &REST{store}
}   

然后组装出APIGroupInfo(APIGroupInfo是包含了一组资源类型的集合):
apiGroupInfo := apiserver.NewDefaultAPIGroupInfo(... Scheme)
v1alpha1storage := map[string]rest.Storage{}
v1alpha1storage["testobj"] = NewREST()
apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1storage   

最后调用GenericAPIServer运行apiserver:
GenericAPIServer.InstallAPIGroup(&apiGroupInfo).Run()

OK,现在你就可以像访问Kubernetes原生资源一样访问这个新的资源了。

注意:上文中代码为了更好的突出显示资源创建逻辑,一些细节被隐藏掉了。例如可能大家会有疑问,etcd、admissionControl怎么没配置,这其实是在GenericAPIServer中实现了。

最后总结一下, Kubernetes是一套容器化解决方案,也是一套资源管理的架构和标准。

Q&A

Q:需要扩展管理资源对象的场景是什么?能否举个例子说明一下?
A:举个例子,假如有这样一个场景,Nginx作为反向代理,我们需要非常详细的管理具体配置,并且Nginx的upstream不单单是容器还有许多部署在物理机和虚拟机上的应用,这就要求我们需要具体定义专门管理Nginx的资源对象;由于企业应用场景是十分具体的,也就需要对于资源做具体描述。
Q:能否讲下具体应用场景和联邦后的用法?

>A:场景上个问题讲过了,关于联邦我目前的方案是在自定义的Controller里做相关联系和操作。

Q:扩展API Server和通过third party resource + controller的方式相比有哪些优点?支持和多个集群的联邦吗?Kubernetes社区对这两种扩展模式的态度是怎么样的?
A:首先third party resource在Kubernetes里一直不是很稳定,再者third party resource和原生资源有很多不同(可以参考官方文档),满足一些小的场景可以,但是对于深度定制化(资源之间关联、权限限制等),我还是会选择扩展API Server。

以上内容根据2017年5月18日晚微信群分享内容整理。分享人李健,饿了么资深云计算工程师。拥有三年的容器云开发建设经验,2016年加入饿了么一直致力于内部云平台的建设
。DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

原文发布时间为:2017-06-06

本文作者:李健

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:DockOne微信分享(一二三):如何扩展Kubernetes管理的资源对象


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
20天前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
1月前
|
JSON 运维 Kubernetes
|
1月前
|
存储 移动开发 小程序
uniapp富文本editor输入二次扩展兼容微信小程序
uniapp富文本editor输入二次扩展兼容微信小程序
69 0
|
2月前
|
小程序
wx:for 微信小程序双重for嵌套如何获取内层的迭代对象
本文介绍了微信小程序中`wx:for`循环嵌套的使用方法,特别是如何在外层循环中访问内层循环的迭代对象。通过在外层`wx:for`中使用默认的`item`进行迭代,并在内层`wx:for`中通过`wx:for-item`属性指定迭代对象的名称,从而实现了双重`for`嵌套并获取内层迭代对象的目的。
|
3月前
|
存储 Kubernetes 数据中心
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
|
3月前
|
边缘计算 人工智能 Kubernetes
边缘计算问题之理解 Kubernetes 节点资源的四层分配结构如何解决
边缘计算问题之理解 Kubernetes 节点资源的四层分配结构如何解决
32 1
|
3月前
|
存储 Kubernetes API
|
3月前
|
Kubernetes 网络协议 应用服务中间件
在K8S中,SVC资源是否支持在K8S集群外部访问?
在K8S中,SVC资源是否支持在K8S集群外部访问?
|
3月前
|
Kubernetes Cloud Native 应用服务中间件
Kubernetes 自动伸缩策略:优化资源利用率
【8月更文第29天】在现代云原生环境中,应用的流量往往具有不可预测性。为了应对这种变化,Kubernetes 提供了多种自动伸缩机制来动态调整应用实例的数量和每个实例分配的资源。本文将深入探讨两种主要的自动伸缩工具:水平 Pod 自动伸缩器 (HPA) 和垂直 Pod 伸缩器 (VPA),并提供实际的应用示例。
102 0
|
3月前
|
Prometheus Kubernetes 监控
在K8S中,DaemonSet类型的资源特性有哪些?
在K8S中,DaemonSet类型的资源特性有哪些?

热门文章

最新文章

下一篇
无影云桌面