← 返回文章列表

K8s运维面试实录(四):深度考察网络与GPU运维

完整还原K8s运维工程师面试,涵盖Pod生命周期、调度策略、网络插件对比、GPU运维、Operator开发等核心技术问题。

53 分钟阅读
字号

K8s运维面试实录(四):深度考察网络与GPU运维

前言

这是某候选人第四场K8s运维面试记录。本场面试深度考察了K8s核心原理,包括Pod创建流程、调度策略、网络插件对比,同时也涉及GPU运维和开发能力。以下为技术问题完整还原。


1. Pod创建完整流程

面试官问:能介绍一下整个Pod创建的完整流程吗?

完整流程

首先的话是去提交这个Pod请求,然后会到达API Server。然后API Server还会进行认证授权准入控制。这里的准入控制的话就可以进行Mutating Webhook跟Validating Webhook进行一个控制。然后会存到这个ETCD数据库当中。

把这个事件然后各个组件的话,它是基于list watch机制进行一个监听这个事件。然后API Server的话就会上报创建这个请求的一个事件。然后Controller Manager的话,它就会监听到这个事件,然后进行一个调谐的一个过程,然后就会提交创建Pod的请求。然后创建Pod请求之后,API之后就会建立到就会把这个写到ETCD数据库,并且上报这个事件给到Scheduler。

然后Schedule的话就会监听到进行一个预选跟优选。预选的话主要是会根据亲和反亲和,还有拓扑域,还有污点容忍这些,然后再进行一个优选。优选的话就是在预选过程中,就是根据选出来的一些机器,再进行一个选择最优的几台机器,然后进行一个调度。然后就会把在哪几台机去调度的话,这个事件上报给那个叫做API Server。API Server就存到ETCD当中,并且上报该事件,给到相关节点的那个Kubelet。

然后Kubelet监听到这个事件之后,它就会调动容器引擎去创建Pod。那创建容器已经创建Pod的过程的话,首先它是会因为在1.24版本之前的话,它直接对接docker多docker守护进程的那1.24之后的话是直接对接containerd这个容器引擎的。然后就会创建出那个container,需要是作为容器的一号进程。然后再可能修的就会调用runC,然后runC就会创建出那个容器的一个容器的进程。

Pod生命周期

以及的话首先Pod的话它是会先创造出那个叫做pause容器,就是网络容器。然后调用那个网络插件将这个容器pause容器的网络进行一个打通。打通完了之后,然后再创建这个业务容器。以及业务容器跟这个pause容器是共享网络网络名称空间的。

然后生命周期的话就是刚才说它是先创造出pause容器之后,它是会先进行一个Init,就是创新Init这种技术,先进行一个初始化。然后初始化完了之后的话,那么它它在运行主业务进程。同时的话,它会先执行那个叫做preStop钩子函数。然后并且的话运行那个readinessProbe就是启动探针进行检测这个容器是否启动。

完成了这个探针的话,它是会一般设置时间是会比较长一点的,以防这个容器运行启动的过程比较长期,以免这个误杀。然后这个探针检测通过之后,才会再运行那个live就是就绪探针跟那个存活探针的一个周期性的一个检测。

然后如果容器结束之前的话,是Kubelet会调用那个preStop钩子函数给它发送执行这个就是结束的一个钩子函数。然后对这个容器先进行一个优雅的退出,然后再进才会就是容器才会结束。

然后结束之后,Kubelet就会上报,把pod的信息上报给API server,那ETCD就会更新这个pod的一个信息。


2. 预选优选详细说明

面试官问:预选和优选能详细说一说吗?

预选规则

对,预选优选预选的话它是就是它会有几个规则。

首先是,我们会设置那个request和limit,这是资源配置。然后也会亲和跟反亲和。

亲和的话它是会有叫做根据,要么是根据可以设置节点的标签,也可以根据pod的标签就是有两个维度。那亲和的话如果带有这个标签的,那么就会调度到对应标签的节点,或者是pod运行pod的一个机器。然后如反亲和的话,那么就相反的,它是不会进行调度到带有这个标签的一个节点,或者是带有这个标签pod的同一个机器上。

