Kubernetes controller-runtime 介绍

我们在做CRD开发时,除了要写CRD定义之外,最重要的是实现CRD对应的Controller,这样CRD才能真正有用,而不论什么CRD,它的Controller的逻辑框架是大致一样的,主要就是监听CRD资源的变化事件,然后触发Reconcile逻辑去执行对应的动作,确保实际状态跟CRD的定义状态保持一致,此外,还有一些其他通用功能,比如监控、选主、Wehbook等,这种开发范式现在称之为Operator,在万物皆可CRD的云原生时代,这种通用需求早已被剥离出来,成为单独的第三方库,即controller-runtime,而operator-sdk也封装的是 controller-runtime,方便进行operator的开发,可见其重要性,本篇文章就对 controller-runtime 的概念、原理以及核心逻辑进行下介绍。

阅读更多

Kubernetes API Codec 解析

概述

Kubernetes API 多版本和序列化 这篇文章中,介绍了API多版本的功能和实现原理,其中Codec就是用来做序列化工作的,它主要用在两个地方:一个是通过HTTP协议跟客户端进行交互时,会对传输的数据进行序列化和反序列化,将字节流类型的数据转换成对应的API对象,或者是将API对象转换成对应格式的数据返回给客户端;一个是用在存储层的,即API对象存储到数据库时,也需要经过编码的,即经过序列化,默认是存储成 protobuf格式的数据,然后从数据库读出来数据时,又会反序列化为对应的API对象,下面我们来分析下Codec的实现机制。

阅读更多

Kubernetes API Scheme 解析

概述

Kubernetes API 多版本和序列化 这篇文章中,介绍了API多版本的功能和实现原理,其中Scheme就是其实现原理的一项重要机制,在平时的开发中也经常会遇到,本篇文章就对其进行下分析。

Scheme起到了一个类型(Type)注册中心的作用,在API Server内部,全局只有一个Scheme实例,各个版本的API资源,会将他们的类型,注册到Scheme中来,同时,也会将如何进行类型转换的方法注册到Scheme中来,后续在Handler中进行版本转换以及序列化时,则会使用Scheme中注册的类型创建对应版本的对象,以及使用注册的类型转换的方法对不同版本的对象进行转换。

阅读更多

Kubernetes API 多版本和序列化

前言

三年前在分析Kubernete APIServer时,就经常遇到两个东西,一个是Scheme,一个是Codec,当时对它们并不是很理解,也没有去细究,但是后来越来越多的能够遇见它们,尤其是在做Kubernetes API相关的开发时,Scheme的出镜率很高,于是查了下资料才知道,原来他们跟Kubernetes的API多版本和序列化有关,而API多版本又属于Kubernetes API的重要特性,它跟一般应用的多版本API还不太一样,有它自己的特色,因此搞懂它的相关概念和实现原理是相当有必要的。从前面介绍apiserver的系列文章上也可以看到,因为Kubernetes要处理很多种资源,可以说是包罗万象,所以它做了很多的抽象,而API多版本则是在这些抽象之上再度抽象的艺术,因此还是比较难以理解的,但是这些设计都是随着时间的推移逐渐演进出来的,有它的合理性,甚至当理解了它的机制之后,会发现它的设计之美,仿佛是一件艺术品。毕加索说,艺术是揭示真理的谎言,就让我们拨开API多版本的层层迷雾,去探寻下它的本质。

阅读更多

Elasticsearch大文本字段(large text field)优化方案

背景

在全文检索的场景下,经常会有text类型的字段存储的数据量比较大,比如一个pdf文档或者是一本书的内容,可能会有几兆,几十兆,上百兆的大小,单个字段的内容过大,会对集群性能以及稳定性造成比较大的影响,因此本文档针对该场景给出优化建议。

阅读更多

UMI框架解析

背景

最近打算自己写一个运维管理平台,给我们内部使用,对于一个运维+后端程序员来说,写前端无疑是最大的挑战了,前端的知识栈真是庞大又杂乱,只掌握了最基础的html+css+js来说是远远不够的,前端发展了这么几十年,每一个领域都有一大堆的标准、组件、框架,比如css有less、sass等扩展,js领域又有react, vue等框架,还有typescript这种带类型的js,光ts的语法就可以复杂到令人发指,此外,还有很多现成的ui库,像阿里的antd,国外的mui,本以为react就已经是学习的终点了,但是还有umi这种基于react的前端框架,这还没完,还有再上一层的基于umi的antd pro框架,一层接一层,而且很多公司还在热衷于创造新的框架,这些各个方面各个维度的框架组件,多到让新踏入这个领域的小白无所适从。然而虽然学习成本增加了,但是这种越来越上层的框架组件,是无数前辈大佬的经验总结,能够让前端开发变得快速高效标准,尤其是对我这种小白来说,遵循这些优秀的框架标准,就可以继承这些经验,少走很多弯路,专注于做业务逻辑的开发。

阅读更多

OpenStack Ussuri-Victoria-Wallaby版本新功能介绍

社区目标

每个Release,社区都会定义几个社区目标,期望所有项目能够实现,这有利于对OpenStack下众多的项目能够有统一整体性,而不是各自发展各自的。OpenStack 从Ussuir到Victoria到Wallaby版本,社区定义了如下几个社区目标:

阅读更多

OpenStack Stein-Train版本新功能介绍

社区目标

每个Release,社区都会定义几个社区目标,期望所有项目能够实现,这有利于对OpenStack下众多的项目能够有统一整体性,而不是各自发展各自的。OpenStack Stein到Train版本,社区定义了如下几个社区目标:

阅读更多

Kubernetes Kubelet CSI 机制解析

在CSI之前,Kubernetes本身就内置了很多插件去对接第三方存储,如果内置插件不满足需求,还可以通过FlexVolume机制,去编写自己的存储插件,然后被动态的加载到Kubernetes中,也就是说Kubernetes并不存在像对接容器运行时那种代码侵入性不好维护的问题,那为什么还要再制定一套CSI机制去对接第三方存储呢?其实CSI是一个更通用的存储对接方案,它不仅仅是针对Kubernetes的,而是针对所有的容器编排系统,比如Mesos也支持CSI,而且CSI是通过RPC机制进行交互的,跟语言无关,这样就给存储厂商带来极大的便利,写一次CSI插件,就可以适配到各种容器编排系统,不用为每种容器编排系统单独开发存储插件,这在CSI协议的目标中做了清晰的描述:

阅读更多

Kubernetes Kubelet CNI 机制解析

CNI简介

这里说Kubelet CNI,其实说法有些不准确,在Kubernetes Kubelet机制概述中就介绍过,Kubelet并没有直接跟CNI交互,而是通过容器运行时跟外部网络进行交互的,换句话说,CNI解决的是容器网络插件化的问题,跟Kubernetes这种容器编排系统并没有直接关系,但是有很多文章都说Kubelet支持了CNI,包括Kubernets官方的文档Network Plugins,其实这里是特指的Docker,因为Docker本身并不支持CNI,kubelet将对Docker网络环境的创建和删除,通过CNI的方式,放在了dockershim中,如果Kubernetes移除了对Docker的支持,就会移除dockershim,那么kubelet对CNI的支持也就会移除,这样两者就完全没有关系了。

阅读更多