文章为云计算学习笔记,其中有大量从他人文章中摘取的内容,仅作为学习用。
1.容器与虚拟化的对别
从最早期的服务器集群,到后来的虚拟化技术,再到后续的容器化技术,资源一直在向着更易交付的方向发展。
虚拟化虽然通过虚拟机提升了资源利用率,但其本身还是需要有hypervisor去充当计算机硬件和虚拟机之间的介质,来分配和利用虚拟机使用的硬件资源。
对于虚拟机(技术代表VMWare和OpenStack),每个虚拟机都包含一个访客操作系统、操作系统运行所需硬件的一个虚拟副本以及一个应用及其关联的库和依赖项。不同操作系统的虚拟机可以运行在同一台物理服务器上。-摘自https://www.ibm.com/cn-zh/cloud/learn/containers
而容器,容器化不是启动整个虚拟机,而是将运行单个应用程序或微服务所需的所有东西(以及它们需要运行的运行时库)打包在一起。容器包括所有代码、它的依赖项,甚至操作系统本身。它们利用主机操作系统的功能来隔离进程并控制进程对 CPU、内存和桌面空间的访问。与虚拟机不同,容器不需要在每个实例中都包含来宾操作系统,而是可以简单地利用主机操作系统的功能和资源。-摘自https://www.ibm.com/cloud/blog/containers-vs-vms 【Containers vs. Virtual Machines (VMs): What’s the Difference?】
windows上的容器与虚拟机对比
2.docker/ kubernetes 分别是什么
1、k8s是一种开放源码的容器集群管理系统,而Docker是一种开放源码的应用容器引擎;
2、k8s是一套自动化部署工具,可以管理docker容器是容器编排层面的,docker是容器化技术,是容器层面的。
-摘自https://www.php.cn/docker/487626.html
首先来分析一下Docker
Docker的三大概念是镜像(Image)、容器(Container)、仓库(Repository)
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
所有构建生成的镜像就变成了一个镜像仓库,由Docker Registry服务进行管理。最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。
有了镜像及仓库,就可以去部署容器了。
但是在将Docker应用于具体的业务实现的过程中,人们发现在编排、管理和调度等各个方面都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。于是Kubernetes(K8S),就是基于容器的集群管理平台,应运而生。
-摘自https://www.cnblogs.com/misswangxing/p/10669444.html
针对K8S,我这边找到了一篇通俗易懂的组件理解分享,链接如下:
https://zhuanlan.zhihu.com/p/32618563
3.K8S内各组件如何分工
K8S由 master节点(API server,Scheduler,contoller manager, etcd)和node(pod,docker,kubelet,kuberproxy,fluentd)节点组成。
Master节点包括API Server、Scheduler、Controller manager、etcd。
API Server是整个系统的对外接口,供客户端和其它组件调用。[1]APIServer 去调用各个进程来完成对 Node 的部署和控制。[6]
Scheduler负责对集群内部的资源进行调度,相当于“调度室”。
Controller manager负责管理控制器,相当于“大总管”。
Docker,不用说了,创建容器的。
Kubelet,主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。
Kube-proxy,主要负责为Pod对象提供代理。
Fluentd,主要负责日志收集、存储与查询。
-https://www.cnblogs.com/misswangxing/p/10669444.html
通常我们都是通过 kubectl 对 Kubernetes 下命令的,它通过 APIServer 去调用各个进程来完成对 Node 的部署和控制。
APIServer 的核心功能是对核心对象(例如:Pod,Service,RC)的增删改查操作,同时也是集群内模块之间数据交换的枢纽。
它包括了常用的 API,访问(权限)控制,注册,信息存储(etcd)等功能。在它的下面我们可以看到 Scheduler,它将待调度的 Pod 绑定到 Node 上,并将绑定信息写入 etcd 中。
etcd 包含在 APIServer 中,用来存储资源信息。
接下来就是 Controller Manager 了,如果说 Kubernetes 是一个自动化运行的系统,那么就需要有一套管理规则来控制这套系统。Controller Manager 就是这个管理者,或者说是控制者。它包括 8 个 Controller,分别对应着副本,节点,资源,命名空间,服务等等。
紧接着,Scheduler 会把 Pod 调度到 Node 上,调度完以后就由 kubelet 来管理 Node 了。
kubelet 用于处理 Master 下发到 Node 的任务(即 Scheduler 的调度任务),同时管理 Pod 及 Pod 中的容器。
在完成资源调度以后,kubelet 进程也会在 APIServer 上注册 Node 信息,定期向 Master 汇报 Node 信息,并通过 cAdvisor 监控容器和节点资源。
微服务的部署都是分布式的,所以对应的 Pod 以及容器的部署也是。为了能够方便地找到这些 Pod 或者容器,引入了 Service(kube-proxy)进程,它来负责反向代理和负载均衡的实施。
Kubernetes 架构简图[6]
参考资料:
[1]Docker和k8s的区别与介绍; https://www.cnblogs.com/misswangxing/p/10669444.html.
[2]Kubernetes入门:Pod、节点、容器和集群都是什么? https://zhuanlan.zhihu.com/p/32618563
[3]docker镜像中包含什么 https://www.php.cn/docker/493253.html
[4]什么是docker微服务 https://www.php.cn/docker/493251.html
[5]docker运行在物理机还是虚拟机上(docker与虚拟机实现原理比较) https://www.php.cn/docker/493250.html
*[6]我花了10个小时,写出了这篇K8S架构解析
https://mp.weixin.qq.com/s?__biz=MjM5ODI5Njc2MA%3D%3D&chksm=bd74fa7a8a03736c08e43b4e7082c3763c0e64491e7b7ef3ddd9f3756cfa5e536730f8f022e8&idx=1&mid=2655827885&scene=21&sn=47feb253e0aa012023d6f421572a04b3#wechat_redirect*