Downward API有提供了兩種方式來實作從容器内部擷取POD資訊的方法:
環境變量的方式
Downward API 卷檔案挂載
通過這兩種方式,可以将pod的标簽資訊,資源資訊,狀态資訊傳遞到Pod内部。
參考連結
1、使用pod參數方式
使用如下檔案:
建立pod之後,通過logs檢視:
登入pod,可以直接檢視,發現環境變量中已經加載了這些參數:
通過yaml檔案中指定的valueFrom這種方式的Downward文法擷取相關Pod資訊。
2、 使用容器參數方式
如下檔案:
運作此pod,檢視日志:
1、使用Pod 參數
建立如下檔案:
通過downward API的volume方式,将pod的labels中的所有參數和annotations中的所有參數傳遞給了pod内。
在對應的路徑下,有一個隐藏的檔案目錄,存放了這兩個檔案。
2、通容器參數傳遞資源配額
如下Pod檔案:
通過如下方式,檢視pod中傳遞的參數:
Downward API的應用主要是在某些場景中,叢集中的每個節點将需要将自身的辨別(ID)及程序綁定IP位址等資訊事先寫入配置檔案中,程序啟動時讀取這些資訊釋出到服務的注冊中心,實作叢集節點的自動發現功能。
當我們執行<code>kubectl describe pod &lt;pod-name&gt;</code>時,會發現Pod都會有一個狀态值,下面列舉了Pod的5中狀态:
Pending: API server 已經建立該Pod,但是Pod内還有一個或多個容器鏡像沒有建立,一般是在下載下傳鏡像。
Running: Pod内的所有容器均已經建立,且至少有一個容器處于運作狀态、正在啟動或重新開機狀态。
Succeeded: Pod内所有容器均已經成功執行退出,且不再重新開機
Failed: Pod内所有容器均已退出,但至少有一個容器退出為失敗狀态。
Unknown: 由于某種原因無法擷取Pod狀态,可能由于網絡通信不暢導緻。
Pod的重新開機政策應用于Pod中的所有容器,并且僅在Pod所處的Node上由Kubelet進行判斷和重新開機操作。
RestartPolicy包含三個設定:
Always: 當容器失效時,由kubelet自動重新開機該容器。
OnFailure: 當容器終止運作且退出碼不為0時,由Kubelet自動重新開機該容器。
Never: 不論容器的運作狀态如何,Kubelet都不會重新開機該容器。
當管理Pod的控制包括ReplicationController、Job、DaemonSet以及直接通過Kubelet管理(靜态Pod),對應的控制器對Pod的重新開機政策要求如下:
RC和DaemonSet,ReplicaSet,Deployment: 必須設定為Always,需要保證容器的持續運作
Job: OnFailure 或Never,確定容器不再執行
kubelet: 在Pod失效時自動重新開機它,不論将RestartPolicy設定為什麼值,也不會對Pod進行健康檢查。
對Pod的健康狀态檢查可以通過兩類探針來檢查:LivenessProbe和ReadinessProbe。
livenessProbe: 判斷容器是否存活(running),如果檢測到容器不健康,則kubelet将殺掉該容器,并根據容器的重新開機政策做相應的處理。如果容器不包含LivenessProbe探針,則傳回永遠是Success。
readinessProbe: 用于判斷容器是否啟動完成(ready),可以接受請求。如果ReadinessProbe探針檢測到失敗,則Pod的狀态将被修改。Endpoint Controller将從Service的EndPoint中删除包含該容器所在的Pod的EndPoint。
容器的探針對容器有3中實作方式:
ExecAction: 在容器内執行一條指令,如果指令的傳回碼為0,則表示容器健康。
TCPSocketAction: 通過容器的端口号和IP位址執行TCP檢測,如果能夠建立TCP連接配接表示容器健康。
HTTPGetAction: 通過容器的IP位址、端口号及路徑調用HTTP Get方法,如果相應的狀态碼大于等于200且小于400,則認為容器狀态健康。
下面是對應的三個示例,闡述了這3中實作方式:
1、使用ExecAction方式:
通過如下指令,可以檢視到pod的健康狀态和重新開機次數:
2、使用TCPSockAction
如下檔案示例:
3、使用HTTPGetAction
readinessProbe 和livenessProbe 用法十分相似,隻需要把 readinessProbe替換為livenessProbe即可。它們可以同時使用在同一個容器上,來確定流量不會流入未準備好的容器,并且讓容器在失敗的時候重新啟動。