pause容器的工作
可知kubernetes的pod抽象基於Linux的namespace和cgroups,為容器提供了良好的隔離環境。在同一個pod中,不同容器猶如在localhost中。
在Unix系統中,PID為1的進程為init進程,即所有進程的父進程。它很特殊,維護一張進程表,不斷地檢查進程狀態。例如,一旦某個子進程由於父進程的錯誤而變成了“孤兒進程”,其便會被init進程進行收養並最終回收資源,從而結束進程。
或者,某子進程已經停止但進程表中仍然存在該進程,因為其父進程未進行wait syscall進行索引,從而該進程變成“僵屍進程”,這種僵屍進程存在時間較短。不過如果父進程只wait,而未syscall的話,僵屍進程便會存在較長時間。
同時,init進程不能處理某個信號邏輯,擁有“信號屏蔽”功能,從而防止init進程被誤殺。
容器中使用pid namespace來對pid進行隔離,從而每個容器中均有其獨立的init進程。例如對於寄主機上可以用個發送SIGKILL或者SIGSTOP(也就是docker kill 或者docker stop)來強制終止容器的運行,即終止容器內的init進程。一旦init進程被銷毀, 同一pid namespace下的進程也隨之被銷毀,並容器進程被回收相應資源。
kubernetes中的pause容器便被設計成為每個業務容器提供以下功能:
-
在pod中擔任Linux命名空間共享的基礎;
-
啟用pid命名空間,開啟init進程。
DaemonSet 確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod。
使用 DaemonSet 的一些典型用法:
- 運行集群存儲 daemon,例如在每個 Node 上運行
glusterd、ceph。 - 在每個 Node 上運行日志收集 daemon,例如
fluentd、logstash。 - 在每個 Node 上運行監控 daemon,例如 Prometheus Node Exporter、
collectd、Datadog 代理、New Relic 代理,或 Gangliagmond。
一個簡單的用法是,在所有的 Node 上都存在一個 DaemonSet,將被作為每種類型的 daemon 使用。 一個稍微復雜的用法可能是,對單獨的每種類型的 daemon 使用多個 DaemonSet,但具有不同的標志,和/或對不同硬件類型具有不同的內存、CPU要求。
命名空間可以通過配置文件創建。
創建一個命名為
development-ns.yaml的文件,並寫入以下內容:
kind: "Namespace" apiVersion: "v1" metadata: name: "development" labels: name: "development"
然后可以運行下面的命令創建新的命名空間:
$ kubectl create -f development-ns.yaml namespaces/development
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
了解linux的namespace,就要了解nsenter命令,是ubuntu新出的新特性,也是容器的基礎
- 掛起(Pending)時間和通過網絡下載鏡像的時間,這可能需要花點時間。
- 運行中(Running):該 Pod 已經綁定到了一個節點上,Pod 中所有的容器都已被創建。至少有一個容器正在運行,或者正處於啟動或重啟狀態。
- 成功(Successed):Pod 中的所有容器都被成功終止,並且不會再重啟。
- 失敗(Failed):Pod 中的所有容器都已終止了,並且至少有一個容器是因為失敗終止。也就是說,容器以非0狀態退出或者被系統終止。
- 未知(Unkonwn):因為某些原因無法取得 Pod 的狀態,通常是因為與 Pod 所在主機通信失敗。