然后拓扑域的话拓扑域的话是其实跟均衡调度会关系会比较大一点,就是我们会先拓扑域。可以指定一个单个机器为拓扑域,也可以根据一个机房为拓扑域,也可以一个机架为拓扑域。然后指定完拓扑域之后,它就会会根据通过那个标签选择器选择出该拓扑域中获得的标签的一个数量,有的分布情况。然后再根据那个最大不均匀程度,以及那个软硬策略,然后再选择出这个pod是要调度到哪一个拓扑域当中。这样子就可以使这个pod在这个拓扑域中均衡的分布。

还有污点跟容忍这块的话也是跟预选是有关系的。

污点的话主要是有三种,一个是NoSchedule跟PreferSchedule跟NoExecute。

NoSchedule的话这个污点的话对它是受的这个污点的话,那么这个节点的话就不会被pod调度到。但是该节点上的那个pod如果没有容忍这个污点的话,那它也不会进行一个驱逐。然后PreferNoSchedule的话,如果节点设置了这个污点的话,那么其他机器如果都无法调度的话,那么它是可以调度到这个节点的。

然后NoExecute如果这个节点设置了这个污点的话,那么该节点上如果没有pod没有容忍这个污点的话,那么该节点的pod在五分钟左右的话都会被驱逐掉。


3. K8S版本升级流程

面试官问:你们K8S版本是怎么升级的?遇到过什么问题吗?

升的过程能讲一讲。

我们先升级先升级Master的节点,然后再去升级这个node节点。然后我们升级的话是没有去跨跨,就是跨版本太多版本去升级。我们之前有试过跨过几个版本升级,然后是它有一个兼容性的一个问题后,我们升级的话要么就是只有两个版本的升级,要么就一个版本的一个升级。

然后先升级Master节点的话,我们是先叫做该先把该节点上的一个pod的业务流量进行一个隔离,不要让这个流量的流量再打到这个节点上面。并且的话对那个ETCD进行了一个备份。然后备份完了之后,然后我在那个在那个节点上的话,就是升级节点上上的话再去执行那个kubeadm。kubeadm就是执行完升级之后,就是后续那个节点其他pod的话就是不会再调度上,调度到该节点上面。

然后执行完了之后,然后我就是在那个关键服务的话执行那个PDB保护策略。因为如果在驱散过程中排空过程中的话,如果不对PDB进行PDE保护策略的话,那么就有可能就关键服务的话就会大量的进行一个驱逐。就会导致这个服务要么就停止服务,要么就是说有大量的本来是有三个副本的那导致有两个副本它是同时被驱除掉,那就会使服务它出现那个叫做出现不可达的问题。

然后再通过再做完PDB保护策略之后,然后再执行这个drain进行一个将在将这个节点上的一个pod进行一个排空,排空完了之后,然后再再升级这个节点上的那个叫做那个组件,像kubelet然后kube-proxy以及kubeadm进行一个升级。升级完了之后,如果是升级Master级点的话,我就是升级完之后再会在其他Master节点上执行更新。你如果不更新的话,其他节点的的那个pod它是服务是会有问题的。

然后做完这些之后,然后再逐一的再升级其他的Master节点以及那个node节点。

OK那你们升级过程中有遇到过什么问题吗?

其实也其实也是一般Master节点我们都是一台一台升级的。然后node节点的话是几台可以同时升级的?


4. K8S备份恢复

面试官问:你们有做过K8S集群的备份和恢复吗?

首先我们这个数据的话,它是放在GitLab当中的应用。因为我们就是进行流水线建设的时候,我们是部署到这个集群的一些资源的话,都是通过ArgoCD鉴定到GitLab的一个变化,然后进行一个部署。所以我们的数据的话是都有在那个GitLab当中进行一个存储的。

嗯,这是一块其实有一些工具就是可以对整个K8S做备份的。就我刚才说那些东西,就可以让整个集群异常的时候,就可以把整个配置直接恢复了,就相当于拿了几台裸的机器,存储的机器,根据你备份的ETCD的数据和K8S集群配置的数据,把这个K8S集群恢复掉。

