利用K8S技術棧打造我的私有云(連載之:K8S資源控制)


【利用K8S技術棧打造我的私有云系列文章目錄】nginx

注: 本文首發於 My 公衆號 CodeSheep ,可 長按掃描 下面的 當心心 來訂閱 ↓ ↓ ↓編程

CodeSheep · 程序羊


私有云K8S資源控制原理

基於前面系列文章的詳細闡述,咱們已經能夠手工去K8S集羣的命令行下將CentOS 7.4操做系統的Docker鏡像啓動起來,而後用戶能夠經過SSH登陸到CentOS容器之中進行使用。但實際使用過程當中不一樣的用戶不可能每次都手動去命令行啓動一個CentOS鏡像,而後用命令去查看該容器的IP地址和端口是多少,而後再經過ssh去鏈接。咱們最好能夠將Docker容器的啓動、查詢、刪除等再封裝一層,而後經過WEB頁面去提供給用戶操做,這才符合用戶行爲需求!c#

因爲在咱們的實踐中Docker容器是放在kubernetes集羣中進行管理,因此這裏的資源控制涉及的資源主要就是kubernetes的資源,如Pod、RC、Service等。api

kubernetes中的Master節點運行kube-apiserver模塊,該模塊對外提供restful接口,咱們能夠基於該接口進行編程,從而完成對集羣資源的控制管理、如Pod、RC、Service等的申請、查詢、刪除等任務。bash

要CRUD一個 kubernetes 資源,好比一個 pod,首先要知道和 kubernetes 集羣交互的接口。在 kubernetes 的 master 節點上安裝有 kubectl 客戶端程序,該程序面向用戶提供命令行接口,供用戶和 kubernetes 集羣交互。 kubectl 將用戶命令經過 restful 接口傳送給 apiserver,從而進行資源的增、刪、改等操做。該過程能夠示意以下:服務器

K8S資源控制架構圖

原理講完了,接下來說講代碼級別如何實現。restful


K8S資源控制客戶端

總結上文不難看出,k8s相關資源的CRUD控制能夠經過restful接口來實現。要使用Kubernetes REST API編寫應用程序,當下大多語言均可以很方便地去實現HTTP請求來操做kubernetes的restful接口從而控制和查詢資源,但本文主要是利用已有的kubernetes客戶端來更加優雅地實現kubernetes的資源控制。你不須要本身編寫API來調用、請求/響應等類型,能夠直接使用現成的客戶端庫來實現。架構

k8s的客戶端開源項目有不少,官方有支持,社區也維護了不少。框架

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

官方支持的Kubernetes客戶端庫

社區維護的客戶端庫則更加豐富,基本熱門的編程語言都支持,下面的這些Kubernetes API客戶端庫由社區建立者維護,Kubernetes團隊不會提供支持和維護:

社區維護的Kubernetes客戶端庫

本實踐選用的是Fabric8的k8s-client,基於Java實現。

下面就基於該Clinet講講代碼級別的實現


K8S資源控制代碼實現舉例

下面結合代碼來闡述一下Fabric8經常使用的k8s資源控制操做:

  • 建立K8S客戶端
String namespace = "default";    // namespace名
String master = "http://XXXX/";  // 配置爲你的k8s集羣的主節點地址
Config config = new ConfigBuilder().withMasterUrl(master).build();
KubernetesClient client = new DefaultKubernetesClient(config);
複製代碼

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

  • 建立Pod

咱們從一個pod.yaml文件來建立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);  // 此處建立pod資源!!!
	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的一些其餘信息,能夠參考建立Pod步驟中的代碼:

Pod result = pods.create(pod);  // 此處建立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);
複製代碼

上文從建立一個K8S客戶端開始比較完整地介紹了一個Pod資源的CRUD操做,限於篇幅緣由,其餘資源如RC、Service、Deployment等等的增刪改查操做都相似,只是名字不一樣而已,其接口稍微類比一下Pod便可寫出對應的資源控制代碼,此處再也不贅述了,觸類旁通很重要。


後記

做者更多的SpringBt實踐文章在此:


若是有興趣,也能夠抽點時間看看做者一些關於容器化、微服務化方面的文章:


CodeSheep · 程序羊
相關文章
相關標籤/搜索