Pod概念及网络通讯方式

什么是Pod?

Pod是Kubernetes的最小单元。

一个Pod是一组紧密相关的容器,是一起运行在同一个工作节点上,以及同一个Linux命名空间中。每个Pod就像是一个独立的逻辑机器,拥有自己的IP、主机名、进程等,运行一个独立的应用程序。

Pod是逻辑主机,一个Pod中的所有的容器都运行在同一个逻辑机器上,其他Pod中的容器,即使运行在用一个工作节点上,也会出现在不同的节点上。即一个Pod包含多个容器时,那些容器总是运行在同一个工作节点上,一个Pod决不能跨多个工作节点

例如:

Pod和容器概念的区分

为什么k8s会使用Pod为最小单元,而不是Docker容器

1、更利于扩展

k8s不仅仅支持Docker容器,也支持rkt甚至用户自定义容器。Kubernetes不依赖于底层某一种具体的规则去实现容器技术,而是通过CRI这个抽象层操作容器,这样就会需要Pod这样一个东西,Pod内部再管理多个业务上紧密相关的用户业务容器,就会更有利用业务扩展Pod而不是容器。

2、更容易定义一组容器的状态

如果没有Pod,我们直接使用一组容器去跑一个业务,那么其中一个或若干个容器出现问题,我们如何去定义这一组容器的状态呢?通过Pod我们就很容易解决,一组业务容器跑在同一个Pod中,这个Pod会有一个pause容器,这个容器跟其他的业务容器都没有关系,以这个pause容器状态来代表Pod的状态。

3、利用容器间文件共享,以及通信

pause容器有一个IP地址和一个存储卷,Pod中的其他容器共享pause容器的IP地址和存储,这样就达到了文件共享和通信。

Pod与容器的区别:Pod是指一组容器,可以指多个或一个,容器只能代表一个。

Pod的类型

自主式Pod:指定调度到某节点,如节点down,Pod无法自动恢复

控制器管理的Pod:诸多控制器类型,看下边详解

控制器类型及作用

1、ReplicationController

用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来代替;而如果异常多出来的容易也会自动回收。在新版本的k8s中建议使用ReplicaSet来代替它

2、ReplicaSet

其跟ReplicationController没有什么本质区别,只是名字不一样,并且ReplicaSet支持集合式的selector(支持根据条件批量删除或创建)

3、Deployment(推荐)

虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update滚动更新但Deployment支持)

典型的应用场景包括:

  定义Deployment来创建Pod和ReplicaSet

  滚动升级和回滚应用

  扩容和缩容

  暂停和继续Deployment

   滚动更新流程

4、HPA(HorizontalPodAutoScale)

Horizontal Pod AutoScaling 仅适用于Depolyment和ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩缩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容

5、StatefullSet

StatefullSet是为了解决有状态服务的问题(对应Depolyment和ReplicaSets是为无状态服务而设计),其应用场景包括:

  稳定的持久化储存,即Pod重新调度后还能访问到相同的持久化数据,基于PVC来实现

  稳定的网络标志,即Pod重新调度其PodName和HostName不变,基于Headless Service(即没有Cluster IP 的 Service)来实现

  有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候还要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有的Pod必须都是Running和Ready状态),基于init containers来实现

  有序收缩,有序删除(从N-1到0)

6、DaemonSet

DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为它们新增一个Pod。当有Node从集群中移除时,这些Pod也会被回收。删除DaemonSet会删除它创建的所有Pod

典型用法:

  运行集群存储daemon,例如在每个Node上运行glusterd、ceph

  在每个Node上运行日志收集daemon,例如Logstash、Fluentd

  在每个Node上运行监控daemon,例如Prometheus Node Exporter

7、Job、Cron Job(类似于Linux的at和crontab)

Job负责批处理任务,即仅执行一次任务,它保证批处理任务的一个或多个Pod成功结束

Cron Job管理基于时间的Job,即

  在给定时间点仅运行一次

  周期性的给定时间点运行

不同情况下网络通信方式

1、同一个Pod内部通讯:

>> 同一个Pod共享同一个网络命名空间(pause容器),同一个Linux协议栈

2、Pod1至Pod2

>> Pod1与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同的Node之间的通信只能通过宿主机的物理网卡进行,将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问,使用的是Flannel网络规划服务如下图:

etcd在Flannel中的作用:

存储管理Flannel可分配的IP地址段资源

监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由器

>> Pod1与Pod2在同一台机器中,由docker0网桥直接转发请求至Pod2

3、Pod至Service的网络

>> 目前基于性能考虑,全部用iptables(旧版本)和LVS(新版本)维护和转发

4、Pod到外网

>> Pod向外网发送请求,查找路由表,转发数据包到宿主机网卡,宿主机网卡完成路由选择后,iptables执行Masquerade(SNAT),把源地址更改为宿主机网卡地址,向外网发送请求

5、外网访问Pod

>> 通过Service网络,nodeport 类型

Kubernetes-2:Pod(k8s最小单元)概念及网络通讯方式的更多相关文章

  1. 为什么Kubernetes使用Pod作为最小调度单元

    一.Pod说明 Pod只是一个逻辑概念,一个原子调度单位,其优势在于 可以统一调度一组容器到指定的node上 共享资源,Pod的容器可以使用localhost进行通信,使用volume进行文件共享.使 ...

  2. Kubernetes之Pod使用

    一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...

  3. k8s系列---基于canal的网络策略

    文章拷自:http://blog.itpub.net/28916011/viewspace-2215383/ 加上自己遇到的问题简单记录 安装文档:https://docs.projectcalico ...

  4. Kubernetes(K8s)基础概念 —— 凿壁偷光

    Kubernetes(K8s)基础概念  --  凿壁偷光 K8s是什么:全称 kubernetes  (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...

  5. Kubernetes — 深入解析Pod对象:基本概念(一)

    在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 A ...

  6. Kubernetes — 深入解析Pod对象:基本概念(二)

    作为 Kubernetes 项目里最核心的编排对象,Pod 携带的信息非常丰富.其中,资源定义(比如 CPU.内存等),以及调度相关的字段.在本篇,我们就先从一种特殊的 Volume 开始,来帮助你更 ...

  7. 5分钟让你理解K8S必备架构概念,以及网络模型(上)

    写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...

  8. Kubernetes核心技术Pod

    Kubernetes核心技术Pod Pod概述 Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象 ...

  9. Kubernetes基石-pod容器

    引用三个问题来叙述Kubernetes的pod容器 1.为什么不直接在一个Docker容器中运行所有的应用进程. 2.为什么pod这种容器中要同时运行多个Docker容器(可以只有一个) 3.为什么k ...

  10. kubernetes concepts -- Pod Overview

    This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...

随机推荐

  1. 记一次debian无法启动的解决经历

    前言 有几台debian物理机突然无法开机了,断电重启后,一直卡在下面这个界面 参考了博客[linux]解决系统卡在ubuntu loading initial ramdisk 发现无法修复 在rec ...

  2. dubbo面试题及答案

    Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目. 面试官问你如果这个都不清楚,那下面的就没必要问了. 官网:ht ...

  3. Linux常用指令及shell脚本记录

    记录一些常用指令在博客上,以防哪天因太久不敲而忘却,还可以直接翻看博客记录,不用再一条条百度搜...... 一.Linux常用指令 一.设置文件权限为aapp用户及用户组-- chown -R app ...

  4. 推荐一枚宝藏Up主,顺便聊聊感想

    众所周知,B站是学习网站 最近发现一宝藏Up主,主要做科普,主题包括但不限于:大模型的底层算法.量子计算底层原理和硬件设计,以及其他物理或者自然科学主题,总体偏向于理工科. 值得推荐的理由:Up主对底 ...

  5. webpack4.15.1 学习笔记(三) — 模块热替换HMR

    目录 模块热替换 HMR HMR监听文件变化 HMR 修改样式表 模块热替换 HMR 允许在运行时更新各种模块,而无需进行完全刷新.不适用于生产环境,意味着应当只在开发环境使用.启用HMR实际上就是更 ...

  6. oeasy教您玩转vim - 69 - # 折叠folding入门

    ​ 折叠入门 回忆上次 上次学习了一种新的容器 tabs选项卡 tabs选项卡 包含多个选项卡tab 可以列两个tab 一个编写文件 一个执行指令 互不影响 每个 tab选项卡 还可以对应多个wind ...

  7. 仓颉编程语言技术指南:嵌套函数、Lambda 表达式、闭包

    本文分享自华为云社区<[华为鸿蒙开发技术]仓颉编程语言技术指南[嵌套函数.Lambda 表达式.闭包]>,作者:柠檬味拥抱. 仓颉编程语言(Cangjie)是一种面向全场景应用开发的通用编 ...

  8. Jmeter函数助手39-isPropDefined

    isPropDefined函数用于判断属性是否存在. 变量的名称:填入属性名.如果属性名存在返回true,如果不存在返回false 1.jmeter的属性查看路径:测试计划右键"添加&quo ...

  9. 【Java】Springboot + Redis +(AOP & 响应外切)切面实现字典翻译

    使用案例演示: 先开发了一个简单的Demo: 普通DTO类注解翻译的字段和翻译来源 在需要翻译的方法上注解@Translate 接口返回结果: 框架思路: 1.标记的注解需要通过AOP切面在调用的时候 ...

  10. 【ActiveJdbc】03

    一.查询API 简单条件筛选: List<Person> list = Person.where("name = 'John'") 动态参数条件: List<Pe ...