白話k8s-Pod的組成

peng發表於2020-10-20

k8s的所有功能都是圍繞著Pod進行展開的,我們經常會看到類似這樣一張圖

告訴我們,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   <none>           <none>

在節點上docker ps一下,你會發現,一個Pod的組成:是由一個pause的容器和n個你自定義的容器組成的

也就是如下圖所示這樣

Pod是如何把這些container組成一個的呢?用的是label
檢視containerlable資訊
pauselabel

nginx的label

看一下資料, pod.name:"nginx", namespace: "default","pod.uid"都是一樣的。k8s就是通過這些label來組織Pod的。

不使用k8s建立一個Pod

檢視kubernets原始碼,發現K8s在啟動一個Pod的時候,是先啟動一個sandbox的容器,然後才再啟動使用者自定義的容器。

defaultSandboxImage = "k8s.gcr.io/pause:3.2"

這個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

這兩個容器就組成了一個簡單的pod

相關文章