k8s的pause容器有什么用?是否可以去掉?


一、詳解

  • 在檢查k8s集群狀態的時候會發現有很多 pause 容器運行於服務器上面,然后每次啟動一個容器,都會伴隨一個pause容器的啟動。那它究竟是干啥的?
  • Pause容器,又叫Infra容器,下面通過實驗來理解它。
  • Pause容器,是可以自己來定義,官方使用的gcr.io/google_containers/pause-amd64:3.0容器的代碼見Github。

kubelet的配置中有這樣一個參數

[root@linux-node1 cfg]# more /usr/lib/systemd/system/kubelet.service
  --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 \

二、Pause容器的作用

檢查node節點的時候會發現每個node上都運行了很多的pause容器,例如:

[root@linux-node1 cfg]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
a007c18b8dc0        568c4670fa80                             "nginx -g 'daemon of…"   42 hours ago        Up 42 hours                             k8s_nginx_nginx-pod-7d9f9876cc-75sf7_default_a688bb46-f872-11e8-ae6b-000c29c6d12b_1
9866c08d1f4b        568c4670fa80                             "nginx -g 'daemon of…"   42 hours ago        Up 42 hours                             k8s_nginx_nginx-pod-7d9f9876cc-wpv4h_default_a6a899c0-f872-11e8-ae6b-000c29c6d12b_1
aafef6727026        mirrorgooglecontainers/pause-amd64:3.0   "/pause"                 42 hours ago        Up 42 hours                             k8s_POD_flask-app-6f5b6cc447-kbxks_flask-app-extions-stage_374b8aa0-f873-11e8-ae6b-000c29c6d12b_1
c4f48f90b27f        mirrorgooglecontainers/pause-amd64:3.0   "/pause"                 42 hours ago        Up 42 hours                             k8s_POD_flask-app-6f5b6cc447-f9wjn_flask-app-extions-stage_373be9db-f873-11e8-ae6b-000c29c6d12b_1
9f452e6961f6        mirrorgooglecontainers/pause-amd64:3.0   "/pause"                 42 hours ago        Up 42 hours                             k8s_POD_nginx-pod-7d9f9876cc-ccx94_default_a6a8c440-f872-11e8-ae6b-000c29c6d12b_1
7e68043469d1        mirrorgooglecontainers/pause-amd64:3.0   "/pause"                 42 hours ago        Up 42 hours                             k8s_POD_nginx-pod-7d9f9876cc-sskpk_default_a6ac43bd-f872-11e8-ae6b-000c29c6d12b_1

kubernetes中的pause容器主要為每個業務容器提供以下功能:

  • 在pod中擔任Linux命名空間共享的基礎;
  • 啟用pid命名空間,開啟init進程。

三、案例
1、在節點上運行一個pause容器

[root@k8s-node1 ~]# docker run -d --name pause -p 8880:80 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1
38d2aa8366d5aa6fe4c57aa0d879de4b5259c67c83d17428dd4d9f8937205c02

[root@k8s-node1 ~]# docker ps | grep pause
38d2aa8366d5        registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1   "/pause"                 14 seconds ago      Up 13 seconds       0.0.0.0:8880->80/tcp   pause

2、然后再運行一個nginx容器,nginx將為localhost:2368創建一個代理。

[root@k8s-node1 ~]# cat <<EOF >> nginx.conf
error_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

[root@k8s-node1 ~]# docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx
fa078473c01e040db795004ad16db525dea8a113893d3052cc6ab1c5e117ba10

3、再為ghost創建一個應用容器,這是一款博客軟件

[root@linux-node2 ~]# docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost

4、查看結果

[root@k8s-node1 ~]# docker ps | grep -E "pause|nginx|ghost"
9b796efd95a5        ghost                                                                 "docker-entrypoint..."   47 seconds ago       Up 46 seconds                              ghost
fa078473c01e        nginx                                                                 "nginx -g 'daemon ..."   About a minute ago   Up About a minute                          nginx
38d2aa8366d5        registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1   "/pause"                 3 minutes ago        Up 3 minutes        0.0.0.0:8880->80/tcp   pause

5、現在訪問http://119.3.198.128:8880/就可以看到ghost博客的界面或者直接用 curl 然后瀏覽器訪問也可以

[root@k8s-node1 ~]# curl -I http://119.3.198.128:8880/
HTTP/1.1 200 OK
Server: nginx/1.15.5
Date: Fri, 07 Dec 2018 08:35:49 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 17381
Connection: keep-alive
X-Powered-By: Express
Cache-Control: public, max-age=0
ETag: W/"43e5-ELHSnbaoapp3YOyz+PU502oJo5E"
Vary: Accept-Encoding

6、進入ghost容器中查看

[root@k8s-node1 ~]# docker exec -it ghost /bin/bash
root@38d2aa8366d5:/var/lib/ghost# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1012     4 ?        Ss   08:27   0:00 /pause
root         5  0.0  0.0  32472  3168 ?        Ss   08:29   0:00 nginx: master process nginx -g daemon off;
systemd+     9  0.0  0.0  32932  1812 ?        S    08:29   0:00 nginx: worker process
node        10  0.5  2.1 1262748 84688 ?       Ssl  08:30   0:03 node current/index.js
root        83  0.2  0.0  20240  1912 pts/0    Ss   08:41   0:00 /bin/bash
root        87  0.0  0.0  17496  1148 pts/0    R+   08:41   0:00 ps aux
在ghost容器中同時可以看到pause和nginx容器的進程,並且pause容器的PID是1。而在kubernetes中容器的PID=1的進程即為容器本身的業務進程。

注釋2:

  • pause 容器將內部的80端口映射到了宿主機的8880端口;
  • pause容器在宿主機上設置好了網絡namespace后,nginx容器加入到該網絡namespace中;
  • nginx容器啟動的時候指定了–net=container:pause;
  • ghost容器啟動的時候同樣加入到了該網絡namespace中;
  • 這樣三個容器就共享了網絡,互相之間就可以使用localhost直接通信,
  • –ipc=contianer:pause –pid=container:pause就是三個容器處於同一個namespace中,init進程為pause;

注釋3:

  • PID命名空間:Pod中的不同應用程序可以看到其他應用程序的進程ID;
  • 網絡命名空間:Pod中的多個容器能夠訪問同一個IP和端口范圍;
  • IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信;
  • UTS命名空間:Pod中的多個容器共享一個主機名;Volumes(共享存儲卷;
  • Pod中的各個容器可以訪問在Pod級別定義的Volumes;


免責聲明!

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



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