摘要:前言文章字?jǐn)?shù)一多,在線編輯不方便,本文是啟動(dòng)流程的第部分傳送門啟動(dòng)流程回顧上回講到方法目前系統(tǒng)中有以下每個(gè)都對(duì)應(yīng)一個(gè)配置的任務(wù)就是根據(jù)創(chuàng)建,然后再用創(chuàng)建,各個(gè)通過(guò)的字段組成責(zé)任鏈以創(chuàng)建為例下面將簡(jiǎn)要介紹的創(chuàng)建過(guò)程,主要分析是如
前言
文章字?jǐn)?shù)一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動(dòng)流程的第2部分
傳送門:k8s :kube-apiserver 啟動(dòng)流程 - 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) }
目前系統(tǒng)中有以下 api server:
CustomResourceDefinitions
Master
APIAggregator
每個(gè) api server 都對(duì)應(yīng)一個(gè) Config(配置)
apiextensionsapiserver.Config
master.Config
aggregatorapiserver.Config
CreateServerChain 的任務(wù)就是根據(jù) ServerRunOptions 創(chuàng)建 XXXConfig,然后再用 XXXConfig 創(chuàng)建 api server,各個(gè) api server 通過(guò) GenericAPIServer 的 delegationTarget 字段組成《責(zé)任鏈》
以 Master api server 創(chuàng)建為例:
func CreateServerChain( runOptions *options.ServerRunOptions, stopCh <-chan struct{}) (*genericapiserver.GenericAPIServer, error) { ... kubeAPIServerConfig, ... := CreateKubeAPIServerConfig(...) ... kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, apiExtensionsServer.GenericAPIServer, sharedInformers, versionedInformers) ... }
下面將簡(jiǎn)要介紹 Master api server 的創(chuàng)建過(guò)程,主要分析 kube-apiserver 是如何將 資源對(duì)象(Node,Pod,Service 等)綁定到具體的 RESTful API,使得客戶端可以通過(guò) RESTful API 操作資源對(duì)象
如果是你會(huì)怎么做?在大概看了一些源代碼之后,我不禁問(wèn)自己:如果是你來(lái)設(shè)計(jì)代碼架構(gòu),你會(huì)怎么做?
例如給定一個(gè)實(shí)體 Student(Java 偽代碼,下同),持久化在 etcd 里
public class Student { public int id; public String name; public String phone; }
如何提供 RESTful api 接口提供對(duì) Student 的 CRUD 操作? 設(shè)計(jì)代碼框架使之適應(yīng)所有的實(shí)體
api 接口示例:
PUT: /user?id=xxx&name=yyy&phone=zzz DELETE: /user?id=xxx POST: /user?id=xxx&name=yyy GET: /user?id=xxx
我們分幾步來(lái)考慮,首先考慮持久化,為了支持不同的持久化框架,或者即時(shí)我們就使用一種持久化框架也需要考慮框架版本匹配問(wèn)題,這就需要將對(duì)持久化框架的基本操作進(jìn)行抽象,抽取出接口 Backend
public interface Backend { String get(String key); void set(String key, String value); }
然后我們有具體的實(shí)現(xiàn)類 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 搞定了,現(xiàn)在我們需要一個(gè) DAO(Data access object)來(lái)訪問(wèn)它
public class UserDao { private Backend backend; // CRUD 方法 ... }
我們注意到會(huì)有很多實(shí)體,他們都需要使用 Backend 接口訪問(wèn)后端存儲(chǔ),所以可以搞個(gè)基類 AbstractDao,將 backedn 字段移到基類里頭
pubic class AbstractDao { private Backend backend; } public class User extends AbstractDao { // CRUD 方法 ... }
進(jìn)一步觀察,其實(shí)各個(gè) DAO 的 CRUD 方法也有很多重復(fù)的(模版)代碼,比如如果我們能夠封裝以下變化點(diǎn):
生成后端存儲(chǔ)需要的key
序列化和反序列化對(duì)象
DAO 中的 CRUD 方法可以進(jìn)一步抽取到 AbstractDao 中,那些實(shí)在需要子類特例化的方法,可以通過(guò)《模版方法》模式來(lái)實(shí)現(xiàn)
public class AbstractDao { private Backend backend; // CRUD 方法 ... } public class UserDao extends AbstractDao { // Template 方法 ... }
我們現(xiàn)在離最后的完工又近了一步,還剩一個(gè)問(wèn)題,就是如何將 url 和 DAO 對(duì)應(yīng)起來(lái),這是一個(gè)映射問(wèn)題,可以使用 map 來(lái)保持 url 對(duì)應(yīng)的 DAO
map.put("/user", userDao)
以上只是一個(gè)簡(jiǎn)單的推導(dǎo),k8s 的實(shí)現(xiàn)遠(yuǎn)比這個(gè) demo 復(fù)雜的多,考慮到各種解耦和擴(kuò)展性,下回將正式介紹 k8s 的實(shí)現(xiàn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/33051.html
摘要:前言看源代碼有一段時(shí)間,總感覺(jué)在迷宮里亂竄,有時(shí)候覺(jué)得終于找到出口了,一下子又撞墻了,總結(jié)下來(lái)還是自己的內(nèi)功不夠深厚,本文是對(duì)遺留,即將廢棄初始化流程以及數(shù)據(jù)結(jié)構(gòu)的一個(gè)梳理,算是做個(gè)路標(biāo),便于以后在迷宮中還能找到回來(lái)的路主要功能是提供接 前言 看 k8s 源代碼有一段時(shí)間,總感覺(jué)在迷宮里亂竄,有時(shí)候覺(jué)得終于找到出口了,一下子又撞墻了,總結(jié)下來(lái)還是自己的內(nèi)功不夠深厚,本文是對(duì) kube-...
摘要:前言看源代碼有一段時(shí)間,總感覺(jué)在迷宮里亂竄,有時(shí)候覺(jué)得終于找到出口了,一下子又撞墻了,總結(jié)下來(lái)還是自己的內(nèi)功不夠深厚,本文是對(duì)遺留,即將廢棄初始化流程以及數(shù)據(jù)結(jié)構(gòu)的一個(gè)梳理,算是做個(gè)路標(biāo),便于以后在迷宮中還能找到回來(lái)的路主要功能是提供接 前言 看 k8s 源代碼有一段時(shí)間,總感覺(jué)在迷宮里亂竄,有時(shí)候覺(jué)得終于找到出口了,一下子又撞墻了,總結(jié)下來(lái)還是自己的內(nèi)功不夠深厚,本文是對(duì) kube-...
摘要:前言文章字?jǐn)?shù)一多,在線編輯不方便,本文是啟動(dòng)流程的第部分傳送門啟動(dòng)流程回顧上回講到方法目前系統(tǒng)中有以下每個(gè)都對(duì)應(yīng)一個(gè)配置的任務(wù)就是根據(jù)創(chuàng)建,然后再用創(chuàng)建,各個(gè)通過(guò)的字段組成責(zé)任鏈以創(chuàng)建為例下面將簡(jiǎn)要介紹的創(chuàng)建過(guò)程,主要分析是如 前言 文章字?jǐn)?shù)一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動(dòng)流程的第2部分傳送門:k8s :kube-apiserver 啟動(dòng)流程 -...
摘要:年初開(kāi)始研究,至目前已發(fā)表近篇學(xué)習(xí)筆記。同時(shí),他也是中國(guó)社區(qū)的活躍者,見(jiàn)證了中國(guó)社區(qū)的一路成長(zhǎng)。經(jīng)本人授權(quán),從本周開(kāi)始,中國(guó)將轉(zhuǎn)載他的學(xué)習(xí)筆記,由淺入深地分享他在學(xué)習(xí)過(guò)程中的收獲。節(jié)點(diǎn)包含的組件目前這三個(gè)組件需要部署在同一臺(tái)機(jī)器上。 作者:宋凈超 宋凈超(Jimmy Song),TalkingData 容器技術(shù)負(fù)責(zé)人,微服務(wù)和云原生應(yīng)用布道者。2017 年初開(kāi)始研究 Kubernete...
摘要:?jiǎn)栴}是不是定義的一個(gè)的容器集群是只部署在同一個(gè)主機(jī)上楊樂(lè)到目前是,同一個(gè)里的是部署在同一臺(tái)主機(jī)的。問(wèn)題這個(gè)圖里的是安裝在哪里的所有的客戶端以及會(huì)連接這個(gè)嘛楊樂(lè)可以任意地方,只要能訪問(wèn)到集群,會(huì)作為的出口。 kubernetes1.0剛剛發(fā)布,開(kāi)源社區(qū)400多位貢獻(xiàn)者一年的努力,多達(dá)14000多次的代碼提交,最終達(dá)到了之前預(yù)計(jì)的milestone, 并意味著這個(gè)開(kāi)源容器編排系統(tǒng)可以正式在...
閱讀 2797·2021-11-24 09:39
閱讀 2558·2021-11-23 09:51
閱讀 1871·2021-11-17 09:33
閱讀 1752·2021-10-22 09:54
閱讀 1884·2021-08-16 11:00
閱讀 3436·2019-08-30 15:53
閱讀 1743·2019-08-30 13:19
閱讀 2915·2019-08-30 12:49