您的位置:首页 > 运维架构 > Docker

Kubernetes(1)——什么是虚拟化技术,什么是容器,什么是Docker,什么是K8S

2020-06-10 04:33 1671 查看

写在前面

今天菜白要开始学习K8S了,其实在很古早的时候菜白就微微看过一点点K8S的内容,但是一直没有深入研究(其实就是没有研究)。现在等于从零开始学习,如果你也想从零开始学习不要错过这篇文章(没有别的意思)。

什么是虚拟化技术,什么是容器,什么是Docker,什么是K8S?

如果不知道虚拟化,不知道容器,不知道Docker,直接学K8S,就好比没活过尿泥就像盖摩天大楼(我瞎比的)。因此我们第一步,先从虚拟化开始讲起。

虚拟化技术

1. 为什么要提出虚拟化技术

最初虚拟化技术的应用和发展源于大型机对分时系统的需求[1]。如何理解这句话呢,我觉得可以把这里的大型机理解成为一个客栈,客栈其实解决了我们对于住宿的时分需求,说客栈的出现让我们不至于因为进京赶考的需求而在全国甚至各地购置我们的房产。

2. 什么是虚拟化技术

从字面上理解虚拟化技术就是将某某虚拟化,那因为我们现在在讨论计算机,因此虚拟化技术就是将物理机虚拟化的一种技术。虚拟化技术即Virtualization,wiki上的解释是:In computing, virtualization refers to the act of creating a virtual (rather than actual) version of something, including virtual computer hardware platforms, storage devices, and computer network resources.我的理解,虚拟化是实现云计算的一种手段[2]

容器技术

在刘鹏的《云计算》书中,把虚拟化分为了两类,一类是建立在宿主机上的,也就是宿主机是有操作系统的,另一类是宿主机没有操作系统的,我们把前者称为寄居虚拟化,后者称为裸机虚拟化。

寄居虚拟化

寄居虚拟化,最底层是物理硬件,物理硬件之上是主机的操作系统,操作系统之上是VMM(virtual machine monitor,虚拟机管理层),再往上就是客户的虚拟户了。在这种技术里面,虚拟机对各种物理设备(CPU、内存、硬盘等)的调用,都是通过VMM层和宿主机的操作系统一起协调才完成的。VMware和VirtualBox都是基于这种方式实现的。

裸机虚拟化

裸机虚拟化,直接将VMM安装在硬件设备与物理硬件之间。VMM在这种模式下又叫做Hypervisor,虚拟机有指令要执行时,Hypervisor会接管该指令,模拟相应的操作[3]

容器虚拟化

刚刚说到的两种技术都属于一般虚拟化技术,而容器技术是一种特殊的虚拟化技术。容器的本质,一句话解释,就是一组受到资源限制,彼此间相互隔离的进程。可以看出,容器是没有自己的OS的,直接共享宿主机的内核,也没有hypervisor这一层进行资源隔离和限制,所有对于容器进程的限制都是基于操作系统本身的能力来进行的[4]

所以容器其实是虚拟化技术的一种。

 

Docker

Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付,测试和部署代码的方法,您可以大大减少编写代码和在生产环境中运行代码之间的延迟[5]

1. Docker架构

Docker使用客户端-服务器架构。Docker Client与Docker Daemon进行对话,Daemon完成了构建,运行和分发Docker容器的繁重工作。Docker Client和Daemon可以 在同一系统上运行,或者您可以将Docker Client连接到远程Docker Daemon。Docker Client和Daemon在UNIX套接字或网络接口上使用REST API进行通信。

 

这里面其实就涉及到我们Docker运行的三板斧,build, pull和run。下面这张图其实很好的描述了我们容器运行的三个步骤, Client可以在镜像库当中建立一个自己需要的镜像;或者我们可以从Registries当中拉去别人已经创建好的镜像;最后就可以在Container当中运行也就是run我们的镜像了。

2. Docker的组件

Docker Daemon

