基本概念

在 Kubernetes 中。资源从管理粒度上分为三级:容器、Pod、Service。

容器

即 Docker 或者 Rocket 容器(1.0 中仅支持这两种容器)。

容器是最低粒度的资源,可是不能被直接操作。

Pod

Kubernetes 中的基本操作单元(非单个容器)。

Pod 是一组共享了以下资源的(执行在同一节点上的)容器:

  • 进程命名空间
  • 网络命名空间
  • IPC 命名空间(能够 SystemV IPC 或 POSIX 消息队列通信)
  • UTS 命名空间(同一主机名称)

能够将一个 Pod 当作是一个抽象的“虚拟机”。里面执行若干个不同的进程(每一个进程实际上就是一个容器)。

比方某个后端应用是若干处理组件组成,能够作为一个后端 Pod。

一个 Pod,往往带有若干 label。比方 type=prod, app=nginx 之类。而且被 kubelet 汇报到 Endpoints 中记录。

实现上。是先创建一个 gcr.io/google_containers/pause 容器。然后创建同一个 Pod 中的其他容器,共享 pause 容器的命名空间。

Kubernetes 要干的事情是要把这些 Pod 给互相连接起来,是不是联想到了什么了?跟虚拟机网络的基本需求是同样的。

Service

Service 是一类执行同样/相似应用(通过 label 来过滤)的 Pod,组成一个完整的服务。比方一组前端 Pod,形成一个前端 Service。

Service 主要是为了: 解耦直接对 Pod 的訪问(Pod 是动态的,随时可能停止或变化) 提供隐式的负载均衡(能够配置均衡策略到后端真实的 Pod)

訪问事实上是以 Service 为单位的。能够通过 DNS 或者(写入环境变量的) Cluster 地址来解耦掉实际的 Pod 地址。

实现上是通过 Kube-Proxy 进程。

实际上,每一个节点上都会执行一个 Kube-Proxy 进程,负责将到某个 Service 的訪问给代理或者均衡(仅支持 TCP)到详细的 Pod 上去。

详细的,对每个 service 的訪问地址(比方:10.0.0.2:80),Kube-Proxy 都会配置 DNAT 规则(从容器出来的訪问,从本地主机的訪问双方面),将到这个地址的訪问映射到本地的一个随机port。

然后 Kube-Proxy 会监听在本地的相应port,将到这个port的訪问给代理到远端真实的 pod 地址上去。

Replication-Controller

Replication-Controller 主要是为了实现对 Pod 的自己主动化运维管理(类似 Linux/Nodejs 等平台上的 sueprvisor 工具)。

它能够保障集群内某个 Pod 的执行实例的个数。

这样,当某 Pod 出现问题停止时候。能够自己主动启动新的相同类型的 Pod 来避免服务受到影响。一般推荐通过 Replication-Controller 来创建和管理 Pod。

Pod 须要设置 RestartPolicy = Always,同一时候也是默认值。

设计理念

事实上 Docker 默认採用 NAT 的方式已经组成了简单的网络了。

但Kubernetes 觉得 Docker 的默认网络採用了 NAT 方式,跨节点通信就须要进行port映射,这会给服务的訪问带来麻烦。

设计理念包含例如以下几点:

  • 全部容器不使用 NAT 就能够互相通信(这跟 Docker 的默认实现是不同的);
  • 全部节点跟容器之间不使用 NAT 就能够互相通信;
  • 容器自己看到的地址,跟其它人訪问自己使用的地址应该是一样的(事实上还是在说不要有 NAT)。

实现

要满足上面的要求。也不难。最简单的方法,容器网络地址空间跟外部网络的数据空间打通就可以,即容器内网络地址直接暴露到物理网上去。

Kubernetes 的基于 GCE 的实现就是这样的机制,给每一个物理节点直接分配一个内部子网(默认是 /24 的),这样每一个 Pod 就能分到一个地址了(意味着每一个节点最多 256 个 Pod)。

这个地址是直接暴露到物理网络上的。能够直接进行路由。

想让 Pod 訪问外网也非常easy,在通往外部网络的网关上做一把 SNAT 就可以。

扩展

当然。在此基础上还能够进行扩展,比方以下几种方案:

CoreOS 的 Flannel

内部流量出到物理网之前,非本地的流量过一下整个内部网的网关。然后用 UDP/VXLAN 封装下,直接 tunnel 到对端后进行解包。

Weave

Weave 的网络设计也是对承载网这部分进行改进。对这部分流量进行封装,发送到对端的 peer 上。但不清楚封装协议类型。

socketplane

SocketPlane 的思路也是大同小异,在主机之间建 Tunnel,本地网桥默认使用 OpenvSwitch。

不同的主机发现採用 mDNS。

这家被 Docker 给收购了,非常奇怪,背后应该有一些故事。

OpenStack Neutron

事实上,如今的面向虚拟机的网络方案(比方 OpenStack Neutron)早就已经实现了上面的几点。并且使用网络虚拟化的手段。能做到比上面具有更加丰富和灵活的特性。比如,不同物理机上的容器能够拥有随意同样或者不同的子网,并且能够实现多租户的概念。

