No.5 腾讯,阿里,字节,优科面经(中-docker与k8s)(下)

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: No.5 腾讯,阿里,字节,优科面经(中-docker与k8s)

3.k8s中的pod中OOM机制有了解过吗,原理是什么?

(tips:蚂蚁金服的oceanbase数据库产品问了这个问题,当时被问还是有点点蒙的。这个涉及到pod的QOS的相关知识。阿里面试官首先介绍了系统中进程的OOM机制,会给每个进程进行打分,然后kill掉得分最高的那一个进程,然后问pod的OOM是怎么样的?)


 答:当系统 OOM上时,对于处理不同 OOMScore 的进程表现不同,OOMScore 是针对 memory 的,当宿主上 memory 不足时系统会优先 kill 掉 OOMScore 值高的进程,可以使用如下指令:


$ cat /proc/$PID/oom_score

查看进程的 OOMScore。OOMScore 的取值范围为 [-1000, 1000],Guaranteed pod 的默认值为 -998,Burstable pod 的值为 2~999,BestEffort pod 的值为 1000,也就是说当系统 OOM 时,首先会 kill 掉 BestEffort pod 的进程,若系统依然处于 OOM 状态,然后才会 kill 掉  Burstable pod,最后是 Guaranteed pod;


4. k8s的基本组件及其作用?

一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )。

ApiServer :资源操作的唯一入口接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager :负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。

Etcd :负责存储集群中各种资源对象的信息,k/v方式存储,所有的 k8s 集群数据存放在此。

Kuberctl: 命令行配置工具

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

Kubelet :负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器,会按固定频率检查节点健康状态并上报给 APIServer,该状态会记录在 Node 对象的 status 中。

KubeProxy :负责提供集群内部的服务发现和负载均衡

Docker :负责节点上容器的各种操作。


5.kubevirt的基本组件及其作用?

virt-api:kubevirt是以CRD形式去管理VM Pod,virt-api就是所有虚拟化操作的入口,这里面包括常规的CDR更新验证、以及console、vm start、stop等操作。

virt-controller:virt-controller会根据vmi CRD,生成对应的virt-launcher Pod,并且维护CRD的状态。与kubernetes api-server通讯监控VMI资源的创建删除等状态。

virt-handler:virt-handler会以deamonset形式部署在每一个节点上,负责监控节点上的每个虚拟机实例状态变化,一旦检测到状态的变化,会进行响应并且确保相应的操作能够达到所需(理想)的状态。virt-handler还会保持集群级别VMI Spec与相应libvirt域之间的同步;报告libvirt域状态和集群Spec的变化;调用以节点为中心的插件以满足VMI Spec定义的网络和存储要求。

virt-launcher:每个virt-launcher,pod对应着一个VMIkubelet只负责virt-launcher pod运行状态,不会去关心VMI创建情况。virt-handler会根据CRD参数配置去通知virt-launcher去使用本地的libvirtd实例来启动VMI随着Pod的生命周期结束,virt-lanuncher也会去通知VMI去执行终止操作;其次在每个virt-launcher pod中还对应着一个libvirtd,virt-launcher通过libvirtd去管理VM的生命周期,这样做到去中心化,不再是以前的虚拟机那套做法,一个libvirtd去管理多个VM。

virtctl:virtctl是kubevirt自带类似kubectl的命令行工具,它是越过virt-launcher pod这一层去直接管理VM虚拟机,可以控制VM的start、stop、restart。


6.Etcd的写数据流程是什么?

(tips:天翼云问了这个问题,Etcd写数据流程,这个很细节,不准备的话基本就不会了

640.png

总体上的请求流程从上至下依次为客户端 → API 接口层 → etcd Server → etcd raft 算法库。)

读请求客户端通过负载均衡选择一个 etcd 节点发出读请求API 接口层提供了 Range RPC 方法etcd 服务端拦截到 gRPC 读请求后调用相应的处理器处理请求

