多租户可视化 K8s 管理平台KubeCube近日迎来了新版本的发布,新版本增加了 K8s 版本转化、HNC GA 版本适配、审计信息国际化、warden 主动上报模式,为集群和项目设置 Ingress 域名后缀等特性,也修复了若干已知问题,详见 ChangeLog。

该版本中最主要的特性是 Version-Conversion 能力的支持,使得接入 KubeCube 的用户无需感知被 KubeCube 接管的 K8s 集群版本,可以使用指定版本的 K8s API 来操作 K8s 资源,KubeCube 会做自适应转化;同时 KubeCube 也将这个能力包装成 SDK 供外部使用。

为什么需要多 K8s 版本转化?

在实际的生产场景中,用户的 K8s 集群往往固置于某一稳定版本,并随着时间的推移,在该 K8s 集群中沉淀了大量的业务、工具、方案等,同时 K8s 社区又会不断的推出更高的版本,此时升级 K8s 版本往往需要比较高的代价。

K8s 的版本升级,并不总是保证 API 的完美兼容,绝大多数的 API 会经历从 Development level --> Alpha level --> Beta level --> Stable level 的发展阶段,理想情况下,用户应该使用 Stable level 的 API 用于生产环境,但是现实中,用户所使用的某一资源的 API 很可能处于 Stable level 以下的阶段,比如 extensions/v1beta1 的 Deployment 和 apps/v1 的 Deployment。详见K8S API 变动规划

当用户需要在控制面纳管多 K8s 集群时,用户暂时不希望升级老的稳定的 K8s 集群,又希望新增的 K8s 集群是比较高的版本,这时,管控面的 KubeCube,就能够提供访问多版本 K8s 的能力,对外暴露统一的 K8s 风格的 RESTfule API,用户既可以使用精确的 GVR 去访问不同版本的 K8s 资源,也可用使用统一版本的 GVR 去访问不同版本的 K8s 资源,KubeCube 会做自适应转化。

K8s native convert

1. K8s api workflow

2. K8s version convert

K8s 版本转换原则

  1. 同一个 group 的不同 version 都可以转换成该 group 的 internalVersion
  2. 某一 group 的 internalVersion 可以转换成该 group 下的任一 version

K8s 版本转化的核心 ——scheme

Scheme 中拥有 concerter 转化器,其内部存放了各个 API 注册的版本转化函数。

type Scheme struct {
... // converter stores all registered conversion functions. It also has
// default converting behavior.
converter *conversion.Converter ...
} // Converter knows how to convert one type to another.
type Converter struct {
// Map from the conversion pair to a function which can
// do the conversion.
conversionFuncs ConversionFuncs
generatedConversionFuncs ConversionFuncs // Set of conversions that should be treated as a no-op
ignoredUntypedConversions map[typePair]struct{}
}

我们已经知道 internalVersion 和指定 version 之间的转换规则,它们的转换函数位于 k8s apis 的定义文件夹下,如:pkg/apis/apps/v1/zz_generated.conversion.go

// Code generated by conversion-gen. DO NOT EDIT.

package v1

import (...)

func init() {
localSchemeBuilder.Register(RegisterConversions)
} // RegisterConversions adds conversion functions to the given scheme.
// Public to allow building arbitrary schemes.
func RegisterConversions(s *runtime.Scheme) error {...}

这些转化函数,一般由 install 包下的 Install(scheme) 函数注册到 Scheme 中。

// Package install installs the apps API group, making it available as
// an option to all of the API encoding/decoding machinery.
package install import (...) func init() {
Install(legacyscheme.Scheme)
} // Install registers the API group and adds types to a scheme
func Install(scheme *runtime.Scheme) {
utilruntime.Must(apps.AddToScheme(scheme))
utilruntime.Must(v1beta1.AddToScheme(scheme))
utilruntime.Must(v1beta2.AddToScheme(scheme))
utilruntime.Must(v1.AddToScheme(scheme))
utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta2.SchemeGroupVersion, v1beta1.SchemeGroupVersion))
}

注册完的转会函数,将会在 Convert () 方法中使用。

// Convert will translate src to dest if it knows how. Both must be pointers.
// If no conversion func is registered and the default copying mechanism
// doesn't work on this type pair, an error will be returned.
// 'meta' is given to allow you to pass information to conversion functions,
// it is not used by Convert() other than storing it in the scope.
// Not safe for objects with cyclic references!
func (c *Converter) Convert(src, dest interface{}, meta *Meta) error {
// 转换函数 map 的 key
pair := typePair{reflect.TypeOf(src), reflect.TypeOf(dest)} // 实际的 convert 句柄
scope := &scope{
converter: c,
meta: meta,
} // ignore conversions of this type
if _, ok := c.ignoredUntypedConversions[pair]; ok {
return nil
}
// 使用预先注册的转换函数进行转换
if fn, ok := c.conversionFuncs.untyped[pair]; ok {
return fn(src, dest, scope)
}
if fn, ok := c.generatedConversionFuncs.untyped[pair]; ok {
return fn(src, dest, scope)
} dv, err := EnforcePtr(dest)
if err != nil {
return err
}
sv, err := EnforcePtr(src)
if err != nil {
return err
}
return fmt.Errorf("converting (%s) to (%s): unknown conversion", sv.Type(), dv.Type())
}