假设使用 Nova-Docker 来管容器的话,默认採用的就是 Neutron 网络。

结论和展望

网络的设计离不开对需求的深入分析。

从眼下的几个项目来看,大家都是在模仿虚拟机的网络来实现容器的网络,甚至还有不少地方没有达到虚拟机网络的成熟度。

未来至少应该从以下两个方面去考虑设计容器网络:

  • 本地的优化:虚拟机的本地网络经过多年优化已经逼近了线速,但容器网络在这方面还有不少坑,特别对物理设备虚拟化技术的支持等。挖掘性能,减少对主机资源的消耗,仍有一些工作要做;
  • 网络特性的优化:容器网络根本上跟虚拟机网络存在非常大的差异,这体如今容器的生命周期和使用行为上有非常大的不同,传统的网络特性并不能非常好地满足这些需求。

转载请注明:http://blog.csdn.net/yeasy/article/details/46443933


从 Kubernetes 谈容器网络的更多相关文章

  1. [Kubernetes]浅谈容器网络

    Veth Pair 这部分内容主要介绍一个设备: Veth Pair . 作为一个容器,它可以声明直接使用宿主机的网络栈,即:不开启 Network Namespace .在这种情况下,这个容器启动后 ...

  2. Kubernetes & Docker 容器网络终极之战(十四)

    目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...

  3. [Kubernetes]谈谈容器跨主机网络

    继上篇文章:[Kubernetes]浅谈容器网络,自己给自己挖的坑,这篇文章来谈谈容器跨主机网络. 要理解容器"跨主通信"的原理,就要来谈谈 Flannel 这个项目. Flann ...

  4. 开发环境下的 Kubernetes 容器网络演进之路

    马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech 使用 Docker+Kubernetes 来简化开发人员的工作流,使应用更加快速地迭代,缩短发布周期,在很多研发团队中已经是常见的做法. 如果 ...

  5. 【好书分享】容器网络到kubernetes网络

    Nginx 公司的 Michael Hausenblas 发布了一本关于 docker 和 kubernetes 中的容器网络的小册子.这份资料一共 72 页,是大家由浅入深的了解 Docker 和 ...

  6. kubernetes/k8s CNI分析-容器网络接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...

  7. 一文读懂 Kubernetes 容器网络

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 在Kubernetes中要保证容器之间网络互通,网络至关 ...

  8. 容器网络——从CNI到Calico

    从容器诞生开始,存储和网络这两个话题就一直为大家津津乐道.我们今天这个环境下讲网络这个问题,其实是因为容器对网络的需求,和传统物理.虚拟环境对网络环境需求是有差别的,主要面临以下两个问题: 过去Iaa ...

  9. DevOps与Kubernetes 、容器的关系

    近两年,随着容器.Kubernetes 等技术的兴起,DevOps 这个概念被广泛提及并被大量使用. 本文将会从以下几个方面着手,结合实验展现的方式,让读者真正理解 DevOps 的含义. DevOp ...

随机推荐

  1. 泛型? extents super

    ?可以接受任何泛型集合,但是不能编辑集合值.所以一般只在方法参数中用 例子: ? extends Number  则类型只能是Number类的子孙类 ? super String  则类型只能是Str ...

  2. actionscript sendToURL请求url,传递http_referer分浏览器统计

    IE全版本都不传递referer,但会在header中传递X_FLASH_VERSION,例如:"HTTP_X_FLASH_VERSION":"13,0,0,182&qu ...

  3. js定位navigator.geolocation

    一.简介 html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置. window.navigator.geolocation提供了3个方法分 ...

  4. newman安装时遇到问题的解决

    npm安装newman时系统提示需要安装.net framwork环境 通过查询文档安装visual studio express: 于是安装visual studio 2012 express. 安 ...

  5. HDU 5166(缺失数查找输出)

    HDU 5166 Time Limit:1000MS  Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description T ...

  6. Asp.net MVC分页实例

    分页是网页基本功能,这里主要讨论在Asp.net MVC环境下分页的前端实现,不涉及后台分页.实现效果如下图显示: Step 1.建立分页信息类 public class PagingInfo { p ...

  7. BZOJ 3570 动物园

    Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

  8. 【Java】Java6 WebService的发布

    WebService服务发布往往比较混乱,Axis2的发布形式与XFire发布方式差别很大,而Java6 Web服务的发布与Axis2.XFire的Web服务的发布方式也有着天壤之别,它们之间没有经验 ...

  9. eclipse中tomcat内存溢出问题,报PermGen space

    场景 最近在eclipse中的tomcat服务器下放三个不同的应用程序,其中两个应用程序用到了各自的第三方jar包.刚开始时把这三个应用程序分别部署到各自的tomcat服务器运行,没问题.后来想通过第 ...

  10. java学习面向对象之static内存图解

    上一节当中描述了static的用法,以及成员变量和静态变量的区别.但是static除了可以修饰成员变量使之成为静态变量外,他还可以同时修饰函数,使之成为静态函数,我们来看一个例子: class Sta ...