1. 程式人生 > >kubernetes實戰之二(Pod)

kubernetes實戰之二(Pod)

namespace temp 準備 版本 containe tcp esp .cn lur

Pod是kubernetes的基本操作單元,也是應用運行的載體。整個kubernetes系統都是圍繞著Pod展開的,比如如何部署運行Pod、如何保證Pod的可靠性、如何訪問Pod等。另外,Pod是一個或者多個相關容器的集合,這可以說是一大創新點,提供了一種容器組合的模型,當然也使得在Pod的操作和生命周期管理上稍有不同。
一、簡單示例:hell-world-pod.yaml
apiVersion:v1
kind:Pod
metadata:
name:hello-world
spec:
restartPolicy:OnFailure
containers:
-name:hello
image:"ubuntu14.04"
command:["/bin/echo","hello","world"]

主要元素解釋:


1.apiVersion:聲明kubernetes的API版本,目前是v1。
2.kind:聲明API對象的類型,這裏類型是Pod。
3.metadata:設置Pod的元數據。
3.1.name:指定Pod的名稱,Pod名稱必須在Namespace內唯一。
4.spec:配置Pod的具體規格。
4.1.restartPolicy:設置Pod的重啟策略。
4.2.containers:設置Pod中容器的規格,數組形式,每一項定義一個容器。
4.2.1.name:指定容器的名稱,在Pod的定義中唯一。
4.2.2.image:設置容器鏡像。
4.2.3.commond:設置容器的啟動命令。

二、Pod的基本操作
1.通過定義文件創建Hello World Pod:

$kubectl create -f hell-world-pod.yaml

2.創建成功後,可以查詢Hello World Pod:
$kubectl get pod hello-world
可以顯示查詢的Pod的簡易信息,其中查詢顯示的字段含義如下所示:
NAME:Pod的名稱
READY:Pod的準備狀況,右邊的數字表示Pod包含的容器總數目,左邊的數字表示準備就緒的容器數目
STATUS:Pod的狀態
RESTARTS:Pod的重啟次數
AGE:Pod的運行時間
其中Pod的準備狀況指的是Pod是否準備就緒以接收請求,Pod的準備狀況取決於容器,即所有容器都準備就緒了,Pod才準備就緒。這時候kubernetes的代理服務才會添加Pod作為分發後端,而一旦Pod的準備狀況變為false,kubernetes就會將Pod從代理服務的分發後端移除,即不會分發請求給該Pod。
也可以如下方式獲取Pod的完整信息:
$kubectl get pod hello-world json #用json格式顯示Pod的完整信息
$kubectl get pod hello-world yaml #用yaml格式顯示Pod的完整信息
另外,kubectl get支持以Go Template方式過濾出指定的信息,比如查詢Pod的運行狀態:
$kubectl get pods hell-world --output=go-template --template={{.status.phase}}
另一個命令kubectl describe支持查詢Pod的狀態和生命周期事件:
$kubectl describe pod hello-world

3.然後查詢Pod輸出:

$kubectl logs hell-world

4.最後刪除Hello World Pod:
$kubectl delete pod hell-world
另外,刪除所有Pod:
$kubectl delete pod --all

5.更新Pod:
$kubectl replace /path/to/hell-world-pod.yaml
但是因為Pod的很多屬性是沒辦法修改的,比如容器鏡像,這時候可以通過kubectl replace命令設置--force參數,等效於重建Pod。

三、Pod與容器
在Docker中,容器是最小處理單位,增刪改查的對象是容器,容器是一種虛擬化技術,容器之間是隔離的。隔離是基於Linux Namespace實現的,Linux內核提供了6種Linux Namespace隔離的系統調用,如下表所示:
技術分享圖片


四、Pod和鏡像
運行容器必須先指定鏡像,鏡像的名稱則遵循Docker的命名規範。kubernetes中可以選擇鏡像的下載策略如下:
1.Always:每次都下載最新的鏡像。
2.Never:只使用本地鏡像,從不下載。
3.IfNotPresent:只有當本地沒有的時候才下載鏡像。
kubernetes Node是容器運行的宿主機,Pod被分配到Node之後,會根據鏡像下載策略選擇是否下載鏡像。
Pod定義中一個容器鏡像的配置示例如下所示:
name:hello-world
image:"ubuntu14.04"
imagePullPolicy:Always

