kubernetes之pause容器介紹


一.簡單說明

我們在啟動Pod的時候,發現有很多pause容器運行。每次啟動一個Pod,都會運行一個pause容器。那么這個pause容器究竟是干啥的,它到底有什么作用呢?
Pause容器又叫Infra容器,我們在啟動kubelet的服務時,指定了下面的配置參數:

--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1

這個Pause容器的版本,我們可以自己構建,也可以直接采用官方提供的版本。關於pause容器的構建,可以參考https://github.com/kubernetes/kubernetes/tree/master/build/pause進行。

這里我們在kubernetes的node節點,執行docker ps,可以發現每個node上運行了很多的pause容器,具體如下:

[root@k8s002 ~]# docker ps |grep pause
d316fa79ddf6        mirrorgooglecontainers/pause-amd64:3.1   "/pause"                 6 days ago          Up 6 days                               k8s_POD_kafka-2_kafka_852a
6124-3870-11eb-95e3-000c295ccbe7_0406c946ee75c        mirrorgooglecontainers/pause-amd64:3.1   "/pause"                 6 days ago          Up 6 days                               k8s_POD_test-redis-5f79b66bc
8-5shqd_test_8cae9d57-386f-11eb-95e3-000c295ccbe7_040c96739a14e        mirrorgooglecontainers/pause-amd64:3.1   "/pause"                 6 days ago          Up 6 days                               k8s_POD_zk-2_kafka_749c97a

這里,每個Pod都有一個特殊的被稱為"根容器"的Pause容器,其它容器則為業務容器。這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此它們之間通信和數據交換更為高效。在設計時,我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。同一個Pod里的容器通過localhost就能互相通信。

二.kubernetes的pause容器功能

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

  • 在pod中擔任與其它容器namespace共享的基礎

這里我們舉個示例進行說明:

1)運行一個pause容器:

[root@k8s001 ~]# docker run -d --name pause -p 8080:80 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1

2)運行一個nginx容器,nginx將為localhost:2368創建一個代理

[root@k8s001 ~]# 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@k8s001 ~]# docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx

3)為ghost創建一個應用容器(這是一個博客軟件)

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

4)驗證

# 查看運行的容器
[root@k8s001 ~]# docker ps | grep -E "pause|nginx|ghost"
f72edf025141        ghost                                                                 "docker-entrypoint.s…"   About a minute ago   Up About a minute                  
        ghost7ac2d677fbf7        nginx                                                                 "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes                       
        nginxb33f3b7c705d        registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1   "/pause"                 15 minutes ago       Up 15 minutes       0.0.0.0:8880->80
/tcp   pause
# 通過瀏覽器訪問http://ip:8880端口,查看是否可以訪問到ghost界面
# 或者通過curl抓取頁面內容
[root@k8s001 ~]# curl http://localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>

    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

    <title>Ghost</title>
    <meta name="HandheldFriendly" content="True" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
......

從上面的步驟可見:

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

這里,我們進入ghost容器內部查看:

[root@k8s001 ~]# docker exec -it f72edf025141 /bin/bash
root@b33f3b7c705d:/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   02:45   0:00 /pause
root          8  0.0  0.0  10648  3400 ?        Ss   02:57   0:00 nginx: master process nginx -g daemon off;
101          37  0.0  0.0  11088  1964 ?        S    02:57   0:00 nginx: worker process
node         38  0.9  0.0 2006968 116572 ?      Ssl  02:58   0:06 node current/index.js
root        108  0.0  0.0   3960  2076 pts/0    Ss   03:09   0:00 /bin/bash
root        439  0.0  0.0   7628  1400 pts/0    R+   03:10   0:00 ps aux

在ghost容器中可以看到pause和nginx容器的進程,並且pause容器的PID為1,而在kubernetes中容器的PID=1的進程則為容器本身的業務進程。


免責聲明!

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



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