k8s
的所有功能都是围绕着
Pod
进行展开的,我们经常会看到类似这样一张图
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNzgTNxYjN1gTMtMDM3ITNzUTMxAjMwEDMyAjMtUTO1IDNz8CXwEDMyAjMvwVN5UjM0MzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.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 <none> <none>
在节点上
docker ps
一下,你会发现,一个
Pod
的组成:是由一个
pause
的容器和
n
个你自定义的容器组成的
也就是如下图所示这样
那
Pod
是如何把这些
container
组成一个的呢?用的是label
查看
container
的
lable
信息
pause
label
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
。
作者:李鹏
出处:http://www.cnblogs.com/li-peng/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。