嗯,没事,这个你回头可以查一查,有这个我们也是做过验证的。好的。应该叫那个那个名字,我叫Velero。这种东西Velero可以对,可以去做这种备份,整个机器备份出来。


5. 网络插件对比

面试官问:能介绍一下Flannel、Calico、Cilium和EBPF吗?

好的,那我先介绍一下flannel网络吧。Flannel网络它是有两种,一个是微插链跟Host-GW模式,然后我们用的一般都是用的这个红色微插链模式。

Overlay模式通信流程

微插链模式的话,它是一个通信一个流程的话,它是首先的话它是如果同节点通信的话,它是有一个CNI网桥。然后有一个外设,对一端的话放在cni0网桥,一端的话放在容器的那个eth0上面。然后从eth0出来的话就到cni0网桥,然后再通过路由判决。如果是同节点的话,那么就是通过cni0网桥进行一个广播。

如果是跨节点的话,那么flannel它是有一个起了个微插链设备,它是会进行一个分包解包的那先进行一个分包,然后分包这个流程的话,它是会有涉及到三张表,分别是刚才说的是路由表是一个盼盼路由判决是会判决到快捷点的话,就会给到那个flannel.1进行处理。然后还有两张表的话分别是ARP表。ARP表的话是会根据目标IP的一个叫做目标IP的一个网段,然后会得到目标IP的那个flannel的mac地址,然后会分装到那个内存包里面。然后再通过这个mac地址,然后通过FDB表会得到那个叫做对应目标网段的那个主机的一个IP,然后也是分装到那个外层包里面,然后再通然后再进行一个路由判决。

路由判决完了之后,从那个叫做主机的那个eth0网卡出来,然后到达对端的那个eth0网卡,然后根据这个mac地址,flannel的mac地址,然后就会交给那个对端的那个进行一个处理,进行一个解包的处理。解包完了之后,再通过路由判决再再给到cni0网桥进行一个广播发送兼职,就可以得到发送,到那个就可以进行一个跨节点点的通信。

并且的话这个flannel守护进程的话,它是会基于无阻断网络路由,就是CNI,然后会给每个节点的话分配24位子网炎,然后一般是可以运行256个pod。但是pod的话一般是建议运行110个pod每个节点。

Host-GW模式

然后还有个flannel Host-GW模式,flannel Host-GW模式它是同节点的话,跟那个微插链模式是一样的。也是通过cni0网桥的话,是可以进行那个通信点通信的。跨节点通信的话,它是通过路由判决去进行一个跨节点通信的。也就是说会把那个目标节点的话作为一个路由网关,就是下一个下一跳的话是只限目标地址。然后作为一个网关就给到目标节点。然后目标节点的话再通过路由判决给到cni0网桥进行一个处理。

但是这个的话或者这种模式,它只能进行一个二层的一个通信,它不能进行跨三层通信像微差量的话就能跨合成。

而且一般的话也不会用这个flannel的这个Host-GW模式。因为那个首先第一点的话是因为flannel Host-GW模式的话,它是它比那个calico的话多了一个cni0网桥。然后第二个的话,它是它的那个叫所有的路由的话,路由信息就是都是存到那个ETCD数据库的。一般ETCD数据库它的压力还是比较大的,所以的话如果都存到ETCD库的话,会增加了这个数据库的一个压力。

Calico

Calico的话它是它是进行可以,主要是进行一个它它是主要是也可以进行一个二层通信。它也是跟host-gw模式一样,也是把下一跳的通过路由判决,把下一跳的目标主机的话当成一个网关,进行一个跨节点通信。但是如果是要进行那个叫做三层通信的话,Calico也是可以做到的。也是就是将沿途的这个叫做交换机的话配上这个路由条目,它就可以进行一个三层的一个通信。

然后Calico的话它是因为它是不需要分包解包的,所以的话它是比较适合大规模的一个集群来使用的,效率也会比较高一点。

eBPF

现flannel的话其实就刚才说它是跨就是跨二层通信,它是更加适合的。它不用再去配置这个叫做交换机,沿途的一些交换机。那但是的话它就要进行一个分包解包,那么它的压力一个效率就会降低。并且的话它是他所有路由条目都是存到ETCD数据库中的。所以的话适合小规模的一个集群。