写请求客户端通过负载均衡选择一个 etcd 节点发起写请求etcd 服务端拦截到 gRPC 写请求,涉及一些校验和监控,之后 KVServer 向 raft 模块发起提案,内容即为写入数据的命令。经过网络转发,当集群中的多数节点达成一致并持久化数据后状态变更且 MVCC 模块执行提案内容


7.在异构架构下,比如有些主机是x86,有些主机是arm架构,k8s怎么保证异构架构下这些主机拉起不同的架构的镜像?

(tips:天翼云问了这个问题,这里当时不知道怎么回答,后来了解到docker的manifest机制。)

docker每一个镜像包含了一个文件,这个文件包含了有关于镜像信息,如层、大小和摘要docker manifest命令还向用户提供附加信息,比如构建镜像的操作系统和体系结构。而manifest list是一个镜像清单列表,用于存放多个不同os/arch的镜像信息。我们主要用到manifest的目的,其实还是多用于存放不同的os/arch信息,也就是方便我们在不同的CPU架构(arm或者x86)或者操作系统中,通过一个镜像名称拉取对应架构或者操作系统的镜像,这个尤其是在K8S中,对于异构CPU的服务器中的镜像显得尤为有效。

参考文章具体大家可以参考这篇文章,写的不错,从介绍到实战一应俱全。《docker manifest 使用实战_嫌疑人X的解忧杂货店的博客-CSDN博客_docker manifest》

8.kubebuilder初始化项目的流程?整体说一下?list和watch在哪个模块中?

开发流程大致有以下几个过程:

  1. 初始化项目结构(可根据 sample controller 修改)
  2. 定义 CRD
  3. 生成代码
  4. 初始化 controller
  5. 实现 controller 具体逻辑

list and watch 在client-go中。


9.Prometheus相关问题

(tips:这个主要考察了pro的基本数据结构,基本组件等等问题,做边缘计算,物联网好多推送方式用的push-gateway的方式以改善弱网环境下的状态。)

pro的四种数据构:Counter,Gauge,Histogram,SummaryPrometheus
组成及架构
Prometheus 生态圈中包含了多个组件,其中许多组件是可选择的:
1.Prometheus Server: ------服务端 ---处理,储存数据
负责收集和存储时间,Prometheus 组成及架构序列数据(time series data
,并且提供查询接口。

2.Jobs/Exporters: ------客户端 ---采集数据

客户端,用于暴露已有的第三方服务的 metrics 给 Prometheus。
监控并采集指标,对外暴露HTTP服务(/metrics);目前已经有很多的软件原生就支持Prometheus,提供/metrics,可以直接使用;对于像操作系统已经不提供/metrics的应用,可以使用现有的exporters或者开发自己的exporters来提供/metrics服务;

3.Push Gateway: -----相当于代理---转发数据

针对push系统设计,Short-lived jobs定时将指标push到Pushgateway再由Prometheus Server从Pushgateway上pull;主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。

4.Alertmanager: ----告警方式---实现告警

报警组件,从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。

5.Web UI:

Prometheus内置一个简单的Web控制台,可以查询指标,查看配置信息或者Service Discovery等,实际工作中,查看指标或者创建仪表盘通常使用Grafana,Prometheus作为Grafana的数据源;






相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
7月前
|
Docker 容器 Perl
云效flow构建docker镜像更换apt源为阿里镜像源
在 Dockerfile 中添加命令以更换 Debian 源为阿里云镜像,加速容器内软件包下载。核心命令通过 `sed` 实现源地址替换,并更新 apt 软件源。其中 `cat` 命令用于验证替换是否成功,实际使用中可删除该行。
1599 32
|
8月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
319 25
|
11月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
625 78
|
11月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
449 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
11月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1268 19
|
10月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
2667 11
|
2月前
|
缓存 前端开发 Docker
Docker Layer Caching:加速你的容器构建
Docker Layer Caching:加速你的容器构建