图解kubernetes中的api多版本机制实现

在web开发中随着版本的更新迭代,通常要在系统中维护多个版本的api,多个版本的api在数据结构上往往也各不相同,今天就来一起学习下kubernetes中的Scheme机制是如何解决这个问题的,如何借助HTTP请求里面的数据进行反序列化操作

1. web请求的处理流程

1.1 HTTP请求处理流程


通常首先是webServer先进行Http协议的处理,然后解析成基础的webServer内部的一个Http请求对象, 通常该对象持有对应请求的请求头和底层对应的字节序列(从socket流中读取)
接着首先会通常根据对应的编码格式来进行反序列化,完成从字节序列到当前接口的业务模型的映射, 然后在交给业务逻辑处理,从而最终进行持久化存储, 本文的重点也就在反序列化部分

2.模型映射的实现

2.1 描述资源版本信息

/api/{version}/{resource}/{action}

上面是一个基础的web url通常我们都会为每个版本注册一个对应的URL, 其中会包含很关键的两个信息即version与resource,通过这两个信息,通常我们就可以知道这可能是某个资源的那个版本, 如果我们把后面的action也包裹进来,我们通常就可以知道对应的资源的那个具体操作

2.2 Group组信息


在微服务流行的今天我们通常会为按照业务功能来进行微服务的切分,本质上一个微服务可能就是实现某个具体业务场景的功能集合,比如用户系统通常会包含用户的所有相关操作,在kubernetes中也有类似的概念就是所谓的Group

POST /apis/batch/v1beta1/namespaces/{namespace}/cronjobs
POST /apis/apps/v1/namespaces/{namespace}/daemonsets

我们来看一个实例这是一个创建daemonsets和cronjobs的url, 如果按照Group、resource、version来进行拆分可以拆成如下:batch、v1beta1、cronjobs和apps、v1、daemonsets,也就是大家尝试的GroupVersionKind,其中kind对应的就是resource

2.3 模型映射的实现


我们通过url里面获取到资源的GroupVersionKind信息,如何将其映射为一个具体的类型呢? 这貌似就很简单了结合反射和map来进行就可以了,我们通过url获取到对应想的GVK信息,然后在通过我们的映射表,就知道对应的模型是哪个,接下来就只需要进行转换就行了

gvkToType map[schema.GroupVersionKind]reflect.Type

3.反序列化实现

3.1 解码机制

那如何将对应的Http里面的数据流反序列化成内部的一个对象呢,别忘记了是Http协议, 肯定就是header头里面的信息了,我们通过header头里面的序列化就可以知道对应的编码格式,只需要调用对应格式的解码就可以完成了

Content-Type: "application/json"

3.2 默认对象


如果要将json格式的字节数组进行解码通常要进行如下操作,我们需要传入一个目标对象的指针,然后由json将对应的字节数据解析到目标对象中,我们也需要这样一个对象,用于存储反序列化的结果

func Unmarshal(data []byte, v interface{}) error {}

那只要我再提供一个当前版本对应的对象构造函数是不是就可以呢?答案是的

func() Object{ return 目标对象 },

4. 设计总结


首先在进行url注册的时候,我们构造出对应url映射的资源的版本信息即GroupVersionKind,后续的很多操作我们可以通过对应的版本映射获取对应的目标操作或者对象,然后再通过Header里面的字段获取对应的解码器,并将Body里面的字节序列进行解码到目标对象,就可以实现多版本资源的映射和反序列化操作了

kubernetes学习笔记地址: https://www.yuque.com/baxiaoshi/tyado3

原文地址:https://blog.51cto.com/srexin/2474862

时间: 2024-11-09 05:59:05

图解kubernetes中的api多版本机制实现的相关文章

图解kubernetes中api聚合机制的实现

Kubernetes kubernetes中apiserver的设计无疑是复杂的,其自身内部就包含了三种角色的api服务,今天我们一起来臆测下其内部的设计,搞明白aggregator.apiserver.apiExtensionsServer(crd server)的设计精要 1.从web服务到web网关到CRD apiserver还是蛮复杂的,今天我们只讨论其kube-aggregator/apiserver/apiextensions三者架构上的设计,而不关注诸如请求认证.准入控制.权限等等

一篇文章为你图解Kubernetes网络通信原理