如果是上千台的话,那必须是用Calico了。因为Calico,首先第一不用分包解包,第二它也是可以不会去增加这个ETCD数据库的压力。然后并且的话就Calico其实也是可以进行跨二层通信的值配置会比较繁琐一点,就是要将沿途的一些交换机都配置在这个路由条目。他才知道下一条地址就是发往哪里。

那有一个BGP模式这个你知道吗?Calico那个BGP模式跟微差量跟IPIP就对对对,这是几种它使用的模式。我就是说在实际使用的时候,它有一个叫reflector这样一个能力。

对对对,它是要进行一个配置才行的。您说这个你有了解过吗?就类似像Nginx一样,我们就不用像VIP这种,我们不用说每个路由都所有的同步一遍,而是说我们就通过跟router的两个节点去同步路由就行了。他们去做路由的转化就行。

对,它是可以指定就是指定一个公共的一个节点。指定一个公共节点之后,它就可以直接将一个公共的一个节点进行一个同步路由就行了。这样就不用每个节点的话去进行一个贡献。

Cilium/eBPF

现Cilium的话,它是在内核当中运行的一个程序。它是不需要进行一个上下文的一个切换的,所以效率会比较高更高一点。

这个eBPF你们在生产中有没有其他地方用过?我这个是自己去了解,我们公司的话,它是一直都用的是flannel的这种模式,但没有进行一个变革。


6. Service类型和无头Service

面试官问:能介绍一下Service和无头Service吗?

无头Service

无头Service它是是这样子,如果要使用无头Service的话,首先要满足条件,就是要先设置clusterIP为none。然后它并且的话这个pod的编号它必须是固定的。

所以它这个无头模式的话是必须是使用这个有状态的一个服务。然后它进行一个靠DNS进行解析的时候,它就不会去解析到那个叫做Service的那个IP。它只会解析到那个pod的IP,然后自己再去配置这个负载均衡策略。

Service类型

然后Service的四种模式的话,它是有ClusterIP,NodePort,LoadBalancer,还有ExternalName。

ClusterIP它是进行一个集群内的一个访问。NodePort设置IP为none的话,就是可以进行一个无头Service。然后无头Service它是必须配置跟这个有状态服务进行搭配使用的。

然后LoadBalancer这个类型的话,只是云服务上是可以使用这个类型的。然后它是跟NodePort是一样的,也是在进行在主机上进行一个叫做映射。然后还有一个是ExternalName,它是设置这个模式的话,它是会建这个叫做解析成那个外部域名的。如果要访问外部域名的话,就可以设置成这个模式。就靠DNS解析,然后解析成外部的这个域名地址。


7. QoS等级

面试官问:QoS有哪几种?

QoS等级有三种。他是英文,我确实有时候英文有点忘记。

首先最低等级的话是不是BestEffort,它是比较不靠谱的。然后不靠谱它是通过limits跟request。如果都是在那个样本清单,如果提交的时候都是没有设置的话,那么它就是就会变这个等级。

然后如果提交样本清单,如果都有设置limits跟request的话,那么就是Guaranteed。然后如果介于这两者中间的话,就是比较不靠谱的。

英文确实有点忘记了,不知道怎么读了。那驱逐的时候优先驱逐哪一种?一般优先驱逐的就是不是Guaranteed的,就是BestEffort。


8. cgroup和namespace原理

面试官问:cgroup和namespace是什么?

namespace

namespace命名空间隔离是有6种命名空间。

有PID,就是进程ID。还有Network,就是网络设备端口。还有IPC,就是信号量消息队列。还有Mount,就是文件系统挂载点。还有UTS,就是主机名域名。还有User,就是用户ID组ID。

cgroup

cgroup的话其实是像limits跟request的话,底层的话其实就是通过cgroup进行一个隔离的。它是有个它是在那个节点上/proc这个文件系统中是可以设置的。

然后像limits对应的其实就是cgroup的这个shares。然后像CPU对应的就是cgroup下面的那个CPU呃这两个参数。它是可以进行一个资源的隔离的,像CPU内存磁盘都是可以进行一个隔离的。

