kubernetes之pause容器介紹
阿新 • • 發佈:2020-12-14
一.簡單說明
我們在啟動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的程序則為容器本身的業務程序。