1.docker+k8s简介

2.基于容器的部署

3.KubeEdge详解

4.容器网络:盘点,解释与分析

5.Docker+ Kubernetes已成为云计算的主流(二十六)

6.常见的五种容器管理方法?

windows容器技术_电脑系统容器编排在哪里

容器技术是近几年云行业发展中不可缺少的一环。Docker和k8s的大热极大可能会推动云计算PAAS层的完善和普及。

容器(Container)是一种更轻量级,更灵活的虚拟化处理方式,它将一个应用程序所需的一切打包在一起。

容器包括所有代码,各种依赖甚至操作系统,这让应用程序几乎在任何地方都可以运行。因此它的诞生,解决了一个重要问题:如何确保应用程序从一个环境移动到另一个环境的正确运行。它只是虚拟了操作系统,而不像虚拟机一样去虚拟底层计算机。

Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上(包括流行的Linux机器、windows机器),也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 )。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

定期渗透测试,安全审计;

尽量用image的正规镜像来源,相对于传统安全,容器安全受质疑很大程度上是在于镜像的维护及升级,因此在镜像源头保证安全和及时更新;

及时升级容器服务,比如用rollingupdate的方式对跑服务的容器进行升级等方式。

Docker容器与其他的容器技术都是大致类似的。但是,Docker在一个单一的容器内捆绑了关键的应用程序组件,这也就让这容器可以在不同平台和云计算之间实现便携性。其结果就是,Docker就成为了需要实现跨多个不同环境运行的应用程序的理想容器技术选择。

Docker还可以让使用微服务的应用程序得益,所谓微服务就是把应用程序分解成为专门开发的更小服务。 这些服务使用通用的RESTAPI来进行交互。使用完全封装Docker容器的开发人员可以针对用微服务的应用程序开发出一个更为高效的分发模式。

docker+k8s简介

做开发的基本都听说过沙盒 (Sandbox) 和虚拟机 (Virtual Machine,简称 VM) ,如今容器技术很火,其中以 docker 最受大家欢迎。作为一种集群管理工具,K8s 最近也是火的不要不要的。 我们经常会讲 docker 和 K8s 联系起来,那么两者之间又存在什么关联呢?

首先 Sandbox 和 VM 都是属于 虚拟技术 ,用来虚拟软件运行环境并具有隔离的功能。Sandbox 比较“轻”(只需要虚拟出一个小的环境)且一旦退出就释放之前占用的;VM 则比较重(虚拟出整个操作系统,相当于子电脑)。关于 Sandbox 和 VM 的区别可以参考博客: s://.jianshu/p/6acdfd60b014 。

容器是属于 Sandbox 的一种。 顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。 容器技术的核心功能 ,就是通过 约束和修改进程的动态表现 ,从而为其 创造出一个“边界” 。正是因为这个边界才会让容器里面的程序看不到宿主机上其他的程序从而给程序一种它就是在一个独立的操作系统上的象。容器具有如下几个优点:

Docker 是一种 轻量级的虚拟化 技术,即容器技术。随着 Docker 的开源,docker 凭借其“轻”的特点得到迅速的普及。

这三个优点恰是 VM 的缺点。

Docker 原意是指处理码头集装箱的工人。 首先需要注意的是, Docker 本身不是容器 ,而是一个 开源的应用容器引擎 。Docker 让开发者可以以统一的方式 打包 他们的 应用以及依赖包 到一个 可移植的容器 中,然后 发布 到任何 安装了docker引擎的服务器上 (包括流行的Linux机器、windows机器),也可以实现虚拟化。从这个描述可以看出 Docker 的几种常用任务:

Docker 的两句口号很准确地描述了其功能:

1. Build, ship and run

顾名思义,创建、运输和运行。

举个例子来理解:比如说我在 A 地建好了一个厂区,该厂区主要的是车间,其次还有一些配套的生活设施(比如食堂、超市、宿舍、水电等)。现在我要将厂迁到 B 地,按照常规思路就是把 A 地的车间拆了运到 B 地重新组装、并在 B 地建好配套的生活设施,工程量明显很大。设现在有一种魔法能够在A地将车间及其配套的生活设施 复制一份并打包成一个镜像 image(文件) ,然后将该镜像迁移到 B 地,这样在B地马上就能够投入使用,省去了拆机、重装以及搭建配套生活设施的工作,非常方便快捷。

现在我们将 车间类比成一个lication ,将 配套的生活设施类比成依赖 ,那么 docker 就是这种魔法 。

2. Build once, run anywhere

顾名思义,一次创建、随地运行。

我们知道 车间是用于工业生产的 ,即一个lication。在这个世界,还存在很多其他的lication,比如学校、医院、写字楼、商场、体育场等,它们各自负责不同的用途。设这些 lication 都是能够共享的,那么这个效率将会很高,比如国家A需要用到体育馆,可以从国家B复制一个过来;国家B需要用到学校,可以从国家A复制一个过来。Docker 使用的就是这种理念,Docker 中包含三个核心部分:

镜像仓库(Repository)可以是私有的(比如本地机器的 Docker repository),也可以是公有的(比如 Docker 官方提供的Docker Hub、第三方的 Hub)。 负责管理镜像仓库(Repository)的是 Docker Registry 服务 (就像是图书馆管理员)。Docker 官方提供的 Docker Hub 对于镜像来源有着严格的把控,有很多高质量的 lication 镜像,也是开发人员用的最多的public registry 服务。

