一、Pod 控制器类型

Pod概念

当一个 Pod 创建后,Pause 容器就会随着 Pod 启动,只要是有 Pod,Pause 容器就要被启动。
在同一个 Pod 里面的容器不能出现端口冲突,否则这个 Pod 可能会出现无法启动、无限重启。
一个 Pod 里面的容器数量是大于等于1。
Pod 里面的容器都是共享 Pause 的网络栈,在同一个 Pod 里即共享网络又共享存储卷。

RC和RS概念

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

在 K8s 新版本中,官方不再使用RC(Replication Controler),建议使用 RS(ReplicaSet)代替,因为RS支持集合式的 selector。

ReplicaSet 跟 Replication Controller 没有本质区别,只是名字不一样,并且 ReplicaSet 支持集合式的 selector。

支持集合式的 selector 作用:

在创建 Pod 的时候会为它打上标签(tag),也会为 Pod 里面的容器打上标签,当需要删除容器或者进行其他操作的时候,可以通过标签来进行相关操作。

Deployment原理:

RS 不支持滚动更新,但是 Deployment 支持滚动更新,RS 和 Deployment 建议一起使用的原因是 Deployment 不负责 Pod 创建,Deployment 需要创建 RS 来达到创建 Pod 的能力。

Deployment 结合 RS 使用,滚动更新:

Deployment 创建出来之后,它会去创建一个 RS,Deployment 再去负责创建对应 Pod;

当某一天需要版本更新,Deployment 会去新建一个RS-2版本,在RS-2下启动v2版本的第一个容器,则退出v1版本的第一个容器,以此类推...到达滚动更新状态。

回滚:

回滚的机制是因为 Deployment 在滚动更新之后,RS-1并没有删除,而是被停用状态,当执行回滚的时候,Deployment 就好启动旧版本的RS-1,到达一个回滚效果。

StatefulSet概念

StatefulSet 是为了解决有状态服务的问题,有状态服务分为 MySQL、MongoDB 等,无状态服务分为 Nginx、Apache 等。

应用场景包括:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现;
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service 来实现;
  • 有序部署,有序扩展;
  • 有序收缩,有序删除。

DaemonSet概念

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

使用 DaemonSet 的一些典型用法:

  • 运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。
  • 在每个 Node 上运行日志收集 daemon,例如fluentd、logstash。
  • 在每个 Node 上运行监控 daemon,例如Prometheus Node Exporter。

Job

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

Job 如果判断这个脚本不是正常退出,则重新执行一遍,直到正常退出为止,并且还可以设置正常退出次数,比如正常退出次数两次,才允许这个脚本执行成功。

二、服务发现

service概念

如果 Pod 之间没有相干性,是无法通过一个 Service 代理或者收集的。

Service收集的机制:

第一、比如是通一个 RC、RS、Deployment 创建的 Pod;

第二、或者拥有同一组标签,Service 通过标签来收集 Pod。

三、网络通信方式

同一个 Pod 内部通信

同一个 Pod 共享同一个网络命名空间,共享同一个Linux协议栈,使用回环网卡(lo)通信。

两个不同 Pod 之间访问

Pod1 与 Pod2 不在同一台主机的情况:

Pod 的地址是与 docker0 在同一个网段的,但是 docker0 网段与宿主机网卡是两个完全不同的IP网段,并且不同 Node 之间的通信只能通过宿主机的物理网卡进行。

将 Pod 的 IP 和所在 Node 的IP关联起来,通过这个关联让 Pod 可以互相访问。

假设 Web APP2 需要访问 Backend:

源地址写自己的(10.1.15.2/24),目标地址写(10.1.20.3/24);

由于目标地址不是跟 Web app2 同一网段,所以发送数据包到网关(Docker0);

Docker0网关发送到 Flannel0,Flannel0 有一个路由表存储在 Etcd 中,根据路由表来进行转发;

Flannel0 将数据包转发到 Flanneld,因为 Flannel0 是 Flanneld 中的一个网桥;

到 Flanneld 之后,它会对该数据报文进行二次封装,请看上图右边数据封装结构;

此时数据包到了66.12这台机器上:

Flanneld 收到数据包后,解封数据包之后转发到 Flannel0 网桥中;

Flannel0 转发到 Docker0,Docker0 根据目标IP地址转发到 Backend 容器中;

因为 Docker0 只能看到第二层源IP地址和目标IP地址,第一层源IP地址和目标IP地址已经被砍掉了。

