利用K8S技術(shù)棧打造個人私有云(連載之:K8S資源控制)

封面圖片

【利用K8S技術(shù)棧打造個人私有云系列文章目錄】

注: 本文原載于 My Personal Blog:CodeSheep · 程序羊


私有云K8S資源控制原理

基于前面系列文章的詳細闡述挖函,我們已經(jīng)可以手工去K8S集群的命令行下將CentOS 7.4操作系統(tǒng)的Docker鏡像啟動起來假瞬,然后用戶可以通過SSH登錄到CentOS容器之中進行使用哥捕。但實際使用過程中不同的用戶不可能每次都手動去命令行啟動一個CentOS鏡像诚纸,然后用命令去查看該容器的IP地址和端口是多少窜觉,然后再通過ssh去連接谷炸。我們最好可以將Docker容器的啟動、查詢禀挫、刪除等再封裝一層旬陡,然后通過WEB頁面去提供給用戶操作,這才符合用戶行為需求语婴!

由于在我們的實踐中Docker容器是放在kubernetes集群中進行管理季惩,所以這里的資源控制涉及的資源主要就是kubernetes的資源,如Pod腻格、RC画拾、Service等。

kubernetes中的Master節(jié)點運行kube-apiserver模塊菜职,該模塊對外提供restful接口青抛,我們可以基于該接口進行編程,從而完成對集群資源的控制管理酬核、如Pod蜜另、RC、Service等的申請嫡意、查詢举瑰、刪除等任務(wù)。

要CRUD一個 kubernetes 資源蔬螟,比如一個 pod此迅,首先要知道和 kubernetes 集群交互的接口。在 kubernetes 的 master 節(jié)點上安裝有 kubectl 客戶端程序旧巾,該程序面向用戶提供命令行接口耸序,供用戶和 kubernetes 集群交互。 kubectl 將用戶命令通過 restful 接口傳送給 apiserver鲁猩,從而進行資源的增坎怪、刪、改等操作廓握。該過程可以示意如下:

K8S資源控制架構(gòu)圖

原理講完了搅窿,接下來講講代碼級別如何實現(xiàn)嘁酿。


K8S資源控制客戶端

總結(jié)上文不難看出,k8s相關(guān)資源的CRUD控制可以通過restful接口來實現(xiàn)男应。要使用Kubernetes REST API編寫應(yīng)用程序闹司,當下大多語言都可以很方便地去實現(xiàn)HTTP請求來操作kubernetes的restful接口從而控制和查詢資源,但本文主要是利用已有的kubernetes客戶端來更加優(yōu)雅地實現(xiàn)kubernetes的資源控制殉了。你不需要自己編寫API來調(diào)用开仰、請求/響應(yīng)等類型拟枚,可以直接使用現(xiàn)成的客戶端庫來實現(xiàn)薪铜。

k8s的客戶端開源項目有很多,官方有支持恩溅,社區(qū)也維護了很多隔箍。

官方支持的Kubernetes客戶端庫比較有限,有下面幾種:

官方支持的Kubernetes客戶端庫

社區(qū)維護的客戶端庫則更加豐富脚乡,基本熱門的編程語言都支持蜒滩,下面的這些Kubernetes API客戶端庫由社區(qū)創(chuàng)建者維護,Kubernetes團隊不會提供支持和維護:

社區(qū)維護的Kubernetes客戶端庫

本實踐選用的是Fabric8的k8s-client奶稠,基于Java實現(xiàn)俯艰。

下面就基于該Clinet講講代碼級別的實現(xiàn)


K8S資源控制代碼實現(xiàn)舉例

下面結(jié)合代碼來闡述一下Fabric8常用的k8s資源控制操作:

  • 創(chuàng)建K8S客戶端
String namespace = "default";    // namespace名
String master = "http://XXXX/";  // 配置為你的k8s集群的主節(jié)點地址
Config config = new ConfigBuilder().withMasterUrl(master).build();
KubernetesClient client = new DefaultKubernetesClient(config);

接下來對K8S資源的控制、查詢等操作基本都靠該client來完成锌订!

  • 創(chuàng)建Pod

