Kubernetes筆記 (2) - 資源物件、kubectl

語言: CN / TW / HK

Kubernetes叢集將所有節點上的資源都整合到一個大的虛擬資源池裡,以代替一個個單獨的伺服器。如果把叢集類比為一臺傳統的伺服器,那麼Kubernetes(Master)就好比是作業系統核心,其主要職責在於抽象資源並排程任務,而Pod資源物件就是那些運行於使用者空間中的程序。

資源物件

API Server提供了RESTful風格的程式設計介面,其管理的資源是Kubernetes API中的端點,用於儲存某種API物件的集合。Pod、Deployment和Service等都是最常用的核心物件。

Pod資源物件

Pod資源物件是一種集合了一到多個應用容器、儲存資源、專用IP及支撐容器執行的其他選項的邏輯元件,是Kubernetes的部署單元及原子執行單元。 Kubernetes的網路模型要求其各Pod物件的IP地址位於同一網路平面內(同一IP網段),可以將每個Pod物件想象成一個邏輯主機,類似常規的物理主機或VM,運行於同一個Pod物件中的多個程序也類似於物理機或VM上獨立執行的程序。 不過,Pod物件中的各程序均運行於彼此隔離的容器中,並於各容器間共享兩種關鍵資源:網路和儲存卷

  • 網路:每個Pod物件都會被分配一個叢集內專用的IP地址(PodIP),同一Pod內部的所有容器共享Pod物件的主機名、IP地址和埠等。因此,這些容器間可以通過本地迴環地址進行通訊。
  • 儲存卷:還為Pod物件配置一組“儲存卷”資源,這些資源可以共享給其內部的所有容器使用。

一個Pod物件代表某個應用程式的一個特定例項,如果需要擴充套件應用程式,就可以通過為此應用程式建立多個Pod例項來實現。

Controller資源物件

在工作節點甚至是排程器自身導致了執行失敗時,Pod物件將會被刪除;同樣,資源耗盡或節點故障導致的回收操作也會刪除相關的Pod物件。 Kubernetes使用Controller實現對一次性的(用後即棄)Pod物件的管理操作,例如,要確保部署的應用程式的Pod副本數量符合使用者的設定,以及基於Pod模板來重建Pod物件等,從而實現Pod物件的擴縮容、滾動更新和自愈能力等。

Controller本身也是一種資源型別,它有著多種實現,其中與工作負載相關的實現如:

  • ReplicationController
  • Deployment
  • StatefulSet
  • DaemonSet
  • Jobs

也可統稱它們為Pod控制器,控制器的定義通常由期望的**副本數量、Pod模板和標籤選擇器(Label Selector)**組成。它會根據標籤選擇器對Pod物件的標籤進行匹配檢查,所有滿足選擇條件的Pod物件都將受控於當前控制器並計入其副本總數,並確保此數目能夠精確反映期望的副本數。

需要注意的是:在實際的應用場景中,在接收到的請求流量負載顯著低於或接近於已有Pod副本的整體承載能力時,使用者需要手動修改Pod控制器中的期望副本數量以實現應用規模的擴容或縮容。不過,若叢集中部署了HeapSter或Prometheus一類的資源指標監控附件時,使用者還可以使用“HorizontalPodAutoscaler”(HPA)計算出合適的Pod副本數量,並自動修改Pod控制器中期望的副本數以實現應用規模的動態伸縮,提高叢集資源利用率。

Service資源物件

Service主要有三種常用型別:

  1. 僅用於叢集內部通訊的ClusterIP型別
  2. 接入叢集外部請求的NodePort型別
  3. LoadBalancer型別
僅用於叢集內部通訊的ClusterIP型別

Pod物件重啟或被重建後IP地址通常會發生變化,Service資源物件的作用便是在被訪問的Pod物件與客戶端之間新增一個有著固定IP地址的中間層,客戶端向此地址發起訪問請求後,相關的Service資源會負責將請求排程並代理至後端的Pod物件。Service IP是一種虛擬IP,也稱為Cluster IP,它專用於叢集內通訊。

Service是“微服務”的一種實現,事實上它是一種抽象:通過規則定義出由多個Pod物件組合而成的邏輯集合,並附帶訪問這組Pod物件的策略。Service物件挑選、關聯Pod物件的方式同Pod控制器一樣,都是要基於Label Selector進行。