资源隔离

那资源隔离是用的namespace技术,还是这个cgroup?

嗯,是这样子的,namespace的话它隔离的是那个叫做隔离是有6种命名空间,是有网络命名空间,还有PID以及IPC还有Mount,还有UTS跟User。

然后cgroup,它是进行一个资源的一个隔离的。然后像刚才说的CPU内存磁盘,那它还有一种隔离的话就是文件系统的隔离。

嗯,overlay2的话它是有有啊罗阿不,罗德还有dir,还有那个mount。load dir的话是镜像层,就是容器内的话它是几个镜像可以进行一个共享的话在这一层。如果是有读写的话,它是写到upper dir这一层的。然后mount的话其实就是容器的一个展示层,它是lower dir跟upper dir的一个结合。如果是lower dir跟upper dir都有的一个内容的话,那么它是展示的是upper dir的这个内容。


9. Flannel网卡丢失问题

问题现象:Pod跨节点通信不通

排查过程

这个问题网卡丢失的话,主要是我们在进行私有化部署的过程中的话,那个客户的话他是有那个操作系统的话,这个客户他是用了他的一个操作系统已经好了。然后我们直接在他的集群上去部署这个K8S跟那个叫做我们的一些部分微服务。然后部署完了之后,他是报了那个叫做pod网络不通的问题。

然后我看了一下那个DNS,像pod以及那个以及路由路由条目,这些都是没有问题的。

然后我用拼命令的话去看了一下这个联通信,然后发现那个同节点的话,它是通信是没有问题的。然后跨节点通信的话是访问不通的,然后再用tcpdump的抓包去去看了一下,然后他是这个包的话,是可以通过这个节本节点的eth0网卡。主机网卡是可以发出的。然后对端的那个eth0网卡也是可以进行正常的收到的。但是对端的flannel网卡的话就收不到这个包了。

所以我就怀疑是不是overlay网络层出了问题。

然后我去看了一下那个flannel那个pod日志,然后它是它日志里面是没有报报错误的,是正常的。flannel它也是正常运行的。然后用ip link命令去看了一下这个网卡的信息,然后发现每一个节点的flannel的mac地址都是一样的,都是同一个mac地址。然后看了一下那个FDB表,这个FDB表的那个地址跟那个网卡的那个地址,它是不一致的,然后每个节点也是不同的。然后我那时候去试,试了一下重启这个机器,然后重启完了之后发现这个flannel这个网卡的这个地址,ip里面查看的话,它还是没有变,那个地址还是没有变化的。

所以的话我就是看了一下flannel源码,看一下这个mac地址到底怎么生成的。然后发现flannel这个源码的话,mac地址的生成的话,它是调用了那个叫做系统的一个函数,然后去生成了这个mac地址。

然后我就在想,要么就是mac这个mac地址就生成的时候有问题,要么就是说他就是生成之后被被谁覆盖了,才导致这个mac地址每一个节点都是一样的。所以我用那个ebpf串串的工具进行了一个内核跟踪脚本进行一个跟踪。

我刚开始跟踪的是那个叫做eth_mac_addr_set函数,然后去进行了跟踪之后,发现只有抓到那个docker,就是去设置了这个eth0网卡信息,然后并没有去抓到并没有抓到flannel的。所以我后面去改变了一个思路,就是去抓那个叫做注册函数。因为每个网卡设置完之后都是要注册到函数里面,所以去跟踪这个注册函数是有抓到了。然后flannel它是设置了这个mac地址,然后这个mac地址跟那个FDB表的mac地址是一样的,那就说明它是设置这个mac地生成的时候是没有问题的。那么就是后面被谁给覆盖了,所以我就进一步的去跟踪了,进一步跟踪了那个设备函数,dev_set_mac_address这个函数,它是同时打印,这个叫做原mac地址以及后面旧的的那个mac地址。

然后进行跟踪发现的话是flannel设置完这个mac地址之后,然后仅仅过两秒被那个NetworkManager给叫做修改了这个mac地址。然后我去看了宿主机,确实是开启了这个NetworkManager这个进程。并且它的那个配置里面也去配置了那个mac地址的一个标,所以才会导致了这个flannel是的设置mac地址会被覆盖掉。

