Pod是可以創建和管理Kubernetes計算的最小可部署單元,一個Pod代表着集羣中運行的一個進程,每個pod都有一個唯一的
ip。一個pod類似一個豌豆莢,包含一個或多個容器(通常是docker),多個容器間共享IPC、Network和UTC namespace。
Pod的生命週期
創建一個pod
kubectl describe pod myapp查看具體的pod的信息
Pod 可以包含多個容器,應用運行在這些容器裏面,同時 Pod 也可以有一個或多個先於應用容器啓動的 Init 容器。
Init 容器與普通的容器非常像,除了如下兩點:
它們總是運行到完成。
Init 容器不支持 Readiness,因爲它們必須在 Pod 就緒之前運行完成。
每個 Init 容器必須運行成功,下一個才能夠運行。
如果 Pod 的 Init 容器失敗,Kubernetes 會不斷地重啓該 Pod,直到 Init 容器成功爲止。然而,如果 Pod 對應的 restartPolicy 值爲 Never,它不會重新啓動。
•Init 容器能做什麼?
•Init 容器可以包含一些安裝過程中應用容器中不存在的實用工具或個性化代碼。
•Init 容器可以安全地運行這些工具,避免這些工具導致應用鏡像的安全性降低。
•應用鏡像的創建者和部署者可以各自獨立工作,而沒有必要聯合構建一個單獨的應用鏡像
•Init 容器能以不同於Pod內應用容器的文件系統視圖運行。因此,Init容器可具有訪問 Secrets 的權限,而應用容器不能夠訪問。
•由於 Init 容器必須在應用容器啓動之前運行完成,因此 Init 容器提供了一種機制來阻塞或延遲應用容器的啓動,直到滿足了一組先決條件。一旦前置條件滿足,Pod內的所有的應用容器會並行啓動。
我們創建一個init
查看
只有初始化成功纔會執行pod
創建一個service讓外部的可以訪問我們的
創建完成後就可以完成解析
read爲1就表明可以對外訪問了,用戶可以訪問到他,然後就開始執行別的
探針 是由 kubelet 對容器執行的定期診斷:
ExecAction:在容器內執行指定命令。如果命令退出時返回碼爲 0 則認爲診斷成功
•TCPSocketAction:對指定端口上的容器的 IP 地址進行 TCP 檢查。如果端口打開,則診斷被認爲是成功的。
•HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get 請求。如果響應的狀態碼大於等於200 且小於 400,則診斷被認爲是成功的。
•每次探測都將獲得以下三種結果之一:
•成功:容器通過了診斷。
•失敗:容器未通過診斷。
•未知:診斷失敗,因此不會採取任何行動。
探針的狀態
掛起(Pending):Pod 已被Kubernetes系統接受,但有一個或者多個容器讀像尚未創建。等待時間包括調度Pod的時間和通過網絡下載統像的時間,這可能需要花點時間。
運行中(Runming):該Pod已經綁定到了一個節點上,Pod中所有的容器都已被創難。至少有一個容器正在運行,或者正處於啓動或重啓狀態。
成功(Succeeded):Pod中的所有容器都被成功終止,並且不會再重啓。
失敗aied):Pod中的所有容貓都已終止了,並且至少有一個容貓是因爲失敗終止。也就是說,容器以非0狀態退出或者被系統終止。
未知(Unknown):因爲某些原因無法粵得Pod的狀態,通常是因爲與Pod所在主機通信失敗。
常用的探針
livenessProbe:指示容器是否正在運行。如果存活探測失敗,則kubelet會殺死容器,並且容器將受到其重啓集路的影響。如果容器不損供存活探針,則默認狀態爲Success。
readinessProbe:指示容器是否準備好服務請求。如果就緒探測失敗,端點控制器將從與Pod匹配的所有Service的媒點中刪除該Pod的P地址。初始廷遲之前的就緒狀態默認爲Failure。如果容器不提供就緒探針,則默認狀態爲Success。
探針存活檢測
檢測延時、檢測頻率、檢測超時
然後創建探針
如果我們把端口改成8080就會一直重啓,因爲myapp佔用的是80端口
查看restart的狀態分別是0、1、2一直再重啓
就緒檢測
一直未read但是就是沒有就緒查看日誌
因爲找不到test.html文件
這個時候如果我們把文件創建上就會就緒
他會持續檢測,如果我們刪除頁面,發現就緒又變成0爲未完成
重啓策略
•PodSpec 中有一個 restartPolicy 字段,可能的值爲 Always、OnFailure 和 Never。默認爲 Always。
•Pod 的生命
•一般Pod 不會消失,直到人爲銷燬他們,這可能是一個人或控制器。
•建議創建適當的控制器來創建 Pod,而不是直接自己創建 Pod。因爲單獨的 Pod 在機器故障的情況下沒有辦法自動復原,而控制器卻可以
•三種可用的控制器:
•使用 Job 運行預期會終止的 Pod,例如批量計算。Job 僅適用於重啓策略爲 OnFailure 或 Never 的 Pod。
•對預期不會終止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服務器。 ReplicationController 僅適用於具有 restartPolicy 爲 Always 的 Pod。
•提供特定於機器的系統服務,使用 DaemonSet 爲每臺機器運行一個 Pod 。
控制器
創建一個rs.yml
用來控制pod副本
修改app的label
我們創建一個deploment控制
我們如果將上述replicas改爲4就相當於做了一個拉伸
如果我們上述鏡像改成v2相當於做了滾動更新
這樣他會重新建立四個新的並且刪除原來的
查看更新結果
在做滾動更新的時候首先創建一個rs然後重建原來的pod刪除原來的pod並且斷開原來的rs並且保留
如果rs比較多我們可以刪除
但是pod還是存在的
daemonset
創建一個yml文件
當我們刪除pod的時候他會自動幫我們拉取
vim job.yaml(計算圓周率)