(第8章)一切皆容器:Kubernetes

1.Kubernetes是啥?

  • Kubernetes是一個管理跨主機容器化應用的系統,實現了包括應用部署、高可用和彈性伸縮哎內的一系列基礎功能並封裝稱爲一整套完整、簡單易用的restful api對外提供服務。

  • K8S建立了一套健壯的集羣自恢復機制,包括:容器的自動重啓、自動重調度及自動備份

  • K8S的服務對象是:由多個容器組合而成的複雜應用,如:彈性、分佈式的服務架構。
    K8S引入了專門對容器進行分組管理的pod,K8S對外提供容器服務的模式是:用戶提交容器集羣運行所需要的資源的申請(就是個配置文件),然後由K8S負責完成這些容器的調度任務(就是自動地爲這些容器選擇運行的宿主機)

2.K8S集羣部署Guestbook應用例子

  • eg:應用部署說明如下:
    (1)它是一個PHP網站,同時運行3個副本來保證高可用
    (2)該PHP網站在Redis裏存儲了一個數據,不定期進行讀寫
    (3)該Redis服務由1個Master節點和2個slave節點組成的高可用集羣,讀請求由Slave處理,寫請求則交給Master
    (4)使用負載均衡組件來完成多個Redis Slave之間以及PHP實例之間的請求分配
    在K8S中部署如下:
    php的副本數量爲3,Redis Slave的數量爲2,Redis Master的副本數量爲1
    在這裏插入圖片描述
1)用戶在創建容器時,會給每個容器指定一個用來分組的標籤label:比如所有的php網站容器都屬於name=frontend

(2)這些容器可以使用IP:PORT的方式進行通信,但是K8S內置了service代理組件,可以使用固定的IP,以防止容器重啓

(3)replication controller,label和service,真正操作的對象都是一個稱之爲pod的邏輯對象。並通過APIServer組件提供了
一套對它們按照RESTful格式的增刪改查和監聽接口。

3.pod

  • 在K8S中,能夠被創建、調度和管理的最小單元是pod

  • pod可以想象成一個籃子,而容器則是籃子裏的雞蛋,
    當K9S需要調度容器時,它直接把一個籃子(連同裏面的雞蛋)從一個宿主機調度到另一個宿主機。
    其關係包括:
    (1)一個pod裏的容器能有多少資源取決於這個籃子的大小;
    (2)label也是貼在籃子上的;
    (3)IP分配給籃子而不是容器,籃子裏面的所有容器共享這個IP;
    (4)哪怕只有一個雞蛋(容器),K8S仍然會給他分配一個籃子;

  • pod容器共享的內容,包括:
    (1)IP及對應的network namespace是由pod裏的容器所共享的
    (2)pod內的所有容器共享volume
    (3)同一個pod內的應用容器能夠使用System VIPC或者POSIX消息隊列進行通信
    (4)同一個pod內的應用容器共享主機名

  • label和label selector與pod協作
    (1)labels屬性是一組綁定到K8S對象(eg:pod)上的鍵值對,同一個對象labels屬性的key必須獨一無二。
    一個label的key:代表一個資源管理維度(eg:release,environment)
    在這裏插入圖片描述
    (2)label selector作爲發送給APIServer的RESTful查詢請求的條件參數,用於檢索一個與label selector匹配的K8S對象列表

查詢方法:
(1)基於值相等的查詢條件
environment=production,tier!=frontend
表示的意思:過濾出爲域production環境,但是非前端的資源對象

(2)基於子集的查詢條件
key值=enviroment,且value值=production或qa的資源對象
enviroment in (production, qa)

選擇key值=tire,value值!=frontend且backend的資源對象

選擇所有labels屬性中包含key值=partition的資源對象,不需要檢查value值
partion
  • pod的現狀和未來走向
    (1)目前pod內的容器共享同一個network namespace,IP資源和端口區間,能夠通過localhost進行相互間的通信
    (2)pod對於K8S來說,最有用的價值就是原子化調度,即:在爲一個pod選擇目的宿主機時,K8S會考量這個機器是夠能放下整個pod,而避免出現本應該部署在一起的容器因爲資源不足,無法滿足“超親密”關係

  • pod的使用場景
    儘量不要在單個pod中運行同一個應用的多個實例

  • pod使用實例

1)創建K8S對象
kubectl creat -f obj.json
obj.json可以是定義pod,replication controller,service等K8S對象的json格式的資源配置文件

(2)將配置內容寫入testpod.json文件
kubectl creat -f testpod.json
注意:同一個pod內的容器端口不能重複;同一個pod的不同容器的端口不要映射到宿主機的同一個端口;

(3)查看pod信息
kubectl get pod

(4)查看pod中master1容器輸出的log信息
kubectl log podtest master1
  • pod內的容器網絡與通信
    假設pod內一共有3個容器
    在這裏插入圖片描述
    上面兩個是用戶容器,第三個是K8S的網絡容器
1)容器master1將6379端口映射到宿主機的6388端口;
將master2容器的22端口映射到宿主機上的8888端口;

(2)先通過ssh的方式進入master2容器
ssh root@127.0.0.1 -p 8888

在master2容器內通過localhost訪問master1容器
telnet 127.0.0.1 6379

4.replication controller設計

  • K8S決定了一個pod有多少同時運行的副本,並保證這些副本的期望狀態與當前狀態一致。
  • 任何時候一個pod中的容器退出或者整個pod變成Failed,replication controller都會固執地重啓這個容器或者pod
  • replication controller的描述文件,包括:
    創建pod的pod模板(pod template),一個期望副本數和一個用於選擇被控制的pod集合的label selector;
    (1)從下面的描述文件可以看出:replication controller通過使用於定義的pod模板來創建pod,一旦pod創建成功,對模板的任何更改都不會對已經在運行的pod有任何直接的影響。
    (2)刪除一個replication controller不會影響它所創建的pos,若想刪除一個replication controller所控制的pod,需要將其replicas字段設置爲0
    (3)通過修改pod的labels,可以將一個pod從replication controller的控制集中移除
    (4)如下所示:該replication controller實例化了2個運行nginx的pod,replication controller通過使用預定義的pod模板來創建pod, 一旦pod創建成功,對模板的任何更改都不會對已經在運行的pod有任何直接的影響。
    調整這些已經在運行的pod的CPU,MEM參數等操作應該直接更新pod本身而不是更新replication controller。
    (4)可以通過修改podlabels將一個pod從replicatin controller的控制集中移除,然後針對這個pod進行debug、數據恢復等操作。此外,replication controller則會自動重啓一個新的pod來替換被移除的pod
    (5)若想要刪除一個replication controller所控制的pod,需要將該replication controller的副本數(replicas)字段置爲0,這樣所有的pod都會被自動刪除。
    在這裏插入圖片描述

5.replication controller的典型場景

  • (1)重調度。
發佈了569 篇原創文章 · 獲贊 140 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章