然后后面解决的话是比较简单的,就是去修改这个配置,去忽略掉这个flannel.1网卡的一个设置。然后这样子的话就解决了一个被覆盖的一个问题。然后后续我们去部署的时候,也会同时检查一下这个客户的系统它是否有起这个进程。


10. GPU掉卡问题

问题现象:GPU利用率持续为0,Pod正常但无法使用GPU

排查过程

就像我们是运行那个AI课堂那个叫做分析系统的,然后它是要GPU卡的,然后通过监控发现的话,这个GPU卡的它这个利用率的话持续有几个就是利用率pod节点的利用率的话持续为零,然后pod它是并没有挂掉的。并且的话它是并且的话它这个节点的话,它是没有任何的推理在在跑的。

所以我就用那个kubectl describe去看了一下这个节点的一个情况,然后发现它是那个allocatable,就是总节点资源的话,它是有有六张卡,但是那个allocatable的话,它是发现只有四张卡是可以被调度的那也就是那个Kubelet的话,他去上报的时候,认为只有四张卡是可以可以叫做可用的。

然后我用那个英伟达snm去看了一下,然后发现这个都是能识别出六张卡的,那说明这个物理节点的叫做驱动,那个驱动并没有发生一个故障。这个就GPU卡温度这些功能功率都是没有问题的。

所以我就怀疑是不是那个叫做英伟达驱动上键插件那个pod上报信息有误。然后我去看了一下这个pod的日志信息,然后发现有个报错,就是那个叫做健康检查失败。然后失败的原因是XID错误。然后我去查了一下这个错误,这个错误它是毫秒级会发生过一次。

发生的话它是如果被Kubelet去捕获到的话,那么叫做英伟达驱动那个pod它就会认为这张卡是不健康的,然后就会上报给那个Kubelet。那Kubelet就会把这张卡从allocatable中剔除掉。所以的话就看到只有四张卡是可以被调度了。实际上其实是这个节点是有六张卡的。

然后那我去进一步的看一下这个错误,它是英伟达驱动层面的这个错误吗?然后现在是那个XID94,它是可能是网络抖动造成的,然后导致那个PCIe异常,然后就导致了那个被Kubelet捕获到了。从而让英伟达驱动这个pod认为这张卡是不健康的。

然后这个错误的话,它是不会导致那个GPU去去重启的。它但是的话它是最重要的一个原因是英伟达虽然这个pod,它是不会将这张卡的健康状态自动恢复成健康的。然后即使除非是进行一个设备列这个pod进行一个重启,然后让这个设备列表进行一个刷新,然后才会将健康已经恢复健康状态的那个pod重新标记为健康的。

所以的话我是先写我是写了一个脚本,然后逐逐个对比。这个节每就是GPU节点那个status跟allocatable如果发现不一致的话,就去重启那个英伟达驱动那个pod。然后长期来看的话,还是要去关注这个英伟达的这个官方是否那个版本进行一个更新,还是要让他去支持去检测,定期去检测GPU这个卡。如果是这卡恢复成健康的话,还是能把这个状态恢复成健康的。


11. GPU型号和适用场景

面试官问:GPU型号和适用场景?

常见GPU型号

像T4,A10,A100还有H100。

像A100,A100的话是有8GB还是80GB的一个显存,然后它是适合像A版的话它是它是适合大大数据模型的那像T4的话它适合这种推理类的一些数据。

选型

显存大了适合推理还是训练呢?是显存大的话当然是训练了,像推理的话是是不用那么大。训练类的话一般是用A100的。因为我们是我们的叫做进行运行的是可学生的一个行为分析,就是课堂的一个行为分析,所以主要还是用的T4这种推理类的一个GPU。


12. vGPU虚拟化(hami)

面试官问:hami技术介绍一下?

hami的话它主主要是叫它是它是软件层面的隔离,就是相比那个叫做英伟达那个MIG,并且的话它是可以你请求多少个显存以及那个VGPU,它都是可以进行可以的。

