摘要:前言文章字數一多,在線編輯不方便,本文是啟動流程的第部分傳送門啟動流程回顧上回講到方法目前系統中有以下每個都對應一個配置的任務就是根據創建,然后再用創建,各個通過的字段組成責任鏈以創建為例下面將簡要介紹的創建過程,主要分析是如
前言
文章字數一多,在線編輯不方便,本文是 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 的實現
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33051.html
摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數據結構的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對 kube-...
摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數據結構的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對 kube-...
摘要:前言文章字數一多,在線編輯不方便,本文是啟動流程的第部分傳送門啟動流程回顧上回講到方法目前系統中有以下每個都對應一個配置的任務就是根據創建,然后再用創建,各個通過的字段組成責任鏈以創建為例下面將簡要介紹的創建過程,主要分析是如 前言 文章字數一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動流程的第2部分傳送門:k8s :kube-apiserver 啟動流程 -...
摘要:年初開始研究,至目前已發表近篇學習筆記。同時,他也是中國社區的活躍者,見證了中國社區的一路成長。經本人授權,從本周開始,中國將轉載他的學習筆記,由淺入深地分享他在學習過程中的收獲。節點包含的組件目前這三個組件需要部署在同一臺機器上。 作者:宋凈超 宋凈超(Jimmy Song),TalkingData 容器技術負責人,微服務和云原生應用布道者。2017 年初開始研究 Kubernete...
摘要:問題是不是定義的一個的容器集群是只部署在同一個主機上楊樂到目前是,同一個里的是部署在同一臺主機的。問題這個圖里的是安裝在哪里的所有的客戶端以及會連接這個嘛楊樂可以任意地方,只要能訪問到集群,會作為的出口。 kubernetes1.0剛剛發布,開源社區400多位貢獻者一年的努力,多達14000多次的代碼提交,最終達到了之前預計的milestone, 并意味著這個開源容器編排系統可以正式在...
閱讀 2789·2021-11-24 09:39
閱讀 2548·2021-11-23 09:51
閱讀 1802·2021-11-17 09:33
閱讀 1737·2021-10-22 09:54
閱讀 1870·2021-08-16 11:00
閱讀 3421·2019-08-30 15:53
閱讀 1733·2019-08-30 13:19
閱讀 2902·2019-08-30 12:49