前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >白话k8s-Pod的组成

白话k8s-Pod的组成

作者头像
lpxxn
发布2020-10-28 10:26:45
8660
发布2020-10-28 10:26:45
举报
文章被收录于专栏:技术之路

k8s的所有功能都是围绕着Pod进行展开的,我们经常会看到类似这样一张图

告诉我们,Pod是一组container的集合,container之间可以通过localhost:port的方式直接访问。 感觉很神奇,明明是不同的container怎么做到共用一个IP的,在随便一个容器内通过localhost访问就能访问其他容器的服务,通过例子和阅读源码找到了原因:

创建一个简单的Pod

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: hello-world
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
      - containerPort: 80

create

代码语言:javascript
复制
kubectl create -f pod1.yaml

查看 pod 信息

代码语言:javascript
复制
$ 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的容器,然后才再启动用户自定义的容器。

代码语言:javascript
复制
defaultSandboxImage = "k8s.gcr.io/pause:3.2"

这个sandbox启动的时候会以--ipc="shareable"共享namespace方式启动

代码语言:javascript
复制
“shareable”	Own private IPC namespace, with a possibility to share it with other containers.

也就是说,一个Pod里所有的容器共享 pause容器的资源,比如namesapce,network,uts... 我们可以做一个试验不使用k8s,直接使用docker来创建一个自己的Pod 先启动一个pause,分配一个端口

代码语言:javascript
复制
docker run -d --name pause --ipc="shareable" -p 9080:8080 k8s.gcr.io/pause:3.1

再启动一个echoserver,会启动一个http服务,监听8080端口。 共享的pause的各种资源

代码语言:javascript
复制
docker run -d --name echoserver --net=container:pause --ipc=container:pause --pid=container:pause googlecontainer/echoserver:1.9

我们请求pause容器。

代码语言:javascript
复制
$ 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不使用k8s创建一个Pod
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档