Docker Daemon(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。Daemon还可以与其他Daemon通信以管理Docker服务。

Docker Client

Docker Client(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行它们。该docker命令使用Docker API。Docker Client可以与多个Daemon通信。

Docker Registries

Docker Registries存储Docker映像。Docker Hub是任何人都可以使用的公共注册表,并且Docker配置为默认在Docker Hub上查找映像。您甚至可以运行自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信注册表(DTR)。

使用docker pull或docker run命令时,所需的图像将从配置的注册表中提取。使用该docker push命令时,会将映像推送到配置的注册表。

Docker Object

使用Docker时,您正在创建和使用映像,容器,网络,卷,插件和其他对象。本节是其中一些对象的简要概述。

镜像

一个镜像是用于创建一个Docker 容器指令的只读模板。通常一个镜像基于另一个镜像,并进行一些其他自定义。例如,您可以基于该ubuntu 映像构建映像,但安装Apache Web服务器和您的应用程序,以及运行该应用程序所需的配置详细信息。

您可以创建自己的镜像,也可以仅使用其他人创建并在注册表中发布的镜像。要构建自己的镜像,您可以 使用简单的语法创建一个Dockerfile,以定义创建镜像并运行它所需的步骤。Dockerfile中的每条指令都会在镜像中创建一个层。更改Dockerfile并重建镜像时,仅重建那些已更改的层。与其他虚拟化技术相比,这是使映像如此轻巧,小型和快速的部分原因。

 

容器

容器是镜像的可运行实例。您可以使用Docker API或CLI创建,启动,停止,移动或删除容器。您可以将容器连接到一个或多个网络,将存储附加到该网络,甚至根据其当前状态创建新镜像。

默认情况下,容器与其他容器及其主机之间的隔离程度相对较高。您可以控制容器的网络,存储或其他基础子系统与其他容器或与主机的隔离程度。

容器由其镜像以及在创建或启动时为其提供的任何配置选项定义。删除容器后,未存储在持久性存储中的状态更改将消失。

K8S

Kubernetes,又称作K8S,据说8代替了K和S中间的8个字母,所以称作K8S。

1. K8S是什么?

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化[6]。看到这里大家肯定已经懵逼了,我是谁,我在哪里,Docker是什么,K8S是什么,他们两个又有什么恩怨情仇?

其实K8S和Docker并不像之前三个概念一样是相互继承或者是嵌套的关系。还记得Docker的概念吗,“Docker是一个用于开发,交付和运行应用程序的开放平台”,而Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

原则上,Kubernetes可以使用任何容器化技术。 Kubernetes可以集成的两个最流行的选项是rkt和Docker。 然而,Docker赢得了最大的细分市场,并且在完善Docker和Kubernetes之间的集成方面付出了很多努力,比任何其他容器化技术都要多。

同样,Docker公司提供了自己的容器编排引擎,名为Docker Swarm。但即使他们意识到Kubernetes已经发展到甚至Docker for Desktop(Mac OS和Windows)都带有自己的Kubernetes发行版的事实[7]

所以他们之间的关系我们可以这么理解,如果把整个集群比作一辆车,Docker就是汽车的引擎,K8S就是汽车的制造商,K8S可以选择其他品牌的引擎,当然Docker可以选择其他汽车制造商,甚至是自有品牌。

2. K8S组件

一个 Kubernetes 集群包含 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点和至少一个主节点。

工作节点托管作为应用程序组件的 Pod 。主节点管理集群中的工作节点和 Pod 。多个主节点用于为集群提供故障转移和高可用性。

本文档概述了交付正常运行的 Kubernetes 集群所需的各种组件。

这张图表展示了包含所有相互关联组件的 Kubernetes 集群。

我们根据上面这样图进行逐一讲解,整个K8S分成了三个部分:K8S的control plane,K8S的Nodes以及途中没有显示的插件部分(Addons)

控制平面组件(Control Plane Components

它组件就是整个K8S的指挥中心,保证K8S节点的顺利运行。我看到这里面其实也分成了5个部分,每个部分功能各不相同。

kube-apiserver

顾名思义,这个是Kube的接口服务,他类似一个中转站,传递Control Plane和Node之间的信息主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。kube-apiserver 在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。

etcd

etcd我本来想找到全称,这样可能好记一点,但是并没有找到。大家强行记一下吧,etcd是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。

kube-scheduler

kube-scheduler顾名思义,他就是一个安排工具,主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。

调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。

kube-controller-manager

在主节点上运行控制器的组件。

从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。

我们来看一下这些控制器包括:

  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。

  • 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。

  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。

  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌。

cloud-controller-manager

cloud-controller-manager 运行与基础云提供商交互的控制器。

  • 节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除

  • 路由控制器(Route Controller): 用于在底层云基础架构中设置路由

  • 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器

  • 数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷

 

Node

Kubelet

一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。

kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。

kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了数据包过滤层并可用的话,kube-proxy会通过它来实现网络规则。否则,kube-proxy 仅转发流量本身。

容器运行环境(Container Runtime)

容器运行环境是负责运行容器的软件。

Kubernetes 支持多个容器运行环境: Docker、containerd、cri-o、rktlet以及任何实现 Kubernetes CRI (容器运行环境接口)。

 

 

 

[1] 虚拟化技术发展编年史https://baijiahao.baidu.com/s?id=1643372648777329295&wfr=spider&for=pc

[2] 虚拟化技术(一)——虚拟化简介 https://www.jianshu.com/p/94812484c6a1

[3] 虚拟化技术详解 https://blog.csdn.net/gui951753/article/details/81045508

[4] 深入理解容器基础概念 https://www.jianshu.com/p/517e757d6d17

[5] Docker Overview https://docs.docker.com/get-started/overview/

[6] Kubernetes 是什么?https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/

[7] Docker和Kubernetes独立共生?相爱相杀?https://baijiahao.baidu.com/s?id=1629142139967018899&wfr=spider&for=pc

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: