虚拟机属于虚拟化技术,Docker这样的容器技术,也是虚拟化技术(轻量级的虚拟化)。Docker对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
Docker Registry服务 负责对Docker镜像进行管理,类似仓库管理员。
Docker技术的三大核心概念,分别是:
镜像(Image):是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。一个镜像可以创建多个容器。
容器(Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
仓库(Repository):仓库类似于git,用于托管所有开源的镜像。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
docker采用C/S架构,客户端向服务器发送请求,服务器(以守护进程的形式在后台运行)进行响应,运行容器,创建镜像等等。
Docker主要组件:
Server是一个常驻进程。
REST API 实现了client和server间的交互协议。
CLI 实现容器和镜像的管理,为用户提供统一的操作界面。
启动 Docker 后台服务
systemctl start docker
测试运行 hello-world
docker run hello-world
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
docker run ubuntu:15.10 /bin/echo "Hello world"
具体命令参考:http://www.runoob.com/docker/docker-tutorial.html
K8S,kubernetes,是基于容器的集群管理系统。Kubernetes这个单词来自于希腊语,含义是舵手或领航员。
一个K8S系统,通常称为一个K8S集群(Cluster)。这个集群主要包括两个部分:
一个Master节点(主节点)
一群Node节点(计算节点)
Master节点:
Etcd:是一个高可用的键值存储系统,保存了整个集群的状态。
Apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。
Node节点:
每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。
Runtime:runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。
kube-proxy:该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。
Kubelet:Kubelet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的所有容器(主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等),但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致。还负责Volume(CVI)和网络(CNI, Container Network Interface)的管理。
Docker:创建容器。
Fluentd:主要负责日志收集、存储与查询。
Pod:
pod可以理解为一个虚拟机,包含一组容器和卷。
每个pod在集群中有一个唯一IP。
Pod是短暂的,不是持续性实体,每次重启IP会变。
pod可以包含多个容器,彼此共享相同的端口空间,可以通过localhost通信。
pod中的容器共享相同的数据卷、相同的IP地址、端口空间、IPC命名空间。
每个pod允许设置自己的lable,label用来做管理和服务发现的映射。
Service:
Service是定义一系列Pod以及访问这些Pod的策略的一层抽象。Service通过Label找到Pod组。Service还可以看作一个均衡负载器(一个service可以对应多个pod)。
访问Service 的方式:
可以通过type在Service Spec中指定一个type(默认clusterIP):
ClusterIP(默认):在集群中内部IP上暴露服务。此类型使Service只能从群集中访问。
NodePort: 通过每个Node上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到 ClusterIP服务,这个 ClusterIP 服务会自动创建。通过请求
LoadBalancer: 使用云提供商的负载均衡器(如果支持),可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
externalIPs: 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容,没有任何类型代理被创建。
Kubernetes对象:
Kubernetes对象是Kubernetes系统中的持久实体。Kubernetes使用这些实体来表示集群的状态。
每个Kubernetes对象都包含两个嵌套对象字段,用于管理Object的配置:Object Spec和Object Status。Spec描述了对象所需的状态 - 希望Object具有的特性,Status描述了对象的实际状态,并由Kubernetes系统提供和更新。
Deployment负责创建和更新应用。创建Deployment后,Kubernetes master 会将Deployment创建好的应用实例调度到集群中的各个节点。