接入叢集外部請求的NodePort型別

ClusterIP僅對叢集內部開放,外部訪問叢集可通過NodePort,根據某個Node的IP和埠(NodePort)接入請求,並將其代理至相應的Service物件的Cluster IP上的服務埠,而後由Service物件將請求代理至後端的Pod物件的PodIP及應用程式監聽的埠。這種請求需要經過兩次轉發。

LoadBalancer型別

NodePort會部署於叢集中的每一個節點,只能訪問到指定Node上的Service,如果存在叢集外部的LoadBalancer,即可將使用者請求負載均衡至叢集中的部分或者所有節點。LoadBalancer通常是由Cloud Provider自動建立並提供的軟體負載均衡器,也可以是由管理員手工配置的硬體裝置。

K8S部署應用程式的基本過程

容器技術使得部署程式時不再需要直接更改主機環境,而K8S又使得建立和執行容器的操作不必再關注其主機位置,並在一定程度上賦予了它動態擴縮容及自愈的能力,從而讓使用者從主機、系統及應用程式的維護工作中解脫出來。

部署某個應用程式時,使用者首先要向API Server請求建立一個Pod控制器,由控制器根據映象等資訊向API Server請求創建出一定數量的Pod物件,並由Master之上的排程器指派至選定的工作節點以執行容器化應用。此外,使用者一般還需要建立一個具體的Service物件以便為這些Pod物件建立起一個固定的訪問入口,從而使得其客戶端能夠通過其服務名稱或ClusterIP進行訪問。 API Server的客戶端工具有kubectl和Dashboard。

kubectl的基礎使用

Kubernetes API(API Server)是管理其各種資源物件的唯一入口,它提供了一個RESTful風格的CRUD(Create、Read、Update和Delete)介面用於查詢和修改叢集狀態,並將結果儲存於叢集狀態儲存系統etcd中。 使用者可以通過kubectl訪問API Server來操作Kubernetes的各種資源物件。

建立資源物件

kubectl run nginx-deploy --image=nginx:1.12 --replicas=1

這樣的命令建立了一個名為nginx-deploy的deployment控制器資源,然後由這個資源來根據指定的映象名稱、副本數量來負責pod的建立。

檢視資源物件 kubectl get命令用於檢視資源物件

~ kubectl get namespaces
NAME              STATUS   AGE
default           Active   23h
kube-node-lease   Active   23h
kube-public       Active   23h
kube-system       Active   23h
~ kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
myapp          1/1     Running   0          14h
nginx-deploy   1/1     Running   0          14h

Kubernetes系統的大部分資源都隸屬於某個Namespace物件,預設的名稱空間為default,若需要獲取指定Namespace物件中的資源物件的資訊,則需要使用-n或--namespace指明其名稱

列印資源物件的詳細資訊 kubectl get -o {yaml|josn}kubectl describe命令都能夠打印出指定資源物件的詳細描述資訊. kubectl get -o {yaml|josn}可以檢視資源物件的使用者期望狀態(Spec)和現有的實際狀態(Status),比如檢視default namespaces下所有pods的狀態資訊並輸出為yaml格式:

~ kubectl get pods -n default -o yaml  

kubectl describe命令可以顯示資源的event、controller等資訊。

~ kubectl describe pods myapp

列印容器中的日誌資訊 命令格式為:

kubectl logs [-f] [-p](POD|TYPE/NAME) [-c CONTAINER][options]

可列印指定Pod內指定容器的日誌,如果Pod內只有一個容器,則容器名可省略,-f可用於持續監控日誌輸出。

在容器中執行命令 命令格式為:

kubectl exec [-p](POD|TYPE/NAME) [-c CONTAINER][options] -- [COMMAND]

刪除資源物件 kubectl delete命令可以刪除資源物件,但對於受控於控制器的物件來說,刪除之後其控制器可能會重建出類似的物件,例如,Deployment控制器下的Pod物件在被刪除時就會被重建。 有些資源型別(如Pod),支援優雅刪除的機制,它們有著預設的刪除寬限期,可以在命令中使用--grace-period選項或--now選項來覆蓋預設的寬限期。

學習資料

《Kubernetes實戰進階》 馬永亮著

分享到: