白话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。
白话k8s-Pod的组成的更多相关文章
- k8s pod的4种网络模式最佳实战(externalIPs )
[k8s]k8s pod的4种网络模式最佳实战(externalIPs ) hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...
- k8s pod节点调度及k8s资源优化
一.k8s pod 在节点间调度控制 k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建.当需要在指定pod运行在某个节点上时,可以通过以下几种方式: ...
- kubectl cp 从k8s pod 中 拷贝 文件到本地
请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...
- k8s Pod的自动水平伸缩(HPA)
我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...
- k8s pod访问不通外网问题排查
环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...
- 2.k8s.Pod生命周期,健康检查
#Pod生命周期,健康检查 pod创建过程 Init容器 就绪探测 存活探测 生命周期钩子 #Pod创建过程 master节点:kubectl -> kube-api -> kubenle ...
- k8s pod,pvc,pv无法删除问题
注意步骤: 一般删除步骤为:先删pod再删pvc最后删pv 但是遇到pv始终处于“Terminating”状态,而且delete不掉 pod一直删不掉 [root@hadoop01 nacos-k8s ...
- k8s pod时区更改
一.问题所在 在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0.例如中国客户在UTC8.如果不把容器的时区和主机主机设置为一致,则在查找日志等时候将 ...
- 深入掌握K8S Pod
k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个"根容器"和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的 ...
- 混沌工程之ChaosToolkit使用之一删除K8s POD
今天我们来玩一下混沌工程的开源工具chaostoolkit . 它的目标是提供一个免费,开放,社区驱动的工具集以及api. 官方源码链接:https://github.com/chaostoolkit ...
随机推荐
- 漏桶、令牌桶限流的Go语言实现
限流 限流又称为流量控制(流控),通常是指限制到达系统的并发请求数. 我们生活中也会经常遇到限流的场景,比如:某景区限制每日进入景区的游客数量为8万人:沙河地铁站早高峰通过站外排队逐一放行的方式限制同 ...
- Python3 学习笔记之 数据类型
- Windows上使用jekyll+github搭建免费博客
jekyll+github搭建个人博客 (一)下载Ruby (二)安装jekyll (三)开启jekyll服务器 (四)使用github展示博客 一.下载Ruby Ruby,一种简单快捷的面向对象(面 ...
- MySQL: 2、SQL语言
一.SQL的简介: 1.SQL的概念: SQL就是结构化查询语言,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统 2.SQL的作用: - ...
- BUU reverse xxor
下载下来的是个elf文件,因为懒得上Linux,直接往IDA里扔, 切到字符串的那个窗口,发现Congratulation!,应该是程序成功执行的表示, 双击,按'x',回车跟入 找到主函数: 1 _ ...
- Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
Excel相关知识点 (1)名称管理器--Name Manager [CoderBaby]首先需要创建多个名称(包含key及value),作为下拉列表的数据源,后续通过名称引用.可通过菜单:&quo ...
- Lua 协同程序(coroutine)
什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常 ...
- Java date format 时间格式化
import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * DateForma ...
- Arduino 多线程简单代码
转载: 1. https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html 2. https://v.youku.com/v_show/id ...
- const放在函数前后的区别
转载:const放在函数前后的区别 一.const修饰指针 int b = 500; 1.const int * a = & b; 2.int const * a = & b; 3.i ...