系列目錄html
Pod是Kubernetes調度的最小單元。一個Pod能夠包含一個或多個容器,所以它能夠被看做是內部容器的邏輯宿主機。Pod的設計理念是爲了支持多個容器在一個Pod中共享網絡和文件系統 所以處於一個Pod中的多個容器共享如下資源:nginx
PID命名空間:Pod中不一樣的應用程序能夠看到其餘應用程序的進程ID。json
network命名空間:Pod中多個容器處於同一個網絡命名空間,所以可以訪問的IP和端口範圍都是相同的。也能夠經過localhost相互訪問。api
IPC命名空間:Pod中的多個容器共享Inner-process Communication命名空間,所以能夠經過SystemV IPC或POSIX進行進程間通訊。
UTS命名空間:Pod中的多個容器共享同一個主機名。bash
Volumes:Pod中各個容器能夠共享在Pod中定義分存儲卷(Volume)。網絡
Pod,容器與Node(工做主機)之間的關係以下圖所示:app
經過yaml文件或者json描述Pod和其內容器的運行環境和指望狀態,例如一個最簡單的運行nginx應用的pod,定義以下:google
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
在生產環境中,推薦使用諸如Deployment,StatefulSet,Job或者CronJob等控制器來建立Pod,而不是直接建立。spa
將上述pod描述文件保存爲nginx-pod.yaml,使用kubectl apply命令運行pod設計
kubectl apply -f nginx-pod.yaml
下面簡要分析一下上面的Pod定義文件:
spec: 其它描述信息,包含Pod中運行的容器,容器中運行的應用等等。不一樣類型的對象擁有不一樣的spec定義。詳情參見API文檔:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/
Kubernetes在每一個Pod啓動時,會自動建立一個鏡像爲
gcr.io/google_containers/pause:version
的容器,全部處於該Pod中的容器在啓動時都會添加諸如--net=container:pause --ipc=contianer:pause --pid=container:pause的啓動參數,所以pause容器成爲Pod內共享命名空間的基礎。全部容器共享pause容器的IP地址,也被稱爲Pod IP。
若是咱們但願從外部訪問這nginx應用,那麼咱們還須要建立Service對象來暴露IP和port。
Pod的生命週期是Replication Controller進行管理的。一個Pod的生命週期過程包括:
經過yaml或json對Pod進行描述
apiserver(運行在Master主機)收到建立Pod的請求後,將此Pod對象的定義存儲在etcd中
scheduler(運行在Master主機)將此Pod分配到Node上運行
Pod內全部容器運行結束後此Pod也結束
在整個過程當中,Pod一般處於如下的五種階段之一:
Pending:Pod定義正確,提交到Master,但其所包含的容器鏡像還未徹底建立。一般,Master對Pod進行調度須要一些時間,Node進行容器鏡像的下載也須要一些時間,啓動容器也須要必定時間。(寫數據到etcd,調度,pull鏡像,啓動容器)。
Running:Pod已經被分配到某個Node上,而且全部的容器都被建立完畢,至少有一個容器正在運行中,或者有容器正在啓動或重啓中。
Succeeded:Pod中全部的容器都成功運行結束,而且不會被重啓。這是Pod的一種最終狀態
Failed:Pod中全部的容器都運行結束了,其中至少有一個容器是非正常結束的(exit code不是0)。這也是Pod的一種最終狀態。
Unknown:沒法得到Pod的狀態,一般是因爲沒法和Pod所在的Node進行通訊。
定義Pod時,能夠指定restartPolicy字段,代表此Pod中的容器在何種條件下會重啓。restartPolicy擁有三個候選值:
Always:只要退出就重啓
OnFailure:失敗退出時(exit code不爲0)才重啓
Never:永遠不重啓
Pod自己不具有容錯性,這意味着若是Pod運行的Node宕機了,那麼該Pod沒法恢復。所以推薦使用Deployment等控制器來建立Pod並管理。
通常來講,Pod不會自動消失,只能手動銷燬或者被預先定義好的controller銷燬。但有一種特殊狀況,當Pod處於Succeeded或Failed階段,而且超過必定時間後(由master決定),會觸發超時過時從而被銷燬。
整體上來講,Kubernetes中擁有三種類型的controller:
Job。一般用於管理必定會結束的Pod。若是但願Pod被Job controller管理,那麼restartPolicy必須指定爲OnFailure或Never。
ReplicationController,ReplicaSet和Deployment。用於管理永遠處於運行狀態的Pod。若是但願Pod被此類controller管理,那麼restartPolicy必須指定爲Always。
DaemonSet。它可以保證你的Pod在每一臺Node都運行一個副本。