1. 程式人生 > >白話k8s-Pod的組成

白話k8s-Pod的組成

`k8s`的所有功能都是圍繞著`Pod`進行展開的,我們經常會看到類似這樣一張圖 ![](https://img2020.cnblogs.com/blog/342595/202010/342595-20201020115352703-1856615837.png) 告訴我們,`Pod`是一組`container`的集合,`container`之間可以通過`localhost:port`的方式直接訪問。 感覺很神奇,明明是不同的`container`怎麼做到共用一個`IP`的,在隨便一個容器內通過`localhost`訪問就能訪問其他容器的服務,通過例子和閱讀原始碼找到了原因: 建立一個簡單的`Pod` ``` apiVersion: v1 kind: Pod metadata: name: nginx labels: app: hello-world spec: containers: - name: nginx image: nginx ports: - containerPort: 80 ``` create ``` kubectl create -f pod1.yaml ``` 檢視 pod 資訊 ``` $ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 69s 10.244.1.3 node01 ``` 在節點上`docker ps`一下,你會發現,一個`Pod`的組成:是由一個`pause`的容器和`n`個你自定義的容器組成的 ![](https://img2020.cnblogs.com/blog/342595/202010/342595-20201020115417278-1626283267.png) 也就是如下圖所示這樣 ![](https://img2020.cnblogs.com/blog/342595/202010/342595-20201020115431612-1843098493.png) 那`Pod`是如何把這些`container`組成一個的呢?用的是label 檢視`container`的`lable`資訊 `pause`的`label` ![](https://img2020.cnblogs.com/blog/342595/202010/342595-20201020115450484-1608626497.png) nginx的`label` ![](https://img2020.cnblogs.com/blog/342595/202010/342595-20201020115509590-1589105591.png) 看一下資料, pod.name:"nginx", namespace: "default","pod.uid"都是一樣的。`k8s`就是通過這些`label`來組織`Pod`的。 ## 不使用k8s建立一個Pod 檢視`kubernets`原始碼,發現`K8s`在啟動一個`Pod`的時候,是先啟動一個`sandbox`的容器,然後才再啟動使用者自定義的容器。 ``` defaultSandboxImage = "k8s.gcr.io/pause:3.2" ``` ![](https://img2020.cnblogs.com/blog/342595/202010/342595-20201020115632846-1131074940.png) 這個`sandbox`啟動的時候會以`--ipc="shareable"`共享`namespace`方式啟動 ``` “shareable” Own private IPC namespace, with a possibility to share it with other containers. ``` 也就是說,一個`Pod`裡所有的容器共享 `pause`容器的資源,比如namesapce,network,uts... 我們可以做一個試驗不使用`k8s`,直接使用`docker`來建立一個自己的`Pod` 先啟動一個`pause`,分配一個埠 ``` docker run -d --name pause --ipc="shareable" -p 9080:8080 k8s.gcr.io/pause:3.1 ``` 再啟動一個`echoserver`,會啟動一個`http`服務,監聽`8080`埠。 共享的`pause`的各種資源 ``` docker run -d --name echoserver --net=container:pause --ipc=container:pause --pid=container:pause googlecontainer/echoserver:1.9 ``` 我們請求`pause`容器。 ``` $ curl http://127.0.0.1:9080 -d "hello" Hostname: d6c76d2b87e5 Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=172.17.0.1 method=POST real path=/ query= request_version=1.1 request_scheme=http request_uri=http://127.0.0.1:8080/ Request Headers: accept=*/* content-length=5 content-type=application/x-www-form-urlencoded host=127.0.0.1:9080 user-agent=curl/7.61.1 Request Body: hello ``` 這兩個容器就組成了一個簡單的`