KubeCube version conversion

了解了 K8s 版本转换的大致思路后,KubeCube 如果需要做版本转换的能力,需要做到以下几点:

  1. 维护版本转换专用的 Scheme
  2. 注册所有的 K8s 的 API 转换函数,并提供拓展方法
  3. 使用 discovery client 提早做 src api 和 dest api 的转换检查

1. Conversion func register

KubeCube 会默认注册所有 K8s 原生资源的转换函数,同时也提供注册自定义资源转换函数的入口。

2. Greeting target cluster

3. Controller-runtime client support

KubeCube 的版本转化 SDK 提供了 Wrap controller-runtime 的 client.Client 的能力,可以将 client.Client 升级为具有版本转化能力的句柄。

写在最后

未来我们会持续提供更多功能,帮助企业简化容器化落地。也欢迎大家参与贡献,提出宝贵的建议。添加以下微信进入 KubeCube 交流群。

了解更多

作者简介: 蔡鑫涛,网易数帆轻舟容器平台资深开发,KubeCube Committer

【点击了解更多网易技术干货与活动】

KubeCube 新增版本转换:K8s 尝鲜再也不用担心影响老版本了的更多相关文章

  1. 妈妈再也不用担心别人问我是否真正用过redis了

    1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...

  2. 锋利的js之妈妈再也不用担心我找错钱了

    用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...

  3. 【阿里云产品公测】离线归档OAS,再也不用担心备份空间了

    [阿里云产品公测]离线归档OAS,再也不用担心备份空间了 作者:阿里云用户莫须有3i 1 起步  1.1 初识OAS  啥是OAS,请看官方说明: 引用: 开放归档服务(Open Archive Se ...

  4. 有了 tldr,妈妈再也不用担心我记不住命令了

    引言 有一次我在培训时说「程序员要善于使用 Terminal 以提高开发效率」,一位程序员反驳道:「这是 21 世纪,我们为什么要用落后的命令行,而不是先进的 GUI?」 是的,在一些人眼里,这个黑黑 ...

  5. 妈妈再也不用担心我使用git了

    妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...

  6. 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了

    前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体 ...

  7. python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了

    我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...

  8. zzulioj--1841--so easy!麻麻再也不用担心我的数学了!(数学水题)

    1841: so easy!麻麻再也不用担心我的数学了! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 27  Solved: 15 SubmitSt ...

  9. 完全免费,再也不用担心转pdf文件乱来乱去的问题了

    完全免费,再也不用担心转pdf文件乱来乱去的问题了. 源代码:https://github.com/xlgwr/WpsToPdf.git 第三方插件Bye Bye... 功能说明 主要引用Wps金山办 ...

  10. 教会舍友玩 Git (再也不用担心他的学习)

    舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜之郎牌Git文章,学完以后,再也不用担心舍友的学习了(狗头)哪里不会写哪里 ~~~ 一 先来聊一聊 太多东西属于,总在用,但是一直都没整理的 ...

随机推荐

  1. Kmesh进入CNCF云原生全景图,实现网格治理sidecarless化

    本文分享自华为云社区<Kmesh进入CNCF 云原生全景图> ,作者:云容器大未来. 近日,Kmesh 正式进入 CNCF 云原生全景图,位于 Service Mesh 类别下. CNCF ...

  2. 模拟重装Kubernetes(k8s)集群:删除k8s集群然后重装

    目录 一.系统环境 二.前言 三.重装Kubernetes集群 3.1 环境介绍 3.2 删除k8s所有节点(node) 3.3 kubeadm初始化 3.4 添加worker节点到k8s集群 3.5 ...

  3. 简单粗暴通过 Binlog 日志来恢复 MySQL 数据

    引言 Binlog 日志的主要作用: 1.增量备份. 2.主从复制. 操作步骤 1.登录 MySQL -> 执行 show variables like '%log_bin%'; 查询 binl ...

  4. Understanding Swift’s value type thread safety - 代码分析(一)

    结构体并不代表线程安全,swift在此上未做保证 func testScenarioA() throws { var store: Int = 0 DispatchQueue.concurrentPe ...

  5. Github Markdown 指定图片在光亮或暗黑模式展示

    Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...

  6. asp.net core mvc 使用quartz

    参照了:https://www.cnblogs.com/dangzhensheng/p/10496278.html 1.新建任务类ReportJob.cs,这个类里就是具体任务了. using Qua ...

  7. winform遍历控件的Controls.OfType<>方法

    页面TextBox控件较多时,可以使用类似的名字,方便遍历时整体的修改,可以使用Controls.OfType<TextBox>()获取所有文本框: 需要引用命名空间System.Linq ...

  8. django跨域设置

    Django 跨域问题,解决前后端连接 CORS 1.安装 django-cors-headers pip install django-cors-headers 2.配置settings 在 INS ...

  9. redis缓存详解(从入门到精通)

    引言 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(l ...

  10. 如果redis没有设置expire,他是否默认永不过期

    如果redis没有设置expire,他是否默认永不过期?默认是的 通过EXPIRE key seconds 命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间 ...