五、Pod定義中設置容器啟動命令和參數
示例如下:
apiVersion:v1
kind:Pod
metadata:
name:hello-world
spec:
restartPolicy:Never
containers:
-name:hello
image:"ubuntu14.04"
command:["/bin/echo","hello","world"]
另外,容器的啟動命令也可以配置為:
command:["/bin/echo"]
args:["hello","world"]
在Pod的定義中,command和args都是可選項,將和Docker鏡像的ENTRYPOINT和CMD相互作用,生成最終容器的啟動命令,具體規則如下所示:
1.如果容器沒有指定command和args,則容器使用鏡像的ENTRYPOINT和CMD作為啟動命令運行。
2.如果容器指定了command而沒有指定args,則容器忽略鏡像的ENTRYPOINT和CMD,使用指定的command作為啟動命令運行。
3.如果容器沒有指定command,只有指定了args,容器將使用鏡像的ENTRYPOINT和CMD作為啟動命令運行。
4.如果容器指定了command和args,則容器使用command和args作為啟動命令運行。

六、Pod中設置容器環境變量
Pod定義中可以設置容器運行時的環境變量:
env:
-name:parameter_1
value:value_1
-name:parameter_2
valule:value_2

七、Pod中設置容器端口
在Pod的定義中,通過.spec.containers[].ports[]設置容器的端口,數組形式,每一項的參數如下所示:
1.name:設置端口名稱,必須在Pod內唯一,當只配置一個端口的時候,這是一個可選項,當配置多個端口的時候,這是一個必選項。
2.containerPort:必選項,設置在容器內的端口,有效範圍為0~65536(不包括0和65536)。
3.protocol:可選項,設置端口的協議,Tcp或者UDP,默認是TCP。
4.hostIP:可選項,設置在宿主機上的IP,默認綁定到所有可用的IP接口上,即0.0.0.0。
5.hostPort:可選項,設置在宿主機上的端口,如果設置則進行端口映射,有效範圍為0~65536(不包括0和65536)。

八、Pod的重啟策略
重啟策略是通過Pod定義中的.spec.restartPolicy進行設置的,目前支持以下3種策略:
1.Always:當容器終止退出後,總是重啟容器,默認策略。
2.OnFailure:當容器終止異常退出時,才重啟容器。
3.Never:當容器終止退出時,從不重啟容器。

九、Pod的狀態和生命周期
Pod的本質是一組容器,Pod的狀態便是容器狀態的體現和概括,同時容器的狀態變化會影響Pod的狀態變化,觸發Pod的生命周期階段轉換。
1.容器狀態
在使用docker run運行容器的時候,首先會下載容器鏡像。下載成功後運行容器,當容器運行結束退出後(包括正常和異常退出),容器終止,這是一個容器的生命周期過程。相應的,kubernetes中對Pod中的容器進行了狀態的記錄,其中每種狀態下包含的信息如下:
1.1.Waiting:容器正在等待創建
Reason:等待原因
1.2.Running:容器已經創建,並且正在運行
startedAt:容器創建時間
1.3.Terminated:容器終止退出
exitCode:退出碼
signal:容器退出的信號
reason:容器退出原因
message:容器退出信息
startedAt:容器創建時間
finishedAt:容器退出時間
containerID:容器的ID
Pod運行後,可以查詢其中容器的狀態:
$kubectl describe pod hello-world

2.Pod的生命周期
首先Pod被創建,緊接著Pod被調用到Node進行部署運行。Pod是非常忠誠的,一旦被分配到Node後,就不會離開這個Node,直到它被刪除,生命周期完結。
Pod生命周期的階段:
2.1.Pending:Pod已經被創建。但是一個或者多個容器還未創建,這包括Pod調度階段,以及容器鏡像的下載過程。
2.2.Running:Pod已經被調度到Node,所有容器已經創建,並且至少一個容器在運行或者正在重啟。
2.3.Succeeded:Pod中所有容器正常退出。
2.4.Failed:Pod中所有容器退出,至少有一個容器是一次退出的。
查詢Pod處於生命周期的階段:
$kubectl get pods hello-world --template="{{.status.phase}}"

kubernetes實戰之二(Pod)