一些重要的k8s概念


1. Pause容器是什么
作為init pod存在,其他pod都會從pause 容器中fork出來
由pause容器管理

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進程。

 
tini-init是一個容器初始化命令, 與pause container的差別在於,通過tini可以初始化一個docker, pause是調度k8s集群及命名空間共享的基礎
dumb init可以立即生成一個pid=1的子進程用於處理和轉發信號
dumb init是在docker內一個可執行的二進制文件
tini和dumb是同一個東西,容器內的初始化
與pause container的差別是使用兩個鏡像還是一個鏡像。
entry point更新時,使用tini 或dumb要使用發版-重啟操作;但使用pause container,只要重啟就可以
在其他使用場景上沒有差別
 
 
 
2. Daemon sets

DaemonSet 確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod。

使用 DaemonSet 的一些典型用法:

  • 運行集群存儲 daemon,例如在每個 Node 上運行 glusterdceph
  • 在每個 Node 上運行日志收集 daemon,例如fluentdlogstash
  • 在每個 Node 上運行監控 daemon,例如 Prometheus Node Exportercollectd、Datadog 代理、New Relic 代理,或 Ganglia gmond

一個簡單的用法是,在所有的 Node 上都存在一個 DaemonSet,將被作為每種類型的 daemon 使用。 一個稍微復雜的用法可能是,對單獨的每種類型的 daemon 使用多個 DaemonSet,但具有不同的標志,和/或對不同硬件類型具有不同的內存、CPU要求。

 
3. svc是k8s 集群對外提供服務的最小節點。
 
4. etcd 所有的持久狀態數據存儲在etcd集群中。它提供了一種分布式的方式來可靠地存儲配置數據。
 
5. 命名空間
命名空間就像一個資源名稱的前綴。命名空間幫助不同的項目,環境(例如,開發和生產),團隊或客戶共享同一個集群。它能夠阻止名稱沖突。
命名空間可以通過配置文件創建。
命名空間的作用是在同一個命名空間下的進程和線程可以共享資源,如網絡,文件系統,PID、網絡、IPC

創建一個命名為 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新出的新特性,也是容器的基礎
6. pod的生命周期
  • 掛起(Pending)時間和通過網絡下載鏡像的時間,這可能需要花點時間。
  • 運行中(Running):該 Pod 已經綁定到了一個節點上,Pod 中所有的容器都已被創建。至少有一個容器正在運行,或者正處於啟動或重啟狀態。
  • 成功(Successed):Pod 中的所有容器都被成功終止,並且不會再重啟。
  • 失敗(Failed):Pod 中的所有容器都已終止了,並且至少有一個容器是因為失敗終止。也就是說,容器以非0狀態退出或者被系統終止。
  • 未知(Unkonwn):因為某些原因無法取得 Pod 的狀態,通常是因為與 Pod 所在主機通信失敗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM