【利用K8S技術(shù)棧打造個人私有云系列文章目錄】
- 利用K8S技術(shù)棧打造個人私有云(連載之:初章)
- 利用K8S技術(shù)棧打造個人私有云(連載之:K8S集群搭建)
- 利用K8S技術(shù)棧打造個人私有云(連載之:K8S環(huán)境理解和練手)
- 利用K8S技術(shù)棧打造個人私有云(連載之:基礎(chǔ)鏡像制作與實驗)
- 利用K8S技術(shù)棧打造個人私有云(連載之:資源控制研究)
- 利用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鲁猩,從而進行資源的增坎怪、刪、改等操作廓握。該過程可以示意如下:
原理講完了搅窿,接下來講講代碼級別如何實現(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客戶端庫比較有限,有下面幾種:
社區(qū)維護的客戶端庫則更加豐富脚乡,基本熱門的編程語言都支持蜒滩,下面的這些Kubernetes API客戶端庫由社區(qū)創(chuàng)建者維護,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í)交流!