利用K8S技术栈打造个人私有云(连载之:K8S资源控制)
【利用K8S技術(shù)棧打造個(gè)人私有云系列文章目錄】
- 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:初章)
- 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:K8S集群搭建)
- 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:K8S環(huán)境理解和練手)
- 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:基礎(chǔ)鏡像制作與實(shí)驗(yàn))
- 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:資源控制研究)
- 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:私有云客戶端打造)
私有云K8S資源控制原理
基于前面系列文章的詳細(xì)闡述,我們已經(jīng)可以手工去K8S集群的命令行下將CentOS 7.4操作系統(tǒng)的Docker鏡像啟動(dòng)起來(lái),然后用戶可以通過(guò)SSH登錄到CentOS容器之中進(jìn)行使用。但實(shí)際使用過(guò)程中不同的用戶不可能每次都手動(dòng)去命令行啟動(dòng)一個(gè)CentOS鏡像,然后用命令去查看該容器的IP地址和端口是多少,然后再通過(guò)ssh去連接。我們最好可以將Docker容器的啟動(dòng)、查詢、刪除等再封裝一層,然后通過(guò)WEB頁(yè)面去提供給用戶操作,這才符合用戶行為需求!
由于在我們的實(shí)踐中Docker容器是放在kubernetes集群中進(jìn)行管理,所以這里的資源控制涉及的資源主要就是kubernetes的資源,如Pod、RC、Service等。
kubernetes中的Master節(jié)點(diǎn)運(yùn)行kube-apiserver模塊,該模塊對(duì)外提供restful接口,我們可以基于該接口進(jìn)行編程,從而完成對(duì)集群資源的控制管理、如Pod、RC、Service等的申請(qǐng)、查詢、刪除等任務(wù)。
要CRUD一個(gè) kubernetes 資源,比如一個(gè) pod,首先要知道和 kubernetes 集群交互的接口。在 kubernetes 的 master 節(jié)點(diǎn)上安裝有 kubectl 客戶端程序,該程序面向用戶提供命令行接口,供用戶和 kubernetes 集群交互。 kubectl 將用戶命令通過(guò) restful 接口傳送給 apiserver,從而進(jìn)行資源的增、刪、改等操作。該過(guò)程可以示意如下:
原理講完了,接下來(lái)講講代碼級(jí)別如何實(shí)現(xiàn)。
K8S資源控制客戶端
總結(jié)上文不難看出,k8s相關(guān)資源的CRUD控制可以通過(guò)restful接口來(lái)實(shí)現(xiàn)。要使用Kubernetes REST API編寫應(yīng)用程序,當(dāng)下大多語(yǔ)言都可以很方便地去實(shí)現(xiàn)HTTP請(qǐng)求來(lái)操作kubernetes的restful接口從而控制和查詢資源,但本文主要是利用已有的kubernetes客戶端來(lái)更加優(yōu)雅地實(shí)現(xiàn)kubernetes的資源控制。你不需要自己編寫API來(lái)調(diào)用、請(qǐng)求/響應(yīng)等類型,可以直接使用現(xiàn)成的客戶端庫(kù)來(lái)實(shí)現(xiàn)。
k8s的客戶端開(kāi)源項(xiàng)目有很多,官方有支持,社區(qū)也維護(hù)了很多。
官方支持的Kubernetes客戶端庫(kù)比較有限,有下面幾種:
社區(qū)維護(hù)的客戶端庫(kù)則更加豐富,基本熱門的編程語(yǔ)言都支持,下面的這些Kubernetes API客戶端庫(kù)由社區(qū)創(chuàng)建者維護(hù),Kubernetes團(tuán)隊(duì)不會(huì)提供支持和維護(hù):
本實(shí)踐選用的是Fabric8的k8s-client,基于Java實(shí)現(xiàn)。
下面就基于該Clinet講講代碼級(jí)別的實(shí)現(xiàn)
K8S資源控制代碼實(shí)現(xiàn)舉例
下面結(jié)合代碼來(lái)闡述一下Fabric8常用的k8s資源控制操作:
- 創(chuàng)建K8S客戶端
接下來(lái)對(duì)K8S資源的控制、查詢等操作基本都靠該client來(lái)完成!
- 創(chuàng)建Pod
我們從一個(gè)pod.yaml文件來(lái)創(chuàng)建Pod資源:
List<HasMetadata> resources = client.load(new FileInputStream(fileName)).get(); // fileName為一個(gè)外部的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資源!!!System.out.println("Created pod " + result.getMetadata().getName());} else {System.err.println("Loaded resource is not a Pod! " + resource);}- 刪除Pod
刪除很簡(jiǎn)單,只要知道Pod所在的namespace和name,一行代碼即可搞定
client.pods().inNamespace("namespace名字").withName("pod名").delete();- 查詢Pod
查詢Pod的log日志并于控制臺(tái)打印:
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配置
后記
- 作者更多的原創(chuàng)文章在此,歡迎觀賞
- My Personal Blog
作者更多的SpringBt實(shí)踐文章在此:
- Spring Boot應(yīng)用監(jiān)控實(shí)戰(zhàn)
- SpringBoot應(yīng)用部署于外置Tomcat容器
- ElasticSearch搜索引擎在SpringBt中的實(shí)踐
- 初探Kotlin+SpringBoot聯(lián)合編程
- Spring Boot日志框架實(shí)踐
- SpringBoot優(yōu)雅編碼之:Lombok加持
如果有興趣,也可以抽點(diǎn)時(shí)間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:
- 利用K8S技術(shù)棧打造個(gè)人私有云 連載文章
- 從一份配置清單詳解Nginx服務(wù)器配置
- Docker容器可視化監(jiān)控中心搭建
- 利用ELK搭建Docker容器化應(yīng)用日志中心
- RPC框架實(shí)踐之:Apache Thrift
- RPC框架實(shí)踐之:Google gRPC
- 微服務(wù)調(diào)用鏈追蹤中心搭建
- Docker容器跨主機(jī)通信
- Docker Swarm集群初探
- 高效編寫Dockerfile的幾條準(zhǔn)則
總結(jié)
以上是生活随笔為你收集整理的利用K8S技术栈打造个人私有云(连载之:K8S资源控制)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新项目UX设计0到1的正确开启方式
- 下一篇: 从CES 2017看今年智能汽车发展趋势