2018年7月5日 星期四

[Kubernetes][k8s] Kubernetes 中的 pause 的作用與目的 pod 的實作與構成

[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 。

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/

沒有留言:

張貼留言