[Kubernetes][k8s] Kubernetes 中的 pause 的作用與目的 pod 的實作與構成與到底有什麼用途呢?
在使用 Kubernetes 的時候,在host 的cluster 內,使用docker ps 會看到很多 pause image ( k8s.gcr.io/pause-amd64:3.1 )
20d06cf30561 k8s.gcr.io/pause-amd64:3.1 "/pause" 18 hours ago Up 18 hours k8s_POD_kube-controller-manager-minikube_kube-system_7282c21234a0e98b6d9184540c8b063f_0
be6c4341a904 k8s.gcr.io/pause-amd64:3.1 "/pause" 18 hours ago Up 18 hours k8s_POD_kube-apiserver-minikube_kube-system_961222ac4567e8837165febc6e3d442e_0
21140ceeb7e6 k8s.gcr.io/pause-amd64:3.1 "/pause" 18 hours ago Up 18 hours k8s_POD_kube-addon-manager-minikube_kube-system_3afaf06535cc3b85be93c31632b765da_0
2c1853c3ddb3 k8s.gcr.io/pause-amd64:3.1 "/pause" 18 hours ago Up 18 hours k8s_POD_kube-scheduler-minikube_kube-system_31cf0ccbee286239d451edb6fb511513_0
06b05decec1c k8s.gcr.io/pause-amd64:3.1 "/pause" 18 hours ago Up 18 hours
在 Kubernates 中 pause container 透過 docker 的機制提供了 pod 共享資源的基礎 ,
經由 docker --net=container: 方式共用同一個 namespace
pause 的原始碼,可以在這裡看到
kubernetes/pause.c at master · kubernetes/kubernetes https://github.com/kubernetes/kubernetes/blob/master/build/pause/pause.c
The Dockerfile is here: it just adds pause binary to an empty container.
The pause code is here: it just waits until it receives SIGINT or SIGTERM.
SIGINT 程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出,用於通知前台進程組終止進程。
SIGTERM 程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。
舉個例子來看 我們創建三個 container pause , nginx , blog 平台 ghost
pause 為初始的namespace 並開放 8880 port 並導向localhost 80 port ,然後 nginx container proxy_pass 從 80 port 導到 ghost 平台的 2368 port 。
docker run -d --name pause -p 8880:80 gcr.io/google_containers/pause-amd64:3.0
docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx
docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost
pause 為初始的namespace 並開放 8880 port 並導向localhost 80 port ,然後 nginx container proxy_pass 從 80 port 導到 ghost 平台的 2368 port 。
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
docker run -d --name pause -p 8880:80 gcr.io/google_containers/pause-amd64:3.0
docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx
docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost
進入 ghost container 看的話
docker exec -it 77e5334c8d27 /bin/bash
root@49ec39f81460:/var/lib/ghost# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1028 0 ? Ss Jul04 0:00 /pause
root 7 0.0 0.0 32480 48 ? Ss Jul04 0:00 nginx: master p
systemd+ 13 0.0 0.0 32940 16 ? S Jul04 0:00 nginx: worker p
node 14 0.0 0.0 1262244 5192 ? Ssl Jul04 0:08 node current/in
root 100 0.1 0.0 20252 3164 pts/0 Ss 03:35 0:00 /bin/bash
root 106 0.0 0.0 17508 2068 pts/0 R+ 03:35 0:00 ps aux
可以看到 pause pid 是 1 , nginx pid 分別是 7,13 , ghost 的node 起在pid 14 。
Kubernetes 透過 docker 的 --net container 的機制與 pause container 達到 pod 的設計。
```
In Kubernetes, the pause container serves as the "parent container" for all of the containers in your pod. The pause container has two core responsibilities. First, it serves as the basis of Linux namespace sharing in the pod. And second, with PID (process ID) namespace sharing enabled, it serves as PID 1 for each pod and reaps zombie processes.
```
ref
The Almighty Pause Container - Ian Lewis https://www.ianlewis.org/en/almighty-pause-container
Kubernetes之Pause容器 - 陈健的博客 | ChenJian Blog https://o-my-chenjian.com/2017/10/17/The-Pause-Container-Of-Kubernetes/
學習 Docker Network 之間的差別 | KaiRen's Blog https://kairen.github.io/2016/01/05/container/docker-network/
沒有留言:
張貼留言