Pod1 与 Pod2 在同一台主机情况:

由 docker0 网桥直接转发请求到 Pod2,不需要经过 Flannel。

组件通讯示意图

节点网络:真实网络,就是节点主机的物理网卡;

Pod 网络:虚拟网络,所有的 Pod 之间通信都是通过该网络;

Service 网络:虚拟网络,通过 Service 网络访问后端Pod。

以上有不恰当或者讲得不对的地方,希望各位留言指正,谢谢!

站在巨人的肩膀上!

【一】kubernetes学习笔记-Pod概念的更多相关文章

  1. 【三】Kubernetes学习笔记-Pod 生命周期与 Init C 介绍

    一.容器生命周期 Init C(初始化容器)只是用于 Pod 初始化的,不会一直随着 Pod 生命周期存在,Init C 在初始化完成之后就会死亡. 一个 Pod 可以有多个 Init C,也可以不需 ...

  2. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  3. Kubernetes学习笔记(八):Deployment--声明式的升级应用

    概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...

  4. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  5. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  6. jQuery学习笔记之概念(1)

    jQuery学习笔记之概念(1) ----------------------学习目录-------------------- 1.概念 2.特点 3.选择器 4.DOM操作 5.事件 6.jQuer ...

  7. Kubernetes学习笔记(四):服务

    服务介绍 服务是一种为一组相同功能的pod提供单一不变接入点的资源.当服务存在时,他的IP和端口不会改变.客户端通过IP和端口建立连接,这些连接会被路由到任何一个pod上.如此,客户端不需要知道每个单 ...

  8. Kubernetes学习笔记_尚硅谷

    https://www.bilibili.com/video/BV1w4411y7Go?p=1 一.K8s介绍 k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部 ...

  9. tensorflow学习笔记——常见概念的整理

    TensorFlow的名字中已经说明了它最重要的两个概念——Tensor和Flow.Tensor就是张量,张量这个概念在数学或者物理学中可以有不同的解释,但是这里我们不强调它本身的含义.在Tensor ...

随机推荐

  1. linux软件deb打包及开机管理员自启动

    环境:Ubuntu 18.04/16.04  Qt:5.12.6 一 deb打包 1.建立目录结构 2.目录内容 1) 子目录DC520: Get以上内容步骤: (1)   创建目录DC520(自己软 ...

  2. ch1_6_7求解数字排序问题

    import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Sca ...

  3. Android学习之Broadcast初体验

    •何为 Broadcast ? Broadcast 直译广播,接下来举个形象的例子来理解下 Broadcast: 上学的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如,开学要去搬书, ...

  4. 「HTML+CSS」--自定义加载动画【008】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  5. 【SqlServer】管理全文索引(FULL TEXT INDEX)

    Sql Server中的全文索引(下面统一使用FULLTEXT INDEX来表示全文索引),是一种特定语言搜索索引功能.它和LIKE的不一样,LIKE主要是根据搜索模板搜索数据,它的效率比FULLTE ...

  6. 日志文件删除shell脚本

    大日志文件切割shell脚本 #!/bin/bash # --------------------------------------------------------------------- # ...

  7. 学一手,知乎大V(轮子哥)当年靠它进微软亚洲研究院

    前言 vczh本名陈梓瀚,不过大家更愿意叫他「轮子哥」,毕业于华南理工大学软件学院.vczh大学时代就在微软实习,毕业后即加入微软.开始时是在微软上海,后来进入北京的微软亚洲研究院.现已移居美国西雅图 ...

  8. 13个精选的React JS框架

    如果你正在使用 React.js 或 React Native 创建用户界面,可以试一试本文推荐的这些框架. React.js 和 React Native 是流行的用户界面(UI)开发平台,且都是开 ...

  9. 02_利用numpy解决线性回归问题

    02_利用numpy解决线性回归问题 目录 一.引言 二.线性回归简单介绍 2.1 线性回归三要素 2.2 损失函数 2.3 梯度下降 三.解决线性回归问题的五个步骤 四.利用Numpy实战解决线性回 ...

  10. git版本控制之三

    [删除文件]使用关键字 git rm '待删除的文件名或者文件夹名字'  这个默认会把本地和版本库里面的这个文件都删掉!!! 有一种情形就是我往版本库里面提交错了文件,我想从版本库里面移除,但是我本地 ...