资讯专栏INFORMATION COLUMN

k8s :kube-apiserver 启动流程 - 2

2450184176 / 2509人阅读

摘要:前言文章字数一多,在线编辑不方便,本文是启动流程的第部分传送门启动流程回顾上回讲到方法目前系统中有以下每个都对应一个配置的任务就是根据创建,然后再用创建,各个通过的字段组成责任链以创建为例下面将简要介绍的创建过程,主要分析是如

前言

文章字数一多,在线编辑不方便,本文是 k8s:kube-apiserver 启动流程的第2部分
传送门:k8s :kube-apiserver 启动流程 - 1

回顾

上回讲到 Run 方法:

// kubernetes/cmd/kube-apiserver/app.server.go
func Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error {
    ...
    server, err := CreateServerChain(runOptions, stopCh)
    if err != nil {
        return err
    }
    return server.PrepareRun().Run(stopCh)
}

目前系统中有以下 api server:

CustomResourceDefinitions

Master

APIAggregator

每个 api server 都对应一个 Config(配置)

apiextensionsapiserver.Config

master.Config

aggregatorapiserver.Config

CreateServerChain 的任务就是根据 ServerRunOptions 创建 XXXConfig,然后再用 XXXConfig 创建 api server,各个 api server 通过 GenericAPIServer 的 delegationTarget 字段组成《责任链》
以 Master api server 创建为例:

func CreateServerChain(
    runOptions *options.ServerRunOptions, stopCh <-chan struct{})
        (*genericapiserver.GenericAPIServer, error) {
    ...
    kubeAPIServerConfig, ... := CreateKubeAPIServerConfig(...)
    ...
    kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, 
        apiExtensionsServer.GenericAPIServer, sharedInformers, versionedInformers)
    ...
} 

下面将简要介绍 Master api server 的创建过程,主要分析 kube-apiserver 是如何将 资源对象(Node,Pod,Service 等)绑定到具体的 RESTful API,使得客户端可以通过 RESTful API 操作资源对象

如果是你会怎么做?

在大概看了一些源代码之后,我不禁问自己:如果是你来设计代码架构,你会怎么做?
例如给定一个实体 Student(Java 伪代码,下同),持久化在 etcd 里

public class Student {

    public int id;

    public String name;

    public String phone;
}

如何提供 RESTful api 接口提供对 Student 的 CRUD 操作? 设计代码框架使之适应所有的实体

api 接口示例:

PUT: /user?id=xxx&name=yyy&phone=zzz
DELETE: /user?id=xxx
POST: /user?id=xxx&name=yyy
GET: /user?id=xxx

我们分几步来考虑,首先考虑持久化,为了支持不同的持久化框架,或者即时我们就使用一种持久化框架也需要考虑框架版本匹配问题,这就需要将对持久化框架的基本操作进行抽象,抽取出接口 Backend

public interface Backend {

    String get(String key);

    void set(String key, String value);
}

然后我们有具体的实现类 EtcdBackend, ConsulBackend 以及 工厂类 BackendFactory

public class EtcdBackend implements Backend {

    public String get(String key) { ... }

    public void set(String key, String value) { ... }
}

public class ConsulBackend implements Backend {

    public String get(String key) { ... }

    public void set(String key, String value) { ... }
}

public class BackendFactory {

    Backend get(String name) { ... }
}

Backend 搞定了,现在我们需要一个 DAO(Data access object)来访问它

public class UserDao {

    private Backend backend;

    // CRUD 方法
    ...
}

我们注意到会有很多实体,他们都需要使用 Backend 接口访问后端存储,所以可以搞个基类 AbstractDao,将 backedn 字段移到基类里头

pubic class AbstractDao {

    private Backend backend;
}

public class User extends AbstractDao {

    // CRUD 方法
    ...
}

进一步观察,其实各个 DAO 的 CRUD 方法也有很多重复的(模版)代码,比如如果我们能够封装以下变化点:

生成后端存储需要的key

序列化和反序列化对象

DAO 中的 CRUD 方法可以进一步抽取到 AbstractDao 中,那些实在需要子类特例化的方法,可以通过《模版方法》模式来实现

public class AbstractDao {

    private Backend backend;

    // CRUD 方法
    ...
}

public class UserDao extends AbstractDao {

    // Template 方法
    ...
}

我们现在离最后的完工又近了一步,还剩一个问题,就是如何将 url 和 DAO 对应起来,这是一个映射问题,可以使用 map 来保持 url 对应的 DAO

map.put("/user", userDao)

以上只是一个简单的推导,k8s 的实现远比这个 demo 复杂的多,考虑到各种解耦和扩展性,下回将正式介绍 k8s 的实现

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32643.html

相关文章

  • k8skube-apiserver 启动流程 - 1

    摘要:前言看源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对遗留,即将废弃初始化流程以及数据结构的一个梳理,算是做个路标,便于以后在迷宫中还能找到回来的路主要功能是提供接 前言 看 k8s 源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对 kube-...

    wwolf 评论0 收藏0
  • k8skube-apiserver 启动流程 - 1

    摘要:前言看源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对遗留,即将废弃初始化流程以及数据结构的一个梳理,算是做个路标,便于以后在迷宫中还能找到回来的路主要功能是提供接 前言 看 k8s 源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对 kube-...

    RayKr 评论0 收藏0
  • k8skube-apiserver 启动流程 - 2

    摘要:前言文章字数一多,在线编辑不方便,本文是启动流程的第部分传送门启动流程回顾上回讲到方法目前系统中有以下每个都对应一个配置的任务就是根据创建,然后再用创建,各个通过的字段组成责任链以创建为例下面将简要介绍的创建过程,主要分析是如 前言 文章字数一多,在线编辑不方便,本文是 k8s:kube-apiserver 启动流程的第2部分传送门:k8s :kube-apiserver 启动流程 -...

    xiangzhihong 评论0 收藏0
  • K8S学习笔记 | 如何部署 Kubernetes master 节点

    摘要:年初开始研究,至目前已发表近篇学习笔记。同时,他也是中国社区的活跃者,见证了中国社区的一路成长。经本人授权,从本周开始,中国将转载他的学习笔记,由浅入深地分享他在学习过程中的收获。节点包含的组件目前这三个组件需要部署在同一台机器上。 作者:宋净超 宋净超(Jimmy Song),TalkingData 容器技术负责人,微服务和云原生应用布道者。2017 年初开始研究 Kubernete...

    ernest.wang 评论0 收藏0
  • Kubernetes v1.0特性解析

    摘要:问题是不是定义的一个的容器集群是只部署在同一个主机上杨乐到目前是,同一个里的是部署在同一台主机的。问题这个图里的是安装在哪里的所有的客户端以及会连接这个嘛杨乐可以任意地方,只要能访问到集群,会作为的出口。 kubernetes1.0刚刚发布,开源社区400多位贡献者一年的努力,多达14000多次的代码提交,最终达到了之前预计的milestone, 并意味着这个开源容器编排系统可以正式在...

    HackerShell 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<