摘要:命名空間的一個總體目標是支持輕量級虛擬化工具的實現,機制本身對外提供一組進程,這組進程自己會認為它們就是系統唯一存在的進程。進程注冊的信號處理函數里,調用另一個系統調用來獲得子進程終止的原因。
大家在使用Docker容器或者Kubernetes時,遇到過這個容器么?gcr.io/google_containers/pause-amd64
docker ps的命令返回的結果:
[root@k8s-minion1 kubernetes]# docker ps |grep pause c3026adee957 gcr.io/google_containers/pause-amd64:3.0 "/pause" 22 minutes ago Up 22 minutes k8s_POD.d8dbe16c_redis-master-343230949-04glm_default_ce3f60a9-095d-11e7-914b-0a77ecd65f3e_66c108d5 202df18d636e gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 hours ago Up 24 hours k8s_POD.d8dbe16c_kube-proxy-js0z0_kube-system_2866cfc2-0891-11e7-914b-0a77ecd65f3e_c8e1a667 072d3414d33a gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 hours ago Up 24 hours k8s_POD.d8dbe16c_kube-flannel-ds-tsps5_default_2866e3fb-0891-11e7-914b-0a77ecd65f3e_be4b719e [root@k8s-minion1 kubernetes]#
Kubernetes的官網解釋:
it"s part of the infrastructure. This container is started first in all Pods to setup the network for the Pod.
意思是:pause-amd64是Kubernetes基礎設施的一部分,Kubernetes管理的所有pod里,pause-amd64容器是第一個啟動的,用于實現Kubernetes集群里pod之間的網絡通訊。
對這個特殊容器感興趣的朋友,可以閱讀其源代碼:
https://github.com/kubernetes...
我們查看這個pause-amd64鏡像的dockerfile,發現實現很簡單,基于一個空白鏡像開始:
FROM scratch ARG ARCH ADD bin/pause-${ARCH} /pause ENTRYPOINT ["/pause"]
ARG指令用于指定在執行docker build命令時傳遞進去的參數。
這個pause container是用C語言寫的:
https://www.ianlewis.org/en/a...
在運行的Kubernetes node上運行docker ps,能發現這些pause container:
pause container作為pod里其他所有container的parent container,主要有兩個職責:
是pod里其他容器共享Linux namespace的基礎
扮演PID 1的角色,負責處理僵尸進程
這兩點我會逐一細說。在Linux里,當父進程fork一個新進程時,子進程會從父進程繼承namespace。目前Linux實現了六種類型的namespace,每一個namespace是包裝了一些全局系統資源的抽象集合,這一抽象集合使得在進程的命名空間中可以看到全局系統資源。命名空間的一個總體目標是支持輕量級虛擬化工具container的實現,container機制本身對外提供一組進程,這組進程自己會認為它們就是系統唯一存在的進程。
在Linux里,父進程fork的子進程會繼承父進程的命名空間。與這種行為相反的一個系統命令就是unshare:
再來聊聊pause容器如何處理僵尸進程的。
Pause容器內其實就運行了一個非常簡單的進程,其邏輯可以從前面提到的Pause github倉庫上找到:
static void sigdown(int signo) { psignal(signo, "Shutting down, got signal"); exit(0); } static void sigreap(int signo) { while (waitpid(-1, NULL, WNOHANG) > 0); } int main() { if (getpid() != 1) /* Not an error because pause sees use outside of infra containers. */ fprintf(stderr, "Warning: pause should be the first process "); if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) return 1; if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) return 2; if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap, .sa_flags = SA_NOCLDSTOP}, NULL) < 0) return 3; for (;;) pause(); fprintf(stderr, "Error: infinite loop terminated "); return 42; }
這個c語言實現的進程,核心代碼就28行:
其中第24行里一個無限循環for(;;), 至此大家能看出來pause容器名稱的由來了吧?
這個無限循環里執行的是一個系統調用pause,
因此pause容器大部分時間都在沉睡,等待有信號將其喚醒。
接收什么信號呢?
一旦收到SIGCHLD信號,pause進程就執行注冊的sigreap函數。
看下SIGCHLD信號的幫助:
SIGCHLD,在一個進程正常終止或者停止時,將SIGCHLD信號發送給其父進程,按系統默認將忽略此信號,如果父進程希望被告知其子系統的這種狀態,則應捕捉此信號。
pause進程注冊的信號處理函數sigreap里,調用另一個系統調用waitpid來獲得子進程終止的原因。
希望這篇文章對大家理解Kubernetes里的pause容器有所幫助。感謝閱讀。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27630.html
摘要:命名空間的一個總體目標是支持輕量級虛擬化工具的實現,機制本身對外提供一組進程,這組進程自己會認為它們就是系統唯一存在的進程。進程注冊的信號處理函數里,調用另一個系統調用來獲得子進程終止的原因。 大家在使用Docker容器或者Kubernetes時,遇到過這個容器么?gcr.io/google_containers/pause-amd64 showImg(https://segmentf...
摘要:命名空間的一個總體目標是支持輕量級虛擬化工具的實現,機制本身對外提供一組進程,這組進程自己會認為它們就是系統唯一存在的進程。進程注冊的信號處理函數里,調用另一個系統調用來獲得子進程終止的原因。 大家在使用Docker容器或者Kubernetes時,遇到過這個容器么?gcr.io/google_containers/pause-amd64 showImg(https://segmentf...
摘要:基于的本地環境搭建與應用部署歸納于分布式容器與編排,參考了一文,更多或者相關資料參閱。最后我們還可以用與命令來刪除應用 showImg(https://segmentfault.com/img/remote/1460000006760432); 基于 Docker for MAC 的 Kubernetes 本地環境搭建與應用部署歸納于分布式容器與編排,參考了 Docker + Kub...
摘要:基于的本地環境搭建與應用部署歸納于分布式容器與編排,參考了一文,更多或者相關資料參閱。最后我們還可以用與命令來刪除應用 showImg(https://segmentfault.com/img/remote/1460000006760432); 基于 Docker for MAC 的 Kubernetes 本地環境搭建與應用部署歸納于分布式容器與編排,參考了 Docker + Kub...
摘要:序上次雖然寫了兩篇在裝的,但是僅僅限于初步安裝,這次再補上跑個,正好也趕上阿里云有相關鏡像,于是這里再次記錄下。 序 上次雖然寫了兩篇在mac裝kubernetes的,但是僅僅限于初步安裝,這次再補上跑個demo,正好也趕上阿里云有相關鏡像,于是這里再次記錄下。 安裝minikube curl -Lo minikube https://storage.googleapis.com/mi...
閱讀 2053·2021-11-11 16:55
閱讀 1395·2021-09-28 09:36
閱讀 1038·2019-08-29 15:21
閱讀 1571·2019-08-29 14:10
閱讀 2757·2019-08-29 14:08
閱讀 1628·2019-08-29 12:31
閱讀 3243·2019-08-29 12:31
閱讀 976·2019-08-26 16:47