那么为什么需要 Kubernetes 呢?就在 Docker 容器技术被炒得热火朝天之时,大家发现,如果想要将 Docker 应用于具体的业务实现(当 容器和服务器的数量达到一定规模 的时候,就会碰到管理的

问题,即 如何有效管理大量的服务器和容器 ,保证 应用的稳定运行、方便升级和故障的快速解决 ),是存在困难的—— 编排、管理和调度等各个方面都不容易 。于是就迫切 需要一套容器编排工具 ,能够对 Docker 和容器进行 更高级、灵活的管理 。容器编排工具提供图形化界面或者命令行来管理容器和服务器集群,提供容器配置、任务发布、服务发现、负载均衡、系统监控和故障恢复、声明式系统配置以及有关容器部署和性能的规则和约束定义机制等。

就在这个时候, Google开发的 Kubernetes 从众多编排工具中脱颖而出 ,赢下了容器编排工具大战。Kubernetes 是一种 基于容器的集群管理平台 。Kubernetes 是希腊语,意为“舵手、领航员”,大家都习惯将 Kubernetes 简称为K8s(ubernete 包含8个字母)。K8s 最初由 Google 创建而后加入 openstack 基金会并发布了 K8s V1.0。

Docker 公司自己有一款名为 Docker Swarm的产品,它是一个容器集群和调度工具,功能类似于Kubernetes。相比 Kubernetes,Swarm在集群搭建和使用上要相对简单一些,学习和部署成本相对低一些。较新版本的Docker已经集成了Swarm。Swarm支持跨多个主机进行编排,管理较小规模的容器集群也绰绰有余,对于初学者也可以很快的部署和运行。

笔者水平有限,如有错误,敬请指正!

参考:

s://.cnblogs/misswangxing/p/10669444.html

s://blog.csdn.net/fly910905/article/details/98962455

基于容器的部署

容器是镜像的可运行实例。容器是您机器上的沙盒进程,与主机上的所有其他进程隔离。总而言之,一个容器:

运行容器时,它使用隔离的文件系统。此自定义文件系统由 容器映像 提供。由于镜像包含容器的文件系统,它必须包含运行应用程序所需的一切——所有依赖项、配置、脚本、二进制文件等。镜像还包含容器的其他配置,例如环境变量、运行的默认命令、和其他元数据。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器镜像中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 ),更重要的是容器性能开销极低。

如果说以 Docker 为代表的容器引擎将软件的发布流程从分发二进制安装包转变为直接分发虚拟化后的整个运行环境,令应用得以实现跨机器的绿色部署;那以 Kubernetes 为代表的容器编排框架,就是把大型软件系统运行所依赖的集群环境也进行了虚拟化,令集群得以实现跨数据中心的绿色部署,并能够根据实际情况自动扩缩。

以容器构建系统

自从 Docker 提出“以封装应用为中心”的容器发展理念,成功取代了“以封装系统为中心”的 LXC 以后,一个容器封装一个单进程应用已经成为被广泛认可的最佳实践。然而单体时代过去之后,分布式系统里应用的概念已不再等同于进程,此时的应用需要多个进程共同协作,通过集群的形式对外提供服务,以虚拟化方法实现这个目标的过程就被称为容器编排(Container Orchestration)。

容器之间顺畅地交互通信是协作的核心需求,但容器协作并不仅仅是将容器以高速网络互相连接而已。如何调度容器,如何分配,如何扩缩规模,如何最大限度地接管系统中的非功能特性,让业务系统尽可能免受分布式复杂性的困扰都是容器编排框架必须考虑的问题,只有恰当解决了这一系列问题,云原生应用才有可能获得比传统应用更高的生产力

Docker 设计的 Dockerfile 只允许有一个 ENTRYPOINT,这并非无故添加的人为限制,而是因为 Docker 只能通过监视 PID 为 1 的进程(即由 ENTRYPOINT 启动的进程)的运行状态来判断容器的工作状态是否正常,容器退出执行清理,容器崩溃自动重启等操作都必须先判断状态。设想一下,即使我们使用了 supervisord 之类的进程控制器来解决同时启动 Nginx 和 Filebeat 进程的问题,如果因某种原因它们不停发生崩溃、重启,那 Docker 也无法察觉到,它只能观察到 supervisord 的运行状态,

在想要创建的 Kubernetes 对象对应的 .yaml 文件中,需要配置如下的字段:

也需要提供对象的 spec 字段。对象 spec 的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。 Kubernetes API 参考 能够帮助我们找到任何我们想创建的对象的 spec 格式。

Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。典型的应用场景包括:

“Service” 简写 “svc”。如上文提到的,Pod不能直接提供给外网访问,而是应该使用service。Service就是把Pod暴露出来提供服务,Service才是真正的“服务”,它的中文名就叫“服务”。Service代理Pod集合,对外表现为一个访问入口,访问该入口的请求将经过负载均衡,转发到后端Pod中的容器。

k8s使用service还有一个原因。一般而言,k8s每创建一个新的Pod,它的ip地址都是不一样的,一个Service与特定的一个或者一组Pod挂钩,即使Pod挂掉了,k8s又创建了新的特定的Pod,Service仍然与这个新的Pod挂钩,这样,Pod的ip不一样了,哪怕端口也不一样了,仍然能通过Service来获取Pod所提供的服务。

Service是如何保持这种与特定Pod绑定的关系的呢?那就是“Label”和“Label Selector”,可以给Pod分配特定的Label,然后配置Service,通过“Lable Selector”选择具有这些特定“Label”的Pod来接受请求、提供服务。

为容器设定最大的配额的做法从 cgroups 诞生后已经屡见不鲜,但你是否注意到 Kubernetes 给出的配置中有limits和requests两个设置项?这两者的区别其实很简单:requests是给调度器用的,Kubernetes 选择哪个节点运行 Pod,只会根据requests的值来进行决策;limits才是给 cgroups 用的,Kubernetes 在向 cgroups 的传递配额时,会按照limits的值来进行设置。