像那个叫做MIG的话,它只能根据一定都是根据相同的比例进行一个切分的。

然后它主要的一点的话,像英伟达就是Operator的话,它它的调度的话还是由K8S这个Scheduler进行一个调度到对应的一个节点的。

然后像hami的话,它是会建它是有个webhook,会将这个请求进行一个劫持。然后劫持完了之后,他是会把那个叫做调度差调度的话交给英伟达他自己的一个调度器进行一个调度的。然后它这个节点上的话,它也是运行那个hami Operator驱动不对,hami那个叫做驱动插件那个pod去取代那个叫做英伟达那个驱动插件那个pod。然后这个pod它也是会去上报自己节点的一个叫做GPU的一个信息。给到是Kubelet了那Kubelet就知道每个pod它还剩下多少一个显存以及GPU了。


13. Operator开发

面试官问:用Go写过Operator,用的什么框架?

Go语言的话,我是用直接用那个controller-runtime来写的。

嗯,比较熟悉那个flannel的。不对,熟悉python的框架的话,我现在那个叫做开发的时候,Operator用的是controller-builder框架。这里面有个近的框架,你不知道你熟悉过没有?

controller-builder我用那个开发,我不是就用controller-runtime,然后用python的话可能框架会比较熟悉。因为是这样,python我们这边可能用的没那么用的比较少。大家可能统一云原生方面的话都用的Go会多一些。

那Go的话我是用直接用那个core building,然后它是用那个client-go机制,然后分装的informer。


14. Ansible Playbook

面试官问:Ansible的role和task是什么?

Ansible的话,role和task你喜欢,对你在哦哦哦哦哦task我pass,我还没听讲。role的话就是那个角色,我们会如果部署那个叫做比较如果只是进行一些对后端机器如果没有进行复杂一些操作,我们直接用那个playbook去就就是编写。如果是那个比较复杂的,要像去部署那个一个架构的话,那我们就会用role的话,它是可以角色。他是不管是在不同的机器上的话,他找文件的话就会跟从这个本本这个叫做role下去找这个呃呃找这个文件。

task它是一个任务。我在执行的时候你要列出所有的task,你用什么参数,你这个你知道吗?

就比如我执行一个playbook的时候,要把所有的task列出来,用什么命令?呃,不知道,你说他不是我我我好像是用的那个叫做就在执行之前的话,我会先进行一个验证,好像是dry run。dry run它只是把所有的那个直接先列出来一下。

比如说像我们历史的task列出来,比如说你执行的过程中发现到某一步失败了,然后我从指定从哪一步骤开始继续执行那个命令有什么这个知道吗?会去指定,我都是直接,因为它是有幂等性判断的,所以的话去重复执行的话,也是没也不会去。如果是之前就已经执行过的一些命令,它不会进行一个会进行一个幂等性判断,不会进行一个重复的一个执行的。

不一定。你这个虽然说执行幂等,但是他如果像这种校验的操作重复执行,你比如说加节点的话,我记得是直接重复执行会有问题的,很多步骤重复执行会有问题。

他我好的,我再去了解。因为我之前的话去执行的话是都是都会有幂等性判断,每个模块它它都有这个判断的。所以然后你直接从开继续执行是吧?对,他也有一些记录,是记录从记录到执行到哪一步了,可以从哪一步就开始执行。就是我想问的问题就是说start task,我从指定从哪一步骤,从哪一个task开始执行。


15. CPU使用率高问题排查

问题现象:节点CPU使用率高,但原因不明

排查思路

案例

其实我想问的问题是说,有没有遇到过那种,就比如说某个CPU很高的话,就是所有的进程它就是全部的网络处理都集中到一个CPU上。网络处理都同时集中到同一个CPU上,就是硬中断这些处理都集中到同个CPU在处理。那其他的CPU可能在闲置的状态,就CPU没有打散。

你有没有遇到过类似这种问题?

