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

相关文章
相关标签/搜索