KubeEdge详解

首先我们的问题是:产品包含了大量的服务,并且服务之间存在复杂的依赖关系,以拓扑的形式运行并相互协作,部署的时候需要手动解决整体的依赖,配制通信的协议和地址,重新部署新环境复杂度非常高。因此,我们希望有一种容器技术可以让我们构建产品所需要的所有的服务能够迅速快捷的重新部署,并且可以根据需求横向的扩展,且保证高可用性,在出现问题的时候可以自动重启或者启动备份服务。

目前有多种解决方案,考虑我们有私有云,亚马逊云以及物理机的几种部署方式,所以Docker作为解决方案的基础,在其之上选择合适的容器拓扑管理工具就成了主要任务,常见的解决方案有:

多种解决方案中我们优先选择官方提供的工具,一般来说官方提供的工具跟自己的原生服务结合的更好,也具有更长远的规划,在官方工具确实不足的情况下以第三方的工具,因此初步我们决定用Docker原生的工具Machine+Swarm+Compose以Mesos来实现整个工程的部署,其中Swarm负责某一功能模块小规模的容器分配调度,Mesos负责整个集群最外层大规模容器调度,可以说以Mesos为主,Swarm为,因为Mesos是比较成熟的管理框架,也有非常适合的调度引擎,Swarm还相对初步随着时间演进,也许会接管更多的调度。

简单介绍下Docker官方原生的工具:

关于Docker网络解决方案的争论比较多了,CoreOS和Kubernetes都有自己的解决方案,前两者都是比较通用的PAAS工具,作为通用性的服务编排工具容器的具体实现可以是多种,Docker只是其中之一,而Docker libnetwork的解决方案过于底层,不适合作为通用的插件集成到Kubernetes或者CoreOS中,因此这两家都有自己CNI类型的解决方案,对于使用者来说我们不那么关心到底这个工具支持多少种容器,只需要知道Docker这种容器能够满足当前产品部署的需求就好,因此我们仍然以Docker的工具为主,尽管不那么通用,但是能够解决我们目前服务编排的问题。

官方的工具看起来很美好,解决方案也足够优雅和简洁,问题就是成熟程度,compose和swarm的结合仍然是在试验阶段,对于处于不同host的container,进行link仍然需要手动对整个Swarm集群设置网络,对于大规模或者复杂拓扑的部署工作量不小,因此我们借助于Mesos来做第一级的或者容器管理,其中第二级或者说小规模容器部署是可以在swarm中实现。

Mesos作为资深的管理平台,在Docker出现之前就已经被广泛利用了,基本上所有的主从类型的分布式计算框架都支持使用Mesos来做基本的分配调度,比如hadoop, storm,spark等等,同时Mesos的设计也可允许长时间运行的lication, 不管是batch job, stream job还是普通的应用服务都可以接入Mesos来申请启动自身的容器。早期Mesos只支持LXC形式的限制,在Docker崛起之后Mesos也开始支持直接使用Docker容器来运行具体的计算框架,可以说二者既有竞争又相辅相成。说竞争是因为目前Docker自己的工具已经慢慢的可以替代一部分Mesos的应用场景了,只要机器上安装了Docker engine就可以无差别的管理所有主机,比如Swarm就可以组建简单的服务集群,管理容器在集群中的运行,同时也能够利用Machine来进行远程管理,说相辅是因为Swarm的设计是可以替换具体的调度后端的,默认情况使用自己的调度器在服务发现的基础上选择一个host来启动容器,通过配置可以选择Mesos作为其调度后端,将Swarm 作为跟Spark同等的Compute Framework来运行,这样Swarm就能够使用Mesos更加成熟和灵活的调度机制来管理容器,在此之上Compose就可以把编排好的服务运行在Mesos集群,可见Mesos和Docker结合的生态系统在当前阶段是比较和谐的。

这样,最终我们的解决方案就基本确定了,Mesos作为最基础的集群管理或者调度工具运行在所有的服务器上,Spark等计算框架不再独立部署,而是使用Mesos最初的LXC容器来运行,Swarm使用Docker容器通过Mesos来调度,Compose文件用来启动结合比较紧密服务堆栈,比如Tachyon集群,我们自己所开发的应用服务以及ACO集群也作为一个Docker服务堆栈在Swarm上运行。所以我们的Mesos集群上目前运行两种计算框架,Spark和Swarm,负责我们的应用和分布式计算的部署,具体的应用和服务编排都是在Compose中完成,个别复杂的应用需要手动去处理关联关系,依然是以Docker的形式运行在Mesos中。

Mesos可以把我们的机器聚合在一起作为一个机器来使用,不管是我们的应用还是分布式计算的任务,都直接提交给Mesos来进行调度,减少了对服务器的垂直划分,不存在Spark的集群, Hadoop的集群等概念,Spark或者Hadoop的job直接在Mesos的sle中分配并运行各自job相关的Executor, 运行结束后释放,就像Spark没有存在过一样, 因此从更高的角度看Mesos的Framework其实就是一个调度器加一个运行时的处理流程,不用再需要Spark或者Storm等框架的Standalone 模式自己来处理调度,只需要使用Mesos的API,实现自己的scheduler和具体启动停止运行过程的Executor就好, 而对于我们自己的应用如果要作为Framework存在也需要实现对应的Scheduler和Executor, 不过可以利用现成的比较好的调度器比如Marathon来托管我们的应用,减少开发Framework的工作量。使用Mesos这样的好处是的利用率更高, 因此我们在也不需要除了Mesos之外的long running 集群, 即使有Long running的服务,也是在Mesos分配好的容器内运行。