CPU没有打赏,我想一想,但我我没有遇到,但是可以进行沟通一下。是是是因为像我之前我刚才说的,遇到那个IPVS对那个外内网的问题,用了那个conntrack,它就是会将同一个数据流的包给到同一个soft那个队列。如果没有设置这个分的话,那么他就会一直给到同一个端口那个对揢就是会在,然后需要进行处理,或者是设置了亲和也会造成这个问题。


16. 硬中断和软中断

面试官问:硬中断和软中断的区别?

首先硬中断的话就是比如网卡的一个包到了网卡之后,那么CPU的话就会通知CPU,CPU就会进行一个硬中断,就是像这个包从网卡中取出来。

然后软中断的话行为比较显著。就是会进行一个协议的一个解析。因为其实硬装的是硬件层面,它是所以的话就会进行一个拆分。如果如果同时进行软硬中断的话,因为他那个协议解析的话是比较费时间的,所以的话就会进行一个拆分出软终端跟硬终端。

如果想把它打散是怎么设置呢?你怎么应该配置什么参数,或者是在机器上做哪个配置,可以把这种网络请求打散到不同的CPU上?

首先我有点忘记我们那时候用conntrack也是一个脚本。它是模拟那个叫做做CPU的那个RSS。它是会也是不是允许?这个有点也是也通过一个脚本去实现,然后去让虽然是同一个数据流的包,它就会流到同一个收费链接。但是如果不是同一个数据流,它就会进行一个也类似一个轮询的一个方式。


17. 进程优先级

面试官问:进程优先级是什么?

进程优先级是有听说有知道它是可以设置那个叫做设置这个优先级的。有就类似一只NICE值。如果是这个优先级设置的越高的话,那么它就是CPU的话是会优先的进行分配到CPU。好像不是,NICE值如果设置的越高的话,CPU的话是越不会优先被分配到的。

他这个进程有哪几个优先级,你知道吗?进程有哪几个优先级?是他是它是实时优先级和非实时优先级。然后它可以设置它的nice值,nice值越小它的优先级越高。


18. Nginx日志配置

面试官问:Nginx需要记录哪些日志?

Nginx的话如果是打印日志是吧?打印日志的话,你应该说是打印哪一些日志吗?

首先是哪些日志?那NGX应该记录哪些日志,你记得吗?我作为web服务器,首先error日志这是以上等级都是要记录的。然后还有access log日志,警告日志也是要记录的。

然后还记录什么?比如说我作为web服务器,首先L这就是以上等级都是要记录的。然后我还word d日志,警告日志也是要记录的。然后还有那个日记,还好,不是你可以发散一下。我想问的并不是仅仅是日志,你还有记录其他什么信息访问,难道我明白了之前做过日志吗?如果没有超过我什么信息你都不记得吗?

info是什么?就是访问的一些信息,像这个日志里面具体的要记录每一条日志我要记录。首先就是明白了首首先扣他的客户的IP是必是一定是要记录的,以及访问的一些时间段,然后访问的一些时间,还有以及访问的那个叫做他是用post还是get访问。他访问的一个类型是怎样子的,以及他访问的一个他URL地址也是要进行一个记录的。

其他那几个,因为我我们是用会通过这个日志的话进行一个容量的一个估算。大概就是有会去记录对客户的一些,根据每日的客户的一个活跃度去统计。

那你这个状态码你不记录吗?对,还有状态码。要这个状态码的话有200300,还有500、400的。然后分别代表什么意思?200的话是是是是是健康是没有问题吗?现在是300的话,其实有有可能发生了一个一些重定向。然后400的话,它是有可能是因为就是网络问题。那像500的话,就是那个服务器可能有可能服务器挂掉了。


总结

本文完整还原了K8s运维工程师的技术面试,涵盖:

  • 核心原理:Pod创建流程、预选优选、QoS等级、cgroup/namespace
  • 网络:Flannel/Calico/Cilium对比、Service类型、无头Service
  • 运维实践:K8S升级、备份恢复(Velero)
  • GPU运维:型号对比、vGPU虚拟化、XID错误排查
  • 开发能力:Go Operator开发(controller-runtime)、Ansible Playbook
  • 问题排查:CPU高、硬软中断、进程优先级

希望对准备K8s运维面试的读者有所帮助。

分享

// RELATED_POSTS

0%