白话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
个你自定义的容器组成的
也就是如下图所示这样
那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
。
- 简单分析oracle的数据存储(r2笔记89天)
- 机器学习线性分类算法:感知器原理
- 通过shell脚本来查看Undo中资源消耗高的sql(r2笔记88天)
- 关于分页查询的优化思路(r3笔记第7天)
- 用机器学习方法对影评与观影者情感判定
- 关于查看文件的几个小命令(r3笔记第6天)
- 关于纠结的recycle pool的设置(r3笔记第5天)
- 融会贯通学习trigger(r2笔记第4天)
- 完整的R语言预测建模实例-从数据清理到建模预测
- 利用回归模型预测数值型数据(代码)
- 关于ORA-00020问题的反思(r2笔记第3天)
- 查看空间使用情况的脚本(r2笔记第2天)
- 使用dbms_parallel_execute来完成DML的并行(r3笔记第1天)
- 有趣的linux命令总结(78天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 进度条自动前进效果的实现代码
- Android 系统服务TelecomService启动过程原理分析
- Android圆角头像工具类详解
- Android实现系统消息推送
- Android仿微信QQ聊天顶起输入法不顶起标题栏的问题
- Android实现倒计时的按钮效果
- 腾讯位置服务实现轨迹回放
- 有一种遗憾,是跑程序却没用上_______
- Android使用注解代替枚举节省系统内存开销的方法
- Android实现自定义验证码输入框效果(实例代码)
- flutter 实现多布局列表的示例代码
- flutter TextField换行自适应的实现
- 如何造个android Flow流式响应的轮子
- Flutter混合开发详解
- Android 单双击实现的方法步骤