白話k8s-Pod的組成
阿新 • • 發佈:2020-10-20
`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
```
這兩個容器就組成了一個簡單的`