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