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

查看containerlable信息

pauselabel

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的组成的更多相关文章

  1. k8s pod的4种网络模式最佳实战(externalIPs )

    [k8s]k8s pod的4种网络模式最佳实战(externalIPs )       hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...

  2. k8s pod节点调度及k8s资源优化

    一.k8s pod 在节点间调度控制 k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建.当需要在指定pod运行在某个节点上时,可以通过以下几种方式: ...

  3. kubectl cp 从k8s pod 中 拷贝 文件到本地

    请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...

  4. k8s Pod的自动水平伸缩(HPA)

    我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...

  5. k8s pod访问不通外网问题排查

    环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...

  6. 2.k8s.Pod生命周期,健康检查

    #Pod生命周期,健康检查 pod创建过程 Init容器 就绪探测 存活探测 生命周期钩子 #Pod创建过程 master节点:kubectl -> kube-api -> kubenle ...

  7. k8s pod,pvc,pv无法删除问题

    注意步骤: 一般删除步骤为:先删pod再删pvc最后删pv 但是遇到pv始终处于“Terminating”状态,而且delete不掉 pod一直删不掉 [root@hadoop01 nacos-k8s ...

  8. k8s pod时区更改

    一.问题所在 在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0.例如中国客户在UTC8.如果不把容器的时区和主机主机设置为一致,则在查找日志等时候将 ...

  9. 深入掌握K8S Pod

    k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个"根容器"和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的 ...

  10. 混沌工程之ChaosToolkit使用之一删除K8s POD

    今天我们来玩一下混沌工程的开源工具chaostoolkit . 它的目标是提供一个免费,开放,社区驱动的工具集以及api. 官方源码链接:https://github.com/chaostoolkit ...

随机推荐

  1. PHP之道(PHP The Right Way)

    原文地址:http://laravel-china.github.io/php-the-right-way/

  2. USB URB的status及其代表的意义

    USB URB的status及其代表的意义 平时在处理客户问题时,经常需要分析出现问题时抓取的usbmon log,这个log中有一个字段非常重要:URB Status word,这个字段就是stru ...

  3. js监听事件的绑定与移除

    监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...

  4. es创建普通索引以及各种查询

    创建索引 创建普通索引: PUT /my_index { "settings": { "index": { "number_of_shards&quo ...

  5. Kubernetes中的Helm和修改证书有效时间(八)

    一.Helm的介绍 1,概念 Helm 把 k8s 资源(比如 deployments.services 或 ingress 等)打包到一个 chart 中,而 chart 被保存到 chart 仓库 ...

  6. dubbo学习(三)配置dubbo API方式配置

    provider(生产者) import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.Pro ...

  7. RESTful API 编写规范

    RESTful API 编写规范 在一个RESTful系统里,客户端向服务端发起索取资源的操作只能通过HTTP协议语义来进行交互.最常用的HTTP协议语义有以下5个: GET GET:发送一条或者多条 ...

  8. springboot项目根据不同的环境启动不同的配置,如开发环境dev,测试环境sit,生产环境application

    在项目开发中,会有多个环境,如在开发环境开发完,然后在测试环境测试,最后到生产环境,每个环境的配置是不一样的,如数据库配置:还好spring提供了一个管理配置的方式:

  9. 卧槽!最新编程语言排名,Java 沦为老二。。

    2020 年 9 月刚过去,栈长看了下最新的 tiobe 编程语言榜,牛逼啊,C 语言居然登顶了,Java 下降 3 个点,沦为老二的位置. 数据来源TIOBE: https://www.tiobe. ...

  10. Python中matplotlib.pyplot.imshow画灰度图的多种方法

    转载:https://www.jianshu.com/p/8f96318a153f matplotlib库的教程和使用方法此处就不累赘了,网上有十分多优秀的教程资源.此处直接上代码: def demo ...