天天看点

白话k8s-Pod的组成

k8s

的所有功能都是围绕着

Pod

进行展开的,我们经常会看到类似这样一张图

白话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

个你自定义的容器组成的

白话k8s-Pod的组成

也就是如下图所示这样

白话k8s-Pod的组成

Pod

是如何把这些

container

组成一个的呢?用的是label

查看

container

lable

信息

pause

label

白话k8s-Pod的组成

nginx的

label

白话k8s-Pod的组成

看一下数据, pod.name:"nginx", namespace: "default","pod.uid"都是一样的。

k8s

就是通过这些

label

来组织

Pod

的。

不使用k8s创建一个Pod

kubernets

源码,发现

K8s

在启动一个

Pod

的时候,是先启动一个

sandbox

的容器,然后才再启动用户自定义的容器。

defaultSandboxImage = "k8s.gcr.io/pause:3.2"
           
白话k8s-Pod的组成

这个

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

作者:李鹏

出处:http://www.cnblogs.com/li-peng/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。