大型网站技术基石篇-容器Docker与kubernetes

 
Docker和Kubernetes的关系就如Xen与OpenStack。
Docker是一种容器技术,和Hypervisor(KVM/Xen这类)不同的是,Docker不会提供一整个操作系统,他能提供隔离的程序运行环境。对一个应用来说这已经够了。
Kubernetes是Google的一个开源容器管理项目,他能利用Docker/其他技术部署/管理容器集群。
  Docker
        
 

项目地址:https://www.docker.com/

 
 

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,与KVM这类超级底层虚拟化方案相比,Docker是一种轻量级虚拟化方案,他不需要对内核进行改变,他主要利用linux内核特性实现虚拟化,所有容器运行在同一个内核中。另外,docker还可以部署在KVM/XEN这类虚拟机中!  容器与虚拟机对比如下图。

 

Docker的架构

Docker使用客户端-服务器(client-server)架构模式。Docker客户端会与Docker守护进程进行通信。Docker守护 进程会处理复杂繁重的任务,例如建立、运行、发布你的Docker容器。Docker客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker客户端去连接一个远程的Docker守护进程。Docker客户端和守护进程之间通过socket或者RESTful API进行通信。

 
 

Docker重要概念

 

镜像(Image)

 

Docker镜像是一个只读的模板。举个例子,一个镜像可以包含一个运行在Apache上的Web应用和其使用的Ubuntu操作系统。镜像是用来创建容器的。Docker提供了简单的,你也可以下载别人已经创建好的镜像。

 
 
仓库(Image)
 

Docker仓库用来保存镜像。其相当于一个代码仓库,同样的,Docker仓库也有公有和私有的概念。公有的Docker仓库名字是Docker Hub。也可以自己创建仓库。

 
 
容器(Container)
 

一个Docker容器包含了某个应用运行所有的所需要的环境。每一个Docker容器都是从Docker镜像创建 的。Docker容器可以运行、开始、停止、移动和删除、保存为镜像。每一个Docker容器都是独立和安全的应用平台。

 

Docker内部采用Linux的命名空间机制实现隔离性,采用cgroup实现资源的划分(例如给容器划分2G内存、0.5个cpu)。

 

隔离-命名空间介绍

 

命名空间是为操作系统层面的虚拟化机制提供支撑,目前实现的有六种不同的命名空间,分别为mount命名空间、UTS命名空间、IPC命名空间、用户命名空间、PID命名空间、网络命名空间。命名空间简单来说提供的是对全局资源的一种抽象,将资源放到不同的容器中(不同的命名空间),各容器彼此隔离。命名空间有的还有层次关系,如PID命名空间,图 为命名空间的层次关系图。可以简单理解为像C++,java那样的命名空间。

 
 
 

资源划分-cgroup介绍

cgroup就是controller group,最初由google的工程师提出,后来被整合进Linux内核中,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。 cgroup能限制某个或者某些进程的分配资源。也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等。Cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。

子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源。

 

Docker示例

在安装docker之后,运行其守护进程,然后就可以使用docker创建运行容器。安装docker可以百度一下。
运行docker命令,显示信息就表示安装成功。最好内核是3.8以后的。
 
 

1. 采用docker pull命令从公共库中拉取(下载)一个镜像到我的电脑上。

 

2. 采用docker run命令,可以指定一个镜像作为基础运行容器。 我这里指定了ubuntu镜像,因为我电脑中没有ubuntu镜像,他会自动从公共仓库下载ubuntu的镜像。仔细瞧的话,可以看出我进入了该容器的bash程序。

 

3. 输入docker images,可以查看主机上存储的镜像。

 
 

 
Docker也提供了很多方便的命令对镜像进行操作。
 
  kubernetes
         
项目主页:http://kubernetes.io/
docker仅能在单机上部署容器,而kubernetes可以统一管理各类容器,形成集群。Kubernetes作为Docker生态圈中重要一员,是Google多年大规模容器管理技术的开源版本。Kubernetes支持GCE、vShpere、CoreOS、Azure等平台,也可以直接运行在物理机上。
Kubernetes非常适合做微服务的架构。

其主要功能如下:

1) 用户不需要关心需要多少台机器,只需要关心软件(服务)运行所需的环境。以服务为中心,你需要关心的是api,如何把大服务拆分成小服务,如何使用api去整合它们。

2) 以集群的方式运行管理容器。

3) 解决Docker跨机器容器之间的通讯问题。

4) Kubernetes的Pods自我修复机制使得容器集群总是运行在用户指定的状态。

Kubernetes有几个重要的概念:

1. Pod

Kubernetes的容器管理的最小单位不是容器,貌似说的很别扭。 就是容器并不是Kubernetes管理的最小单元,而是Pods,

一个Pod包含一个或者多个容器。例如一个小程序有数据库和后台程序,可以分别放到一个容器里面,这两个容器组成一个Pods。

Pod的YAML 描述方式:

运行如下命令就会创建Pod:
kubectl create -f ./hello-world.yaml
运行如下命令就会查看Pod状态:
$ kubectl get pods

2. minion/node

minion和node的意思是一样的,是一个主机节点的意思。例如一个虚拟机、一个物理主机。注意,一个Pod不会跨越node。就是即使一个Pod有多个容器,里面的容器会同时存在在同一个Node中,不会分别在不同的Node中。 Kubernetes的调度器会根据Pod的资源需求定义来将Pod分配到不同的Node中(如今支持定义CPU需求、内存需求)。Kubernetes的master/slave程序运行在node里面。

