虚拟化与容器技术面试题
1 虚拟化
1.1 虚拟化技术与虚拟机是什么?
虚拟化是抽象计算机资源的技术,让同时运行在计算机上的多个进程以为自己独占操作系统资源。虚拟化是云计算的重要技术,主要用于物理资源的池化,从而弹性的分配给用户。虚拟化技术可以提高 IT 敏捷性、灵活性和可扩展性,同时大幅节约成本。
虚拟机是一种严密隔离且内含操作系统和应用的软件容器,将多台虚拟机放置在一台计算机上,可以实现单台物理机上运行多个操作系统和应用。Hypervisor(虚拟机监视器)可将虚拟机与主机分离开来,根据需要为每个虚拟机动态分配计算资源。虚拟机也有几个明显的劣势:
(1)争用资源:如果其中一个虚拟机负担过重,可能会影响运行在同一物理服务器上的其他虚拟机。如果对CPU周期、内存和带宽等资源的争用是一个长期存在的问题,则唯一可行的解决方案就是需要更强大的硬件来同时托管多个虚拟机(VM)。
(2)性能问题:即使有足够的资源,某些工作负载在虚拟机(VM)上的性能也可能不如在专用硬件服务器上运行时那样好。
(3)扩大故障面:如果某个业务的虚拟机应为应用故障影响到虚拟机的系统,比如硬盘损坏,虽然一般情况恢复出绝大部分文件,但如果碰巧坏的是虚拟机镜像文件,结果虚拟机里面的文件全军覆没。
(4)移植性较差:虚拟机在不同的虚拟机管理器或者云平台之间的迁移比较困难。
1.2 半虚拟化和全虚拟化的区别是什么?
半虚拟化是需要更改系统内核才得以实现虚拟化,而完全虚拟化是不需要修改内核。
完全虚拟化能够通过创建出的全新虚拟系统来使底层物理系统实现全部抽象化,完全虚拟化的计算效率要比硬件模拟更高。由于 Hypervisor(虚拟机监视器)的使用,在性能上要逊色于纯虚拟机。完全虚拟的最大优势在于不需要对其操作系统进行任何改动,只需要对基础的硬件进行支持即可。
半虚拟化要求客户端 OS在虚拟机上运行,以全虚拟化为基础新添一个能够优化客户端0S指令的API系统 ,极大地减轻了Hypervisor的工作量,快速实现底层硬件的访问。
1.3 说说容器化与虚拟化的区别?
虚拟机是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。
容器化是操作系统级别的虚拟化,它只是模拟计算机的操作系统,不会模拟整个物理机器。多个应用程序可以共享同一OS内核。容器扮演着与虚拟机相似的角色,但是没有硬件虚拟化。它的目的和虚拟机一样,都是为了创造隔离环境,但是虚拟机是操作系统级别的资源隔离,而容器本质上是进程级的资源隔离。
1.4 容器化技术的底层原理是什么?
容器本质上只是 Linux 上运行的特殊的进程,它和操作系统上的其他进程环境进行了隔离,就像一个集装箱一样,在容器里面只能看到它本身。容器技术的基础是 Linux 的 namespace 和 cgroups 内核特性。Namespace 可以让一个进程运行在独立的命名空间中,命名空间里的进程和系统进程相互隔离,不同命名空间中的进程之间相互隔离。隔离的特性确保了不同容器进程互不干扰,拥有各自独立的运行环境。
2 Docker
2.1 Docker与虚拟机有什么不同?
Docker 不是虚拟化硬件的技术,它依赖 container-based virtualization(基于窗口的虚拟化)的技术实现工具,可以认为它是操作系统用户运行级别的虚拟化。Docker 最初使用 LXC 驱动,后来移至由 libcontainer 基础库驱动,现已更名为 runc。docker 是容器化系统上管理容器及应用容器化的部署工具,而操作系统设计用于运行多进程任务,提供多种运算服务的能力,比如虚拟机拥有等同于操作系统的能力。
- 容器无需启动操作系统内核,启动速度非常快。
- 容器化技术很少或几乎不给主机系统增加负载,具有近乎原生的性能表现。
- 与硬件虚拟化不同,基于容器的虚拟化运行时不需要其他额外的虚拟管理层软件 。
- 主机上的所有容器共享主机操作系统上的进程调度,从而节省了额外的资源的需求。
- 与虚拟机 image 相比,容器镜像较小,易于分发。
2.2 Docker的应用场景和优势是什么?
- Docker的应用场景
(1)应用发布和交付:Docker 容器可以将应用程序和依赖项打包成一个可移植的容器,并且可以轻松地在不同环境中部署和运行。
(2)微服务架构:Docker 容器可以用于实现微服务架构。通过将每个微服务打包成一个容器,可以轻松地进行部署和扩展,而不会影响其他服务。
(3)CI/CD 流程:Docker 容器可以与 CI/CD 工具集成,使得开发团队可以轻松地构建、测试和发布应用程序。
(4)多租户应用程序:Docker 容器可以用于构建多租户应用程序。每个租户可以使用自己的独立容器来运行应用程序,从而提高安全性和可靠性。
(5)持续集成环境:Docker 容器可以用于构建持续集成环境。通过将持续集成工具打包到容器中,可以轻松地在各个环境中进行构建和测试。
(6)开发和测试环境:Docker 容器可以用于快速创建开发和测试环境。通过将应用程序和依赖项打包到容器中,可以避免在每个开发者之间重新安装软件和库。
- Docker的优势
(1)更快的交付和部署。开发人员使用镜像构建标准开发环境,运维和测试人员使用镜像来获得和开发人员相同的运行环境。开发环境和测试运维环境无缝对接,节约开发、测试、部署时间。
(2)更高效的资源利用。相较于虚拟机而言Docker不需要额外的Hypervisor支持,Docker是内核级别的虚拟化,实现更高的性能。
(3)更简单的更新管理。使用Dockerfile,通过简单的修改就可以代替大量的更新操作。
2.3 什么是docker-compose?
docker-compose是一个批量化编排和管理多个容器的工具,使用docker-compose.yaml文件配置容器清单。docker-compose命令只能管理docker-compose文件中涉及的容器,大部分命令与docker的命令重合,而docker命令能管理机器上所有的容器和镜像文件。
2.4 Docker 有哪些重要的概念?
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu 16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
2.5 Docker UnionFS有什么作用?
Union文件系统(UnionFS)是一种分成,轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统的Docker镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。即使一次同时加载多个文件系统,从外面看起来只能看到一个文件系统,联合加载会把各层文件系统进行叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
2.6 如何在生产中监控Docker?
Docker提供docker status和docker事件等工具来监控生产中的Docker,使用这些命令获取重要统计数据的报告。当使用容器ID调用docker status时,获得容器的CPU、内存使用情况等,类似于Linux中top命令。Docker事件是一个命令,用于查看Docker守护进程中整改再进行的活动流,一些常见的Docker事件如 attach、commit、die、datach、rename、destroy等。
3 Kubernetes
3.1 Kubernetes的作用是什么?
Kubernetes 是一个开源的分布式容器集群管理系统,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。Kubernetes 具有完备的集群管理能力,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。
3.2 Kubernetes和Docker有什么关系?
Docker 提供容器的生命周期管理和构建运行时容器,将应用程序运行所需的设置和依赖项打包到一个容器中,从而实现了可移植性等优点。Kubernetes 用于关联和编排在多个主机上运行的容器。
3.3 Kubernetes有哪些重要的概念?
- master:k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程。
- node(worker):Node(worker)是Kubernetes集群架构中运行Pod的服务节点,是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy。
- pod:运行于Node节点上,若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通信。Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。
- label:Kubernetes中的Label实质是一系列的Key/Value键值对,其中key与value可自定义。Label可以附加到各种资源对象上,如Node、Pod、Service、RC等。一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。Kubernetes通过Label Selector(标签选择器)查询和筛选资源对象。
- Replication Controller:Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量。反之,则会启动少于指定数量个数的容器,保证数量不变。Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。
- Deployment:Deployment在内部使用了RS来实现目的,Deployment相当于RC的一次升级,其最大的特色为可以随时获知当前Pod的部署进度。
- HPA(Horizontal Pod Autoscaler):Pod的横向自动扩容,也是Kubernetes的一种资源,通过追踪分析RC控制的所有Pod目标的负载变化情况,来确定是否需要针对性的调整Pod副本数量。
- Service:Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同Label的Pod,用户不需要了解后台Pod是如何运行。
- Volume:Volume是Pod中能够被多个容器访问的共享目录,Kubernetes中的Volume是定义在Pod上,可以被一个或多个Pod中的容器挂载到某个目录下。
- Namespace:Namespace用于实现多租户的资源隔离,可将集群内部的资源对象分配到不同的Namespace中,形成逻辑上的不同项目、小组或用户组,便于不同的Namespace在共享使用整个集群的资源的同时还能被分别管理。
3.4 Kubernetes如何实现集群管理?
Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node。其中,在Master节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。
3.5 Kubernetes创建Pod的主要流程是什么?
Kubernetes中创建一个Pod涉及多个组件之间联动,主要流程如下:
(1)客户端提交Pod的配置信息(可以是yaml文件定义的信息)到kube-apiserver。
(2)Apiserver收到指令后,通知给controller-manager创建一个资源对象。
(3)Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中。
(4)Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
(5)Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。
3.6 ectc的特点和使用场景是什么?
- 服务发现(Service Discovery):服务发现主要解决在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以查找和连接。
- 消息发布与订阅:在分布式系统中,最实用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。应用中用到的一些配置信息放到etcd上进行集中管理。
- 负载均衡:在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。etcd本身分布式架构存储的信息访问支持负载均衡。etcd集群化以后,每个etcd的核心节点都可以处理用户的请求。所以,把数据量小但是访问频繁的消息数据直接存储到etcd中也可以实现负载均衡的效果。
- 分布式通知与协调:与消息发布和订阅类似,都用到了etcd中的Watcher机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更做到实时处理。
- 分布式锁:因为etcd使用Raft算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。
- 集群监控与Leader竞选:通过etcd来进行监控实现起来非常简单并且实时性强。
参考(摘抄的文字版权属于原作者)
https://blog.csdn.net/afreon/article/details/122782334
http://www.guoxiaolong.cn/blog/?id=11976
https://baijiahao.baidu.com/s?id=1705069568358979359&wfr=spider&for=pc
https://zhuanlan.zhihu.com/p/593351621?utm_id=0
https://blog.csdn.net/niwoxiangyu/article/details/118542010
https://blog.csdn.net/drhrht/article/details/126337761
本文链接:https://www.codingbrick.com/archives/1279.html
特别声明:除特别标注,本站文章均为原创,转载请注明作者和出处编码砖家,请勿用于任何商业用途。