Kubernetes Container Environment

翻譯自:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/con...node

概述

本文主要描述下在kubernetes的node節點中,kubelet管理container涉及到的environment。咱們能夠經過kubernetes cluster api來建立&管理container,那麼kubernetes container environment則爲集羣中的container添加一些屬性來描述一些集羣信息linux

集羣 能夠經過這些 集羣信息 來感知所建立的應用。此外,kubernetes container environment提供了一些「hook」,container可將這些hook做爲可選功能來使用,就比如傳統系統中來處理系統信號同樣,這些hook的設計初衷是爲了可以在kubernetes中更加簡單方便的建立穩定可擴展的應用。git

另外一個關於container environment的重要部分是關於 container內部使用的「文件系統」。在kubernetes中,這個」文件系統「是一個image和多個volume的集合。github

接下來的內容會聊聊 提供給container使用的 」集羣信息「 、container和管理模塊交互時使用的 hook 以及 對應的生命週期。docker

容器信息(Cluster Information)

在container的environment中可分爲兩類,一類是描述container自己信息,另外一類描述了系統中其餘對象的信息。segmentfault

container 信息(Container Information)

目前在container中,一個比較有用的environment是描述這個container所屬pod的」pod name「。container的hostname被設置爲這個 」pod name「,能夠經過hostname命令 或者 libc中的gethostname函數獲取到。此外,用戶自定義的environment一樣能夠在container被用戶有效使用。api

官方計劃在未來擴充container environment所能包含的信息,好比 所能使用的memory、重啓次數、已經任何可以從GET api獲取到的信息。函數

集羣信息(Cluster Information)

當一個container經過kubernetes api來建立時,當前kubernetes集羣中所包含的全部service信息都被做爲environment寫入container內部。spa

好比,一個service叫作foo,他映射的container的端口爲bar,那麼對應的environment爲:插件

FOO_SERVICE_HOST=<the host the service is running on>
FOO_SERVICE_PORT=<the port the service is running on>

官方會盡可能保證每一個service都有獨立不變的ip,因此經過dns的形式來訪問service是一個不錯的方法。

Container Hooks

Container Hooks目前正在積極開放之中,官方想把他做爲kubernetes管理系統中的可擴展插件。
Container Hooks爲container提供了在其生命週期中所觸發的event的信息。好比,當container 啓動,觸發了PostStart hook。它們和docker或者其餘系統產生的event不一樣,好比,output event提供已經發生的事件的日誌,input hook提供了正在發生的事情的實時通知,而不是已經發生的log。

Hook細節

目前有兩個在使用的hook,兩個推薦的hook:
PreStart - Proposed
在container建立前觸發他,它將提供這樣的信息:在本次調用結束後這個container將會被建立。 此hook沒有參數傳遞給handler。

PostStart
在container建立後觸發他。沒有參數傳遞給handler

PostRestart - Proposed
當一個container restart時,而不失第一次start,在PostStart handler以前調用他。沒有參數傳遞給handler。

PreStop
這個hook在一個container被終止以前被調用。這個事件handler是阻塞的,在消息發送給docker deamon來delete container以前完成。docker發送SIGTERM信號不會受影響。
一個名爲」reason「的參數會發送給handler,代表是由於什麼緣由被終止,他的值有如下:

  • Delete :代表有一個api的調用來刪除這個pod
  • Health :代表對這個container的健康檢查失敗了。
  • Dependency :這個container或pod的依賴丟失,所以這個container須要restart。好比,pod包含的container破壞,container在mount PD時操做磁盤失敗等。

Hook Handler Execution

當一個hook被觸發,系統將會調用全部被註冊在這個hook上的handler。在一個pod所包含的container中,hook handler的執行是同步的。這意味着,hook handler將會阻塞管理模塊發送的其餘操做指令,若是hook handler被阻塞,接下來的管理操做命令(包括健康檢查)都會被阻塞,直到handler完成。hook handler只會影響本pod,不會對其餘pod形成影響。官方固然但願用戶可以保持hook handler越簡單越輕量約好,固然不排除也有須要較長時間執行的handler(好比 在容器中止以前保存當前的狀態)。

(hook交付保證)Hook delivery guarantees

hook handler實現(Hook Handler Implementations)

hook handler是hook 操做處理container的方式。container選擇他們但願的handler類型來執行。kubernetes目前提供兩種hook handler類型:

  • Exec - 在容器的namespace/cgroup中執行指定的命令。若是命令最後輸出」ok「,則被認爲是處理正確,其餘輸出則被當作失敗(將會觸發kubelet重啓container)。參數以傳統linux的方式被傳遞給指令,好比pre-stop.sh --reason=HEALTH
  • HTTP - 執行一個http請求。http的5xx錯誤或者無反應被當作是失敗,參數以傳統http請求的方式傳遞。
相關文章
相關標籤/搜索