Framework = Scheduler + Executor

Mesos的安装过程稍微有点服务,虽然Docker镜像可以减少Mesos的部署复杂度,但是这样就存在了两层容器, Mesos在Docker 容器中运行,而Mesos里边的任务也是在自己的Docker容器里运行,如果有些长时间运行的任务需要暴露出端口跟外界交互,就需要先Expose port到Mesos sle级别的容器, 然后再Expose到最外层的物理机,复杂度增加且对性能有损耗,因此我们最终还是倾向于在物理机上部署Mesos, 只保留一层Docker容器不推荐嵌套,而且有了Mesosphere的DCOS系统,在AWS上部署Mesos就比较简单了。

Mesos看起来很完美,那我们为什么还需要Docker容器呢, 直接使用LXC标准Linux kernel支持的容器不就可以了,在这个解决方案中我们期望所有运行的应用或者分布式计算框架的任务的Executor都是在Docker容器中运行,也是因为Docker杀手级的功能,一个Docker容器就像一个集装箱,里边包含了需要运行一个服务或者任务的所有的依赖条件或者配置,都可以根据需求自身灵活的修改,并且一次装箱随处运行,不用关心外在环境,举个例子如直接使用LXC来运行Spark的某个任务的Executor,需要提供Spark jar包的地址,相关的配置集成到ExecutorInfo中才能运行,而如果使用Docker container就简单很多,Spark executor运行需要的信息都在某个Docker image中,Mesos sle只要调用Docker client启动某个镜像就足以运行一个Framework的某个任务,任务的执行在Docker 容器中。对于我们自己开发的各种服务同理也是组织成镜像最终在Docker容器中运行, Scheduler依赖Marathon就可以。

容器网络:盘点,解释与分析

KubeEdge 是一个开源的系统,可将本机容器化应用编排和管理扩展到边缘端设备。 它构建在Kubernetes之上,为网络和应用程序提供核心基础架构支持,并在云端和边缘端部署应用,同步元数据。100%兼容K8S API,可以使用K8S API原语管理边缘节点和设备。KubeEdge 还支持 MQTT 协议,允许开发人员编写客户逻辑,并在边缘端启用设备通信的约束。

kubernetes + 容器的组合大大提高了用户创建部署应用的效率。kubernetes 可以把 n 台主机整合成一个集群,用户在 master 节点上通过编写一个 yaml 或者 json 格式的配置文件,也可以通过命令等请求 Kubernetes API 创建应用,就直接将应用部署到集群上的各个节点上,该配置文件中还包含了用户想要应用程序保持的状态,从而生成用户想要的环境。

Kubernetes 作为容器编排的标准,自然会想把它应用到边缘计算上,即通过 kubernetes 在边缘侧部署应用,但是 kubernetes 在边缘侧部署应用时遇到了一些问题,例如:

为了解决包含但不限于以上 Kubernetes 在物联网边缘场景下的问题,从而产生了KubeEdge 。对应以上问题:

KubeConShanghai2018——KubeEdge开源首秀

KubeEdge 向左,K3S 向右

KubeEdge实现原理

KubeEdge 由以下组件构成:

如何配置通信协议

初始化命令说明

安装Pod网络插件(CNI)

在完成 Kubernetes master 的初始化后, 我们需要暴露 Kubernetes apiserver 的 端口8080用于与 cloudcore/kubectl 交互。请按照以下步骤在 Kubernetes apiserver 中启用 端口。这样可以在边缘节点执行 kubectl get nodes -s 192.169.0.10:8080 等命令,就像在 master 节点上一样。

KubeEdge 的边缘部分在 deviceTwin 和设备之间使用 MQTT 进行通信。KubeEdge 支持3个 MQTT 模式:

可以使用 kubeedge/edge/conf/edge.yaml 中的 mode 字段去配置期望的模式。

使用 KubeEdge 的 mqtt 内部或外部模式,您都需要确保在边缘节点上安装 mosquitto 或 emqx edge 作为 MQTT Broker。

KubeEdge 在云和边缘之间基于证书进行身份验证/授权。证书可以使用 openssl 生成。请按照以下步骤生成证书。

证书和密钥会分别自动生成在 /etc/kubeedge/ca 和 /etc/kubeedge/certs 目录下。

我们提供了一个示例 node.json 来在 Kubernetes 中添加一个节点。

请确保在 Kubernetes 中添加了边缘节点 edge-node。运行以下步骤以添加边缘节点 edge-node。

在 Cloud 和 Edge 被启动之后,通过如下的命令去检查边缘节点的状态。

请确保您创建的边缘节点状态是 ready

像使用普通k8s一样部署你的应用到edge节点

示例:

提示: 目前对于边缘端,必须在 Pod 配置中使用 hostPort,不然 Pod 会一直处于 ContainerCreating 状态。 hostPort 必须等于 containerPort 而且不能为 0。

然后可以使用下面的命令检查应用程序是否正常运行。

Docker+ Kubernetes已成为云计算的主流(二十六)

虽然许多人倾向用Overlays作为解决跨主机容器网络的实现方法,但是如果您想根据您的环境做出正确的网络选型,容器网络的功能和类型差异还是很大的,值得更深入的理解。 有些类型的网络是容器引擎不可知的,有些类型的网络被锁定到特定的平台供应商或引擎。 一些类型主要关注组网的简单性,另一些类型可能关注功能的广度或IPv6支持以及组播能力。 哪一个适合您取决于您的应用程序需求,性能要求,工作负载布局(私有或公共云)等。让我们回顾一下目前比较常见的容器网络。