本文来自51cto因出现文章被删除提示,为避免丢失将其复制备查 Kubernetes对集群内部的网络进行了重新抽象,以实现整个集群网络扁平化.我们可以理解网络模型时,可以完全抽离物理节点去理解,我们用图说话,先有基本印象. 名词解释 1.网络的命名空间:Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命令空间中,彼此间无法通信;docker利用这一特性,实现不容器间的网络隔离. 2.Veth设备对:也叫虚拟网络接口对.Veth设备对的引入是为了实现在不同网络命名空间的通信.

kubernetes中的local persistent volume

什么是Local Persistent Volumes 在kubernetes 1.14版本中, Local Persistent Volumes已变为正式版本(GA),Local PV的概念在1.7中被首次提出(alpha),并在1.10版本中升级到beat版本.现在用户终于可以在生产环境中使用Local PV的功能和API了.首先:Local Persistent Volumes代表了直接绑定在计算节点上的一块本地磁盘.kubernetes提供了一套卷插件(volume plugin)标准,

第三章 pod:运行于kubernetes中的容器

本章内容涵盖 创建. 启动和停止 pod 使用标签组织 pod 和其他资源 使用特定标签对所有 pod 执行操作 使用命名空间将多个 pod 分到不重叠的组中 调度 pod 到指定类型的工作节点 上一章 已经大致介绍了在 Kubemetes 中创建的基本组件,包括它们的基本功 能概述. 那么接下来我们将更加详细地介绍所有类型的 Kubemetes 对象(或资源), 以便你理解在何时. 如何及为何要使用每一个对象. 其中 pod 是 Kubemetes 中最为 重要的核心概念,而其他对象仅仅是在管

Azure 应用服务中的 API 应用、ASP.NET 和 Swagger 入门

学习内容: 如何通过 Visual Studio 2015 中的内置工具在 Azure 应用服务中创建和部署 API 应用. 如何使用 Swashbuckle NuGet 包动态生成 Swagger API 元数据,以便自动进行 API 发现. 如何使用 Swagger API 元数据自动生成 API 应用的客户端代码. Note 若要将 Visual Studio 连接到 Azure 中国区,可按使用 Visual Studio 2015 连接中国区 Azure中的说明操作. 如果使用的是 V

[Python][flask][flask-login]关于flask-login中各种API使用实例

本篇博文跟上一篇[Python][flask][flask-wtf]关于flask-wtf中API使用实例教程有莫大的关系. 简介:Flask-Login 为 Flask 提供了用户会话管理.它处理了日常的登入,登出并且长时间记住用户的会话. 直白的讲,flask-login包为用户管理了涉及到用户登录相关的缓存(Session)管理. Posted by Alima | cnblogs. 一.安装(Install) PC环境:Windows 7,Python 3.5.2. PS:此次配置环境阶

【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特点,各位可以看看 编辑:github 原文链接:Revealing the Magic of JavaScript jnotnull发布在 JavaScript译文 我们每天都在使用大量的工具,不同的库和框架已经成为我们日常工作的一部分.我们使用他们是因为我们不想重新造轮子,虽然我们可能并不知道这些

大神教你轻松玩转Docker和Kubernetes中如何运行MongoDB微服务

本文介绍了利用Docker和Kubernetes搭建一套具有冗余备份集合的MongoDB服务,从容器对CI和CD引发的改变入手,讨论了容器技术对MongoDB带来的挑战和机会,然后实战如何部署一套稳定的MongoDB服务,非常的干货 介绍 想尝试在笔记本电脑上运行MongoDB么?希望通过执行一个简单的命令,然后就有一个轻量级.自组织的沙盒么?并可再通过一条命令就可以移除所有的痕迹么? 需要在多个环境中运行相同的应用程序栈?创建自己的容器镜像,使得开发.测试.操作和支持团队启动一份完全相同的环境

如何在Kubernetes中管理有状态应用

在Kubernetes中,StatefulSet被用来管理有状态应用的API对象.StatefulSets在Kubernetes 1.9版本才稳定.StatefulSet管理Pod部署和扩容,并为这些Pod提供顺序和唯一性的保证.与Deployment相似的地方是,StatefulSet基于spec规格管理Pod:与Deployment不同的地方是,StatefulSet需要维护每一个Pod的唯一身份标识.这些Pod基于同样的spec创建,但互相之间不能替换,每一个Pod都保留自己的持久化标识.