kubernetes中的Pause容器如何理解?

image

前幾篇文章都是講的Kubernetes集羣和相關組件的部署,可是部署只是入門的第一步,得理解其中的一些知識才行。今天給你們分享下Kubernets的pause容器的做用。node

Pause容器 全稱infrastucture container(又叫infra)基礎容器。nginx

咱們在kubelet的配置文件中心都指定了以下參數,這是指定拉取的pause鏡像地址。docker

# more /etc/kubernetes/kubelet······--pod-infra-container-image=hub.test.tech/library/pod-infrastructure:latest"······

pause使用c語言編寫,官方使用的鏡像爲gcr.io/google_containers/pause-amd64:3.0,代碼見Github。flask

Pause的做用網絡

咱們看下在node節點上都會起不少pause容器,和pod是一一對應的。app

每一個Pod裏運行着一個特殊的被稱之爲Pause的容器,其餘容器則爲業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,所以他們之間通訊和數據交換更爲高效,在設計時咱們能夠充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。同一個Pod裏的容器之間僅需經過localhost就能互相通訊。學習

# docker ps······CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa007c18b8dc2 568c4670fa80 "nginx -g 'daemon of…" 1 hours ago Up 1 hours k8s_nginx_nginx-pod-7d9f9876cc-75sf7_default_a688bb46-f872-11e8-ae6b-000c29c6d12b_19866c08d1fv1 568c4670fa80 "nginx -g 'daemon of…" 1 hours ago Up 1 hours k8s_nginx_nginx-pod-7d9f9876cc-wpv4h_default_a6a899c0-f872-11e8-ae6b-000c29c6d12b_1aafef6727026 hub.test.tech/library/pod-infrastructure:latest "/pause" 1 hours ago Up 1 hours k8s_POD_flask-app-6f5b6cc447-kbxks_flask-app-extions-stage_374b8aa0-f873-11e8-ae6b-000c29c6d12b_1c4f48f90b27f hub.test.tech/library/pod-infrastructure:latest "/pause" 1 hours ago Up 1 hours k8s_POD_flask-app-6f5b6cc447-f9wjn_flask-app-extions-stage_373be9db-f873-11e8-ae6b-000c29c6d12b_1······

kubernetes中的pause容器主要爲每一個業務容器提供如下功能:google

PID命名空間:Pod中的不一樣應用程序能夠看到其餘應用程序的進程ID。spa

網絡命名空間:Pod中的多個容器可以訪問同一個IP和端口範圍。設計

IPC命名空間:Pod中的多個容器可以使用SystemV IPC或POSIX消息隊列進行通訊。

UTS命名空間:Pod中的多個容器共享一個主機名;Volumes(共享存儲卷):

Pod中的各個容器能夠訪問在Pod級別定義的Volumes。

例子演示

下面經過一個經典的例子演示

在The Almighty Pause Container(https://www.ianlewis.org/en/almighty-pause-container)這篇文章中作出了詳細的說明,pause容器的做用能夠從這個例子中看出,首先見下圖:

image

咱們首先在節點上運行一個pause容器。

$ docker run -d --name pause -p 8880:80 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1

而後再運行一個nginx容器,nginx將爲localhost:2368建立一個代理。

$ cat <<EOF >> nginx.confferror_log stderr;events { worker_connections 1024; }http {access_log /dev/stdout combined;server {listen 80 default_server;server_name example.com www.example.com;location / {proxy_pass http://127.0.0.1:2368;}}}EOF$ docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx

而後再爲ghost建立一個應用容器,這是一款博客軟件。

$ docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost

如今訪問http://localhost:8880/就能夠看到ghost博客的界面了。

解析

pause容器將內部的80端口映射到宿主機的8880端口,pause容器在宿主機上設置好了網絡namespace後,nginx容器加入到該網絡namespace中,咱們看到nginx容器啓動的時候指定了--net=container:pause,ghost容器一樣加入到了該網絡namespace中,這樣三個容器就共享了網絡,互相之間就可使用localhost直接通訊,--ipc=contianer:pause --pid=container:pause就是三個容器處於同一個namespace中,init進程爲pause,這時咱們進入到ghost容器中查看進程狀況。

# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 1024 4 ? Ss 13:49 0:00 /pauseroot 5 0.0 0.1 32432 5736 ? Ss 13:51 0:00 nginx: master psystemd+ 9 0.0 0.0 32980 3304 ? S 13:51 0:00 nginx: worker pnode 10 0.3 2.0 1254200 83788 ? Ssl 13:53 0:03 node current/inroot 79 0.1 0.0 4336 812 pts/0 Ss 14:09 0:00 shroot 87 0.0 0.0 17500 2080 pts/0 R+ 14:10 0:00 ps aux

在ghost容器中同時能夠看到pause和nginx容器的進程,而且pause容器的PID是1。而在kubernetes中容器的PID=1的進程即爲容器自己的業務進程。

往期文章一覽

一、Kubernetes集羣搭建之系統初始化配置篇

二、Kubernetes集羣搭建之企業級環境中基於Harbor搭建本身的私有倉庫

三、Kubernetes集羣搭建之Etcd集羣配置篇

四、Kubernetes集羣搭建之CNI-Flanneld部署篇

五、Kubernetes集羣搭建之Master配置篇

六、Kubernetes系列之Coredns and Dashboard介紹篇

七、Kubernetes系列之監控Metres-server實戰篇 END

若是您以爲不錯,請別忘了轉發、分享、點贊讓更多的人去學習, 您的舉手之勞,就是對小編最好的支持,很是感謝!

image

相關文章
相關標籤/搜索