本文主要关注当前容器网络类型的细分,包括:

?None

?Overlay

?Underlay

曾经的容器网络

随着容器技术的进步与发展。 下面两种模式的网络方案经消失。

Links and Ambassadors

在使用Swarm实现多主机网络支持和编排之前,Docker从单主机网络开始,通过links促成网络连接,作为允许容器通过环境变量或/ etc / hosts文件条目发现彼此的机制,并传输容器之间的信息。 links的能力通常与 ambassador pattern 相结合,以便于跨主机连接容器,并降低被写死links的脆弱性。 这种方法的最大的问题是太静态了。 一旦创建了容器并定义了环境变量,如果相关的容器或服务移动到新的IP地址,则不可能更新这些变量的值。

Container-Med Networking

在这种网络模式下,一个容器重用(映射到)另一个容器的网络命名空间。这种联网模式只能用以下运行Docker容器的方式使用:-net:container:some_container_name_or_id。

这个运行命令标志告诉Docker将这个容器的进程放在已经在另一个容器中创建的网络栈中。当与第一个容器共享相同的IP和MAC地址和端口号时,新容器的进程仍然局限于自己的文件系统,进程列表和限制。这两个容器上的进程将能够通过loopback接口相互连接。

这种联网方式对正在运行的容器执行诊断有用,并且容器缺少必要的诊断工具(例如curl或dig)。可以创建具有必要诊断工具的临时容器并将其附加到第一容器的网络。

容器映射网络可以用于模拟pod式联网,其中多个容器共享相同的网络命名空间。诸如共享本地主机通信和共享同一IP地址的优点是容器在同一个pod中运行的概念所固有的,这是rkt容器的行为。

现在的容器网络

None

None 是比较直接的容器接收一个网络堆栈,但是缺少外部网络接口。 然而,它会接收一个loopback接口。 当使用无网络或空网络时,rkt和Docker容器项目均提供类似的行为。 这种容器网络的模式具有许多用途,包括测试容器,为稍后的网络连接分配容器,并且分配给不需要外部通信的容器。

Bridge

Linux网桥提供了主机内部网络,其中同一主机上的容器可以通信,但是分配给每个容器的IP地址不能从主机外部访问。 Bridge网络利用iptables进行NAT和端口映射,从而提供单主机网络。桥接网络是默认的Docker网络类型(即,docker0),其中虚拟网络接口对的一端连接在网桥和容器之间。

这里有一个创建流程的例子:

1.在主机上设置网桥。

2.每个容器的命名空间都在该网桥中提供。

3.容器的ethX被映射到私有网桥接口。

4.使用带有NAT的iptables来映射每个私有容器和主机的公共接口。

NAT用于提供主机之外的通信。虽然桥接网络解决端口冲突问题并为在一台主机上运行的容器提供网络隔离,但是会带来一些NAT相关的性能成本。

Host

在这种方法中,新创建的容器与主机共享其网络命名空间,提供更高的性能(接近裸机),并且消除对NAT的需要; 然而,它确实遭受端口冲突问题。 虽然容器可以访问所有主机的网络接口,但除非在特权模式下部署,容器可能不会重新配置主机的网络堆栈。

主机网络是Mesos中使用的默认类型。 换句话说,如果框架没有指定网络类型,新的网络命名空间将不会与容器相关联,而是与主机网络相关联。 有时称为本地网络,主机网络在概念上很简单,使其更容易被理解,故障排除和使用。

Overlay

Overlays使用网络隧道在主机之间传递通信。这允许容器通过从一个主机到下一个主机隧道网络子网表现得好像它们在同一台机器上;实质上是一个网络跨越多个主机。目前存在许多隧道技术,例如虚拟可扩展局域网VXLAN。

VXLAN是Docker libnetwork的首选隧道技术,其多主机网络在1.9版本中作为原生功能。随着这种能力的引入,Docker选择利用HashiCorp的Serf作为gossip协议,选择它的邻居表交换和收敛时间的效率。

对于那些需要支持其他隧道技术的需求,Flannel可能是一个选择。它支持udp,vxlan,host-gw,aws-vpc或gce。每个云提供商隧道类型为您的帐户或者VPC在提供商的路由表中创建路由。对公共云的支持对于overlay驱动尤其重要,因为overlay能比较好的解决混合云场景,并提供扩展和冗余,而无需打开公共端口。

多主机网络在启动Docker守护程序以及键值存储时需要额外的参数。某些overlay依赖于分布式键值存储。如果你正在做容器编排,你已经有一个分布式的键值存储。

overlay层侧重于跨主机通信挑战。在同一主机上连接到两个不同overlay网络的容器不能通过本地网桥彼此通信 - 它们是彼此分段的。

Underlays

底层网络驱动将主机接口(即,eth0处的物理网络接口)直接暴露给在主机上运行的容器或VM。 两个这样的底层驱动就是MACVLAN和IPVLAN。 网络工程师非常熟悉MACVLAN和IPVLAN驱动的操作和功能。 这两个网络驱动在概念上比桥接网络更简单,不需要端口映射,并且更高效。 此外,IPVLAN具有与许多网络工程师比较青睐的L3模式。 考虑到大多数公共云中的限制(或缺乏能力),当您有本地工作负载,安全问题,流量优先级或合规要求时,底层特别有用。 不同于每个VLAN需要一个网桥,底层网络允许每个子接口一个VLAN。

MACVLAN

