八股文 云原生
Docker篇
Docker 与 虚拟机的区别?
启动速度不同
docker: 启动 Docker 相当于启动宿主操作系统上的一个进程,启动速度属于秒级别。
虚拟机: 启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢,通常需要几分钟。
占用资源不同
docker: Docker 只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。
虚拟机: 虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台机器只能开启几十个的虚拟机。
隔离性不同
docker: docker隔离性更弱,docker属于进程之间的隔离。
虚拟机: 虚拟机隔离性更强,可实现系统级别隔离。
安全性不同
docker: docker的安全性更弱。Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作,容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
虚拟机: 虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互。
交付部署不同
docker: Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署。
虚拟机: 虚拟机可以通过镜像实现环境交付的⼀致性,但镜像分发⽆法体系化。
Docker如何实现资源隔离?/ 底层原理?
-
Namespace: Docker 使用 Linux 内核提供的各种命名空间,如 PID 命名空间、网络命名空间、挂载点命名空间等,实现了进程间的隔离。每个容器都有自己独立的命名空间,使得容器内的进程看起来像在一个独立的系统中运行一样。
-
Cgroups: 通过 Cgroups 技术,Docker 可以限制容器可以使用的资源,如 CPU、内存、磁盘 I/O 等。这样可以避免某个容器占用过多资源影响其他容器的正常运行,实现资源的有效分配和隔离。
-
文件系统隔离: Docker 使用 Union 文件系统技术(如 AUFS、OverlayFS)将容器与宿主机进行隔离,容器内的文件系统只能访问容器内部的文件,而不会影响宿主机或其他容器的文件系统。
Kubernetes篇
客户端如何从外部访问集群内部的服务?
对于 Kubernetes,集群外的客户端默认情况,无法通过 Pod 的 IP 地址或者Service 的虚拟 IP 地址:虚拟端口号进行访问。通常可以通过以下方式进行访问Kubernetes 集群内的服务:
-
映射 Pod 到物理机: 将 Pod 端口号映射到宿主机,即在 Pod 中采用
hostPort
方式,以使客户端应用能够通过物理机访问容器应用; -
映射 Service 到物理机: 将 Service 端口号映射到宿主机,即在 Service 中采用
nodePort
方式,以使客户端应用能够通过物理机访问容器应用。 -
映射 Sercie 到
LoadBalancer
: 通过设置LoadBalancer
映射到云服务商提供的LoadBalancer
地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。
Kubernetes的调度策略有哪些?
我记得住的话,有一下几种调度策略,
-
均衡调度(Balance): 默认的调度策略。它会尽量将 Pod 均匀地分布在可用节点上,以平衡集群中的负载。
-
节点亲和性调度(Node Affinity): 通过节点亲和性调度策略,可以指定 Pod 应该被调度到特定的节点上。可以使用标签选择器来定义节点亲和性规则,以实现某些特定的调度需求。 比如将需用到GPU的容器调度到具有GPU的节点上。
-
Pod 亲和性调度(Pod Affinity): 通过 Pod 亲和性调度策略,可以指定 Pod 应该被调度到与其他 Pod 相同或不同的节点上。这对于需要将相关的服务部署在相同节点上的场景非常有用。
-
Pod 反亲和性调度(Pod Anti-Affinity): 与 Pod 亲和性相反,Pod 反亲和性调度策略会尽量将 Pod 调度到与其他 Pod 不同的节点上,以增加容灾能力和故障隔离性。
这是调度策略,然后在调度器调度的过程,会先后执行预选和优选两个算法。
过滤阶段也叫预选阶段: 执行各种函数来检查节点是否满足Pod运行的需要。比如说Pod需要的端口号有没有被占用、有没有污点等。其中有一个函数叫做NodeResourceFit,他会将Pod中设置的request值和节点上所有Pod的request之和相加看看是否超过节点的总资源,如果超过,就会淘汰这个节点;
打分阶段也叫优选阶段: 根据各种函数计算节点的得分,按得分排序,得分最高的节点就是最终绑定Pod的节点。
Kubernetes 调度 Pod 的详细过程?
- 用户提交创建Pod的信息;
APIserver
接收到Pod的创建信息,然后将信息写入到Etcd数据库;Scheduler
监听到Etcd数据库里新增了一个Pod,然后调用一系列函数,通过预选和优选过程,为Pod选择一个合适的节点,并将其绑定到该节点上;Scheduler
将Pod的绑定信息发送给APIserver
,然后APIserver
将该信息写入到Etcd数据库;- 节点上的
Kubelet
监听到有Pod绑定到自己节点上的信息,于是就通过Container
将这个Pod运行起来,并Pod运行起来的信息发送给APIserver
; APIserver
将信息写入到Etcd数据库,至此,Pod从创建到运行的过程执行完毕;