我們從一個pod.yaml文件來創(chuàng)建Pod資源:

  List<HasMetadata> resources = client.load(new FileInputStream(fileName)).get();  // fileName為一個外部的pod.yaml文件
  if (resources.isEmpty()) {
    System.err.println("No resources loaded from file: " +fileName);
    return;
  }
  HasMetadata resource = resources.get(0);
  if (resource instanceof Pod){
    Pod pod = (Pod) resource;
    System.out.println("Creating pod in namespace " + namespace);
    NonNamespaceOperation<Pod, PodList, DoneablePod, PodResource<Pod, DoneablePod>> pods = client.pods().inNamespace(namespace);
    Pod result = pods.create(pod);  // 此處創(chuàng)建pod資源V裎铡!辆飘!
    System.out.println("Created pod " + result.getMetadata().getName());
  } else {
    System.err.println("Loaded resource is not a Pod! " + resource);
  }
  • 刪除Pod

刪除很簡單啦辐,只要知道Pod所在的namespace和name,一行代碼即可搞定

client.pods().inNamespace("namespace名字").withName("pod名").delete();
  • 查詢Pod

查詢Pod的log日志并于控制臺打域谙睢:

client.pods().inNamespace("namespace名字").withName("pod名").tailingLines(10).watchLog(System.out))

欲查詢Pod的一些其他信息芹关,可以參考創(chuàng)建Pod步驟中的代碼:

Pod result = pods.create(pod);  // 此處創(chuàng)建pod資源!=糇洹侥衬!
System.out.println("Created pod " + result.getMetadata().getName()); // 類似于此處,除了獲取Pod的名字外還可以獲取很多類似信息
  • 修改Pod配置
Pod updatedPod = client.pods().inNamespace("namespace名字").withName("pod名").edit()
          .editMetadata()
          .addToLabels("server2", "nginx2")
          .and().done();
log("Replaced testPod:", updatedPod);

上文從創(chuàng)建一個K8S客戶端開始比較完整地介紹了一個Pod資源的CRUD操作跑芳,限于篇幅原因浇冰,其他資源如RC、Service聋亡、Deployment等等的增刪改查操作都類似肘习,只是名字不同而已,其接口稍微類比一下Pod即可寫出對應(yīng)的資源控制代碼坡倔,此處不再贅述了漂佩,舉一反三很重要脖含。


后記

由于能力有限,若有錯誤或者不當之處投蝉,還請大家批評指正养葵,一起學(xué)習(xí)交流!



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘩缆,一起剝皮案震驚了整個濱河市关拒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庸娱,老刑警劉巖着绊,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熟尉,居然都是意外死亡归露,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門斤儿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剧包,“玉大人,你說我怎么就攤上這事往果〗海” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵陕贮,是天一觀的道長堕油。 經(jīng)常有香客問我,道長飘蚯,這世上最難降的妖魔是什么馍迄? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮局骤,結(jié)果婚禮上攀圈,老公的妹妹穿的比我還像新娘。我一直安慰自己峦甩,他們只是感情好赘来,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凯傲,像睡著了一般犬辰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冰单,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天幌缝,我揣著相機與錄音,去河邊找鬼诫欠。 笑死涵卵,一個胖子當著我的面吹牛浴栽,可吹牛的內(nèi)容都是我干的窃这。 我是一名探鬼主播最冰,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛛枚!你這毒婦竟也來了坏晦?” 一聲冷哼從身側(cè)響起萝玷,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昆婿,沒想到半個月后球碉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挖诸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年汁尺,在試婚紗的時候發(fā)現(xiàn)自己被綠了法精。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多律。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搂蜓,靈堂內(nèi)的尸體忽然破棺而出狼荞,到底是詐尸還是另有隱情,我是刑警寧澤帮碰,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布相味,位于F島的核電站,受9級特大地震影響殉挽,放射性物質(zhì)發(fā)生泄漏丰涉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一斯碌、第九天 我趴在偏房一處隱蔽的房頂上張望一死。 院中可真熱鬧,春花似錦傻唾、人聲如沸投慈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伪煤。三九已至,卻和暖如春凛辣,著一層夾襖步出監(jiān)牢的瞬間抱既,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工扁誓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留防泵,地道東北人阳堕。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像择克,于是被迫代替她去往敵國和親恬总。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348