MACVLAN允许在主机的单个物理接口后面创建多个虚拟网络接口。每个虚拟接口具有唯一的MAC和IP地址分配,有一个限制:IP地址需要在与物理接口相同的广播域。虽然许多网络工程师可能更熟悉子接口这个术语(不要与接口混淆),但用于描述MACVLAN虚拟接口的说法通常是上层或下层接口。 MACVLAN网络是一种消除对LINUX网桥需要的方式,NAT和端口映射,允许您直接连接到物理接口。

MACVLAN每个容器使用唯一的MAC地址,这可能导致启用了防止MAC欺骗的这种安全策略(每个物理交换机接口仅允许一个MAC地址)的网络交换机出现问题。

容器流量被过滤掉,不能与底层主机通信,将主机和它上面运行的容器完全隔离。主机无法到达容器。容器与主机隔离。这对服务提供者或多租户场景有用,并且具有比网桥模型更好的隔离。

MACVLAN需要混杂模式; MACVLAN有四种工作模式,Docker 1.12只支持桥接模式。 MACvlan桥接模式和IPvlan L2模式在功能上等效。两种模式都允许广播和组播流量进入。这些底层协议的设计考虑了内部使用案例。您的公有云里程将有所不同,因为它们的虚拟机接口上大多数不支持混合模式。

注意事项:MACVLAN桥接模式为每个容器分配唯一的MAC地址或许是跟踪网络流量和端到端可见性的福音; 然而,对于具有512个唯一MAC地址的上限的典型网络接口卡(NIC),例如BR OADCOM,应该考虑这个上限。

IPVLAN

IPVLAN与MACVLAN类似,它创建新的虚拟网络接口并为每个IP地址分配一个唯一的IP地址。区别在于,相同的MAC地址用于主机上的所有pod和容器 - 物理接口的相同MAC地址。对这种行为的需要主要由以下事实驱动:许多交换机的通常配置的安全状态是关闭具有来自多于一个MAC地址的业务的交换机端口。

最佳运行内核是4.2或更新版本,IPVLAN可以在L2或L3模式下运行。像MACVLAN一样,IPVLAN L2模式要求分配给子接口的IP地址与物理接口在同一子网中。然而,IPvlan L3模式要求容器网络和IP地址在与父物理接口不同的子网上。

Linux主机上的802.1q配置(使用IP Link创建时)是短暂的,因此大多数运营商使用网络启动脚本来保持配置。对于运行底层驱动程序和暴露API的程序化配置VLAN的容器引擎,自动化可以对其改进。例如,当在机架交换机顶部创建新VLAN时,这些VLAN可以通过暴露的容器引擎API.ico被推入Linux主机。

MACVLAN AND IPVLAN

当在这两种底层类型之间进行选择时,请考虑是否需要网络才能看到单个容器的MAC地址。

对于地址解析协议(ARP)和广播通信,无论是底层驱动程序的L2模式,就像连接到交换机的服务器那样,通过将大量使用802.1D分组学习操作。然而,在IPVLAN L3模式中,网络堆栈在容器内处理,不允许多播或广播流量。在这个意义之上,IPVLAN L3模式会按照您期望L3路由器的行为运行。

注意,上游L3路由器需要知道使用IPvlan创建的网络。网络广告和重新分配网络仍然需要完成。今天,Docker正在尝试边界网关协议(BGP)。虽然静态路 由可以在机架交换机的顶层创建,就像goBGP项目如雨后春笋般成立作为一个容器生态友好的方式来提供对等邻居和路由交换功能。

尽管在给定主机上支持多种联网模式,但是MACVLAN和IPVLAN不能同时在相同的物理接口上使用。总之,如果你习惯于在主机上运行trunks,可以用L2模式。如果你主要关注规模,L3则具有大规模的潜力。

DIRECT ROUTING

出于同样的原因,IPVLAN L3模式被网络工程师所青睐,他们可能选择专注于在第3层解决寻址网络复杂性。这种方法受益于利用现有的网络基础设施来管理容器网络。集中在L3的容器网络解决方案使用路由协议提供连接,这可以说更容易与现有的数据中心基础设施,连接容器,VM和裸机服务器进行相互操作。此外,L3网络扩展和提供在过滤和隔离网络流量方面的细粒度控制。

CALICO就是一个这样的项目,使用BGP为每个网络分配路由 - 特别是对使用/ 32的工作负载,这允许它与现有的数据中心基础设施无缝集成,并且不需要Overlays。没有Overlays或封装带来的开销,结果是可以组建具有卓越的性能和规模的网络。容器的可路由IP地址将IP地址与端口暴露于外部世界。被培训并习惯于使用路由协议部署,诊断和操作网络的网络工程师可能发现直接路由更容易消化。然而,值得注意的是,CALICO不支持重叠的IP地址。

FAN NETWORKING

F络是实现访问更多IP地址的一种方式,从一个分配的IP地址扩展到250个IP地址。 这是一种获得更多IP而不需要重叠网络的高效方法。 当在公有云中运行容器时,这种类型的网络特别有用,其中单个IP地址被分配给主机并且启动附加网络是禁止的,或者运行另一个负载均衡实例是昂贵的。

POINT-TO-POINT

点对点可能是CoreOS rkt使用的最简单的网络类型和默认网络。 默认情况下,使用NAT或IPMASQ,它将创建一个虚拟以太网对,将一个放在主机上,另一个放在容器pod中。 点到点网络利用iptables不仅为入站流量提供端口转发,而且通过loopback接口为pod中的其他容器之间的内部通信提供端口转发。

Capabilities

在连接性之外,需要考虑对其他网络功能和网络服务的支持。容器网络的许多模式利用NAT和端口转发或有意避免它们的使用。选择网络时,IP地址管理IPAM,组播,广播,IPv6,负载均衡,服务发现,策略,服务质量,高级过滤和性能都是需要额外考虑的。

问题是这些能力是否受到支持。即使您的runtime,编排引擎或插件支持容器网络功能,您的基础架构也可能不支持该功能。虽然一些2级公有云提供商提供对IPv6的支持,但是在顶级公有云中却缺乏对IPv6的支持,这也增加了用户对其他网络类型(例如Overlays和FAN网络)的需求。

在IPAM方面,为了提高易用性,大多数容器runtime引擎默认使用host-local为容器分配地址,因为它们已连接到网络。host-local IPAM涉及定义要选择的固定IP地址块。跨容器网络项目普遍支持动态主机配置协议(DHCP)。容器网络模型(CNM)和容器网络接口(CNI)都具有用于与IPAM系统集成的IPAM内置和插件框架 - 这是在许多现有环境中用的关键能力。

想了解更多关于容器网络模型(CNM)和容器网络接口(CNI)的技术细节请参考忘期文章: 容器网络聚焦:CNM和CNI

文末:请大家关注"Wise2C"公众号并回复进群,睿云小助手会第一时间拉你进入 Docker企业落地实践群,我们分享的各个企业案例项目的技术专家与用户代表,正在敬候您的光临,期待大家就项目的更多细节与疑问与群里的大牛们进行咨询探讨。

需要了解更多有关睿云智合的客户项目细节,请在Wise2C公众号中最佳实践菜单中查看。

干货放送系列之(一): 富德生命人寿容器技术应用实战案例

干货放送系列之(二): 中国平安容器技术应用实战案例

干货放送系列之(三): 民生人寿容器技术应用实战案例

干货放送系列之(四): 某中型人寿保险公司系统架构改造规划咨询实战案例

年度盘点系列: 年度盘点 | 2016年金融行业容器技术应用 - 保险篇

年度盘点系列: 年度盘点 | 2016年金融行业容器技术应用 - 银行篇

若需要了解更多有关Wise系列PaaS产品的详情,请与我们的市场团队联系:

contact@wise2c

常见的五种容器管理方法?

最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享。对于k8s,还是上云更为简单、稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产。

主流云服务容器服务介绍

Docker+ Kubernetes已成为云计算的主流

亚马逊AWS

Amazon Web Services (AWS) 是亚马逊公司旗下云计算服务平台,为全世界范围内的客户提供云解决方案。AWS面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,帮助企业降低IT投入成本和维护成本。

那么如何在AWS上运行Docker呢?AWS 同时为 Docker 开源解决方案和商业解决方案提供支持,并且可通过多种方式在 AWS 上运行容器:

微软Azure

Microsoft Azure 是一个开放而灵活的企业级云计算平台。通过 IaaS + PaaS 帮助用户加快发展步伐,提高工作效率并节省运营成本。

Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用。它开放式的架构给开发者提供了Web应用、互联设备的应用、个人电脑、服务器、或者提供最优在线复杂解决方案的选择。

在容器这块,Azure同样的提供了众多解决方案:

下面我们侧重介绍下以下服务:

阿里云

阿里云(.aliyun)创立于2009年,是全球领先的云计算及人工智能 科技 公司,为200多个国家和地区的企业、开发者和机构提供服务。2017年1月阿里云成为奥运会全球指定云服务商。2017年8月阿里巴巴财报数据显示,阿里云付费云计算用户超过100万。阿里云致力于以在线公共服务的方式,提供安全、可靠的计算和数据处理能力,让计算和人工智能成为普惠 科技 。阿里云在全球18个地域开放了49个可用区,为全球数十亿用户提供可靠的计算支持。此外,阿里云为全球客户部署200多个飞天数据中心,通过底层统一的飞天操作系统,为客户提供全球独有的混合云体验。

飞天(Apsara)是由阿里云自主研发、服务全球的超大规模通用计算操作系统。 它可以将遍布全球的百万级服务器连成一台超级计算机,以在线公共服务的方式为 社会 提供计算能力。 从PC互联网到移动互联网到万物互联网,互联网成为世界新的基础设施。飞天希望解决人类计算的规模、效率和安全问题。飞天的革命性在于将云计算的三个方向整合起来:提供足够强大的计算能力,提供通用的计算能力,提供普惠的计算能力。飞天诞生于2009年2月,目前为全球200多个国家和地区的创新创业企业、、机构等提供服务。

同样,阿里云对容器也提供了友好的支持:

容器服务提供高性能可伸缩的容器应用管理服务,支持用Docker和Kubernetes进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。容器服务简化了容器管理集群的搭建工作,整合了阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器运行环境。

容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。

阿里云弹性容器实例(Elastic Container Instance)是 Serverless 和容器化的弹性计算服务。用户无需管理底层 ECS 服务器,只需要提供打包好的镜像,即可运行容器,并仅为容器实际运行消耗的付费。

容器镜像服务(Container Registry)提供安全的镜像托管能力,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。容器镜像服务简化了Registry的搭建运维工作,支持多地域的镜像托管,并联合容器服务等云产品,为用户打造云上使用Docker的一体化体验。

腾讯云

腾讯云为腾讯倾力打造的云计算品牌,以卓越 科技 能力助力各行各业数字化转型,为全球客户提供领先的云计算、大数据、人工智能服务,以及定制化行业解决方案。其基于QQ、微信、腾讯 游戏 等海量业务的技术锤炼,从基础架构到精细化运营,从平台实力到生态能力建设,腾讯云将之整合并面向市场,使之能够为企业和创业者提供集云计算、云数据、云运营于一体的云端服务体验。