3. Replication Controller

Replication 是复制的意思,用来解决Pod的线性扩容缩容问题,Replication Controller可以创建一个pod的多个副本,并且可以保证集群中该Pod的副本数量保持平衡。例如副本数量规定为10,如果某个pod挂了,数量变为9,那么Replication Controller会自动创建一个Pod,恢复到10个副本的水平。 多个副本可以在不同的Node中。

Replication Controller的YAML  描述方式:

replicas表示副本的数量
template是对Pod的描述。ReplicationController根据template创建多个Pod(数量=replicas),标签为app: nginx。
运行如下命令就会创建Replication Controller:
kubectl create -f ./nginx-rc.yaml

4. Service

Service用来解决Pod的服务发现问题,因为Pod的运行状态可以动态变化(机器切换、宕机),所以访问端最好不要直接去访问某个Pod,而是通过service,service能够将请求进行转发。

服务的YAML描述如下:

该定义创建了一个服务,会将标签为app:nginx(selector选的)的Pod纳入服务中,也就是说该服务接收到的请求会转发给标签为app: nginx的Pod处理。注意:service是负载均衡的,会自动分配请求给不同的Pod。有没有觉得很方便?把Serivce暴露给客户端,客户端只需要请求service,不需要知道后台是个集群。

运行如下命令就会创建Service:
kubectl create -f ./nginx-rc.yaml

5. Label

标签,用来做逻辑上的标记。用来关联service、replication controller和pod.

Kubernetes架构

 

下图为官方的架构图。

 

从图中看出,Kubernetes的架构是典型的master/Slave架构。

Master负责总体的协调控制,Slave负责具体的任务。Master/Slave的组件如下:

盗个图,下图能更清晰的展示Kubernates。

持续更新~~~

转载请注明出处:http://www.cnblogs.com/stonehat/p/5148455.html

大型网站技术学习-3. 容器Docker与kubernetes的更多相关文章

  1. 大型网站技术学习-2. 云计算之OpenStack简述

    上一章讲,虚拟化能够充分的利用资源,带来各种各样的好处. 当一个网站不大,只需要四五台机器就可以支撑的时候,可以采用手工的方式虚拟机,但是当网站流量很高,需要成千上万台机器的时候,那就非常不方便了. ...

  2. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

  3. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  4. 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

    一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...

  5. 大型网站技术架构介绍--squid

    一.大型网站技术架构介绍 1.pv高  ip高 并发量 2.大型网站架构重点    1. 高性能:响应时间,TPS,系统性能计数器.缓存,消息队列等.     高可用性High Availabilit ...

  6. 《大型网站技术架构:核心原理与案例分析》【PDF】下载

    <大型网站技术架构:核心原理与案例分析>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062557 内容简介 本书通过梳理大型网站 ...

  7. 大型网站技术架构(3):WEB 前端性能优化

    上次说到了性能优化策略,根据网站的分层架构,可以大致的分为 web 前端性能优化,应用服务器性能优化,存储服务器性能优化三大类 这次来说一下 web 前端性能优化,一般来说,web 前端就是应用服务器 ...

  8. 阅读《大型网站技术架构》,并结合"重大需求征集系统"有感

    今天阅读了<大型网站技术架构:核心原理与案例分析>的第五.六.七章.这三张主要是讲述了一个系统的可用性.伸缩性和可扩展性.而根据文中所讲述的,一个系统的可用性主要是体现在这个系统的系统服务 ...

  9. 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    大型网站技术架构(四)--核心架构要素   作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...

随机推荐

  1. Java集合框架(Collection Framework)学习之 Collection与Map概貌

    写过Java的人都知道Java集合类,也用过Java集合类.Java集合类位于 java.util 这个包下,就像它的包名暗示的那样,Java集合类就是一套工具.它就像工匠的工具箱一样,它能给使用它的 ...

  2. mvc - Authorize授权

    from : http://www.cnblogs.com/asks/p/4372783.html http://www.cnblogs.com/myindex/p/5479428.html

  3. EasyFastCMS系列教学课程——2、底层代码 ModelHelper与SQLHelper简介

    从本节课开始,我们开始逐步正式进入实际的编码过程中.本节课的核心内容为SQLHeelper和ModelHelper两个核心类库的介绍. SQLHelper这个类相信大家都很熟悉了,他是微软petsho ...

  4. OLEDB方式操作oracle数据库

    OLEDB方式操作oracle数据库 一.查询语句: using (OleDbConnection conn = new OleDbConnection(System.Configuration.Co ...

  5. 算法 UVA 11300

    例3:题目描述 圆桌旁边坐着n个人,每个人有一定数量的金币,金币的总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等.你的任务是求出被转手的金币的数量的最小值. 输入格式 ...

  6. 四、Centos linux系统优化

    1.     无论是哪个版本的linux,都会提供32位和64位的两个版本的镜像. i386为32位 x86_64为64位 两者的区别: 1)目标:需要大量的内存需求的行业为64位,普通用户的需求为3 ...

  7. “全栈2019”Java第五十六章:多态与字段详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第三十九章:构造函数、构造方法、构造器

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. SPOJ QTREE2 Query on a tree II

    传送门 倍增水题…… 本来还想用LCT做的……然后发现根本不需要 //minamoto #include<bits/stdc++.h> using namespace std; #defi ...

  10. [ActionScript 3.0] 使用Embed在类中嵌入字体

    package { import flash.display.Sprite; import flash.text.Font; import flash.text.TextField; import f ...