Kubernetes學習之pause容器

根據代碼看到,pause容器運行着一個很是簡單的進程,它不執行任何功能,一啓動就永遠把本身阻塞住了,nginx

它的做用就是扮演PID1的角色,並在子進程稱爲"孤兒進程"的時候,經過調用wait()收割這個子進程,這樣就不用擔憂咱們的Pod的PID namespace裏會堆滿殭屍進程了,這也是爲何kubernetes不隨便找個容器,例如Nginx做爲父容器,讓其餘容器加入的緣由docker

共享namespace的意思就是父進程先建立一個namespace,而後其餘進程加入到該namespace就共享namespace了vim

1、從network namespace看pause容器

使用pause容器和共享namespace建立Pod後端

使用docker啓動pause進程,以即可以將其餘容器添加到Pod中bash

docker run  -d --name pause gcr.io/google_containers/pause-amd64:3.0

而後,在Pod中運行其餘容器,分別是Nginx代理和ghost博客應用google

Nginx代理的後端配置成http://127.0.0.1:2368,也就是ghost進程監聽的地址spa

##建立nginx配置文件
vim nginx.conf
error_log stderr;
events { worker_connections 1024; }

http {
    access_log /dev/stdout combined;
    server {
        listen 80 default_server;
        server_name www.example.com;
        location / {
            proxy_pass http://127.0.0.1:2368
        }
    }
}

##啓動nginx容器
docker  run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf -p 8080:80 --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

在這個例子中,咱們將nginx容器和ghost容器 加入到pause容器的namespace,若是要訪問http://localhost:8080,就能看到ghost經過nginx代理運行,由於pause、nginx、ghost容器之間共享network namespacecode

注意:共享network namespace,一個pod中的nginx容器才能經過127.0.0.1:2368找到ghost,由於在一個network namespace內,才能經過localhost通訊,至關於在一臺機器裏server

 

2、從PID namespace看容器

在UNIX系統中,PID爲1 的進程是init進程,即全部進程的父進程.init進程比較特殊,它維護一張進程表而且不斷的檢查其餘進程的狀態.init進程其中一個做用就是當某個子進程因爲父進程的錯誤退出而變成了"孤兒進程",就會被init進程"收養"並在該進程退出時回收系統資源

在容器中PID namespace對PID進行隔離,所以每一個容器中均可以有獨立的init進程.當在主機發送SIGKILL或者SIGSTOP(也就是docker kill或者docker stop命令)強制終止容器的運行時,其實就是在終止容器內的init進程.一旦init進程被銷燬,同一PID namespace下的進程也隨之被銷燬

容器中,必需要有一個進程充當每一個PID namespace的init進程,使用docker的話,ENTRYPOINT進程就是init進程,若是多個容器之間共享PID namespace,那麼擁有PID namespace的那個進程要承擔init進程的角色,其餘容器做爲init進程的子進程添加到PID namespace中

舉例說明用戶容器和PID容器的關係

先啓動一個pause容器

docker  run -idt --name pause gcr.io/google_containers/pause_amd64:3.0

在運行一個busybox容器,加入pause容器的namespace(Network PID IPC)

docker run -idt --name busybox --net=container:pause --pid=container:pause --ipc=container:pause busybox

上面這種加入的方式也是kubernetes啓動pod的原理

進入busybox容器查看裏面的進程,發現PID=1的進程是/pause

docker exec -it busybox /bin/bash 
/ # ps aux
PID    USER   TIME    COMMAND
1        root      0:00      /pause
5        root       0:00     sh
9        root       0:00     /bin/bash
13      root       0:00      ps aux

爲何不用別的容器作init進程,好比Nginx容器,若是因爲子進程的父進程意外退出,那麼子進程就成了"孤兒進程",Nginx容器沒辦法回收子進程退出後的資源

相關文章
相關標籤/搜索