在容器这块,腾讯云提供了如下解决方案:

腾讯云容器服务(Tencent Kubernetes Engine ,TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效部署、调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。

容器实例服务(Container Instance Service , CIS)可以帮用户在云上快捷、灵活的部署容器,让用户专注于构建程序和使用容器而非管理设备上。无需预购 CVM(云服务器),就可以在几秒内启动一批容器来执行任务。同时,开发者也可以通过 kubernetes API 把已有kubernetes 集群的 pod 调度到 CIS 上以处理突增业务。CIS 根据实际使用的计费,可以帮用户节约计算成本。使用 CIS 可以极大降低用户部署容器的门槛,降低用户执行 batch 型任务或处理业务突增的成本。

从上面主流的云服务中我们可以看到,没有哪家云厂商不支持Docker,同样的,也没有哪家云厂商不支持Kubernetes!也就是说,Docker+ Kubernetes已经成为云计算的主流!

什么是Kubernetes(k8s)

Kubernetes(简称k8s)诞生于谷歌,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,其提供了应用部署、规划、更新、维护的机制。

k8s主要有以下特点:

支持公有云,私有云,混合云,多重云(multi-cloud) 。可以将容器化的工作负载从本地开发计算机无缝移动到生产环境。在本地基础结构以及公共云和混合云中,在不同环境中协调容器,保持一致性。

支持模块化,插件化,可挂载,可组合。并且k8s的扩展和插件在社区开发者和各大公司的支持下高速增长,用户可以充分利用这些社区产品/服务以添加各种功能。

支持自动部署,自动重启,自动复制,自动伸缩/扩展,并且可以定义复杂的容器化应用程序并将其部署在服务器群集甚至多个群集上——因为k8s会根据所需状态优化。通过内置的自动缩放器,k8s可轻松地水平缩放应用程序,同时自动监视和维护容器的正常运行。

Kubernetes正在塑造应用程序开发和管理的未来

k8s构建于 Google 数十年经验,一大半来源于 Google 生产环境规模的经验。结合了社区最佳的想法和实践,而且还在不断地高速迭代和更新之中。

她衔着金钥匙出生,一诞生就广受欢迎,更是在2017,其打败了所有的竞争对手,赢得了云计算的战争——主流的云厂商基本上都纷纷放弃了自己造“轮子”的举动,终止了各自的容器编排工具,加盟了k8s阵营,其中包括Red Hat、微软、IBM、阿里、腾讯、华为和甲骨文等。

k8s像风暴一样席卷了应用开发领域,并且已成为云原生应用程序(架构、组件、部署和管理方式)的事实标准,大量的开发者和企业正在使用k8s创建由微服务和无服务器功能组成的现代架构。

Docker+ Kubernetes已成为云计算的主流

容器是现代软件交付的未来,而Kubernetes是编排容器的最佳方案(事实上的标准)。

Docker 和Kubernetes相辅相成,联手打下了云计算的“万里江山”。Docker 为打包和分发容器化应用程序提供了一个开放的标准,而 Kubernetes 则协调和管理通过 Docker 创建的分布式容器化应用程序。换句话说,Kubernetes 提供了部署和运行通过Docker生成的应用程序所需的基础结构。

在主流的云服务,基于Docker+k8s的新型PaaS平台具有敏捷部署、弹性伸缩、灵活调度、故障自动恢复等优势,充分满足业务扩展中的支持,因此在短短两年之内,便从Docker Swarm、Cloud Foundry Diego、Kontena、Apache Mesos、Amazon ECS…等大量对手中脱颖而出,拿下了。

k8s和Docker的胜利意味着这是有史以来第一次,无论使用哪一种云平台,研发人员都可以拥有完全相同的计算环境。

大家在开发应用软件的时候以及架构服务器的时候应该听过关于容器管理的一些方法吧。今天我们就给大家整合了一些比较好用的容器管理方式,一起来了解一下吧。

1.AWS弹性容器服务

AmazonECS支持Docker容器及其专有的Fargate技术。ECS是一个高度可扩展的平台,允许用户安装和运行自己的容器编排软件、管理和扩展虚拟机集群,或在这些虚拟机上安排容器。

这包括长期运行的应用程序、微服务、批处理作业和机器学习应用程序。AWS容器产品与许多其他AWS服务集成,包括弹性负载平衡、AmazonVPC、AWSIAM、,AmazonECR、AWSBatch、AmazonCloudWatch、AWSCloudFormation、AWSCodeStar和AWSCloudTrail。AWS还为Kubernetes(EKS)提供弹性容器服务。

亚马逊网络服务是云计算基础设施市场份额的行业领导者。它在公共云中拥有41.5%的应用程序工作负载。这使其成为组织的焦点,其中包括任何考虑容器的公司。

2.AzureKubernetes服务(AKS)

AzureKubernetesService(AKS)提供了一个功能强大的托管工具,用于使用和编排容器,以及动态扩展基础设施和应用程序。AKS使用Azure门户和AzureCLI或Azure管理器和Terraform等基础设施代码工具来配置集群。

AKS提供了几个关键功能:控制平面遥测、日志聚合和容器运行状况可见性,作为Azure门户的一部分。它还具有自动升级、修补和自我修复功能。

凭借基于应用程序工作负载的近30%的市场份额,微软Azure也是企业云的核心。更重要的是,它的市场份额正在增长。该服务旨在通过引入高度自动化的流程来简化DevOps,这与流程管理相辅相成。

3.DiamantiD10

Diamanti的D10裸机容器平台提供统一的解决方案,ja课程建议可以大规模托管和运行容器化应用程序。它插入现有的VLAN和DNS基础设施。