【280期】k8s面试问什么?

【280期】k8s面试问什么?

注:以下所有问题,均为自己总结,若有错误之处,还请指出。

1、 k8s是什么?请说出你的了解?

答:Kubenetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的容器编排。

K8S是Google公司推出的,它来源于由Google公司内部使用了15年的Borg系统,集结了Borg的精华。

2、 K8s架构的组成是什么?

答:和大多数分布式系统一样,K8S集群至少需要一个主节点(Master)和多个计算节点(Node)。

  • 主节点主要用于暴露API,调度部署和节点的管理;
  • 计算节点运行一个容器运行环境,一般是docker环境(类似docker环境的还有rkt),同时运行一个K8s的代理(kubelet)用于和master通信。计算节点也会运行一些额外的组件,像记录日志,节点监控,服务发现等等。计算节点是k8s集群中真正工作的节点。

K8S架构细分:

1、Master节点(默认不参加实际工作):

  • Kubectl:客户端命令行工具,作为整个K8s集群的操作入口;
  • Api Server:在K8s架构中承担的是“桥梁”的角色,作为资源操作的唯一入口,它提供了认证、授权、访问控制、API注册和发现等机制。客户端与k8s群集及K8s内部组件的通信,都要通过Api Server这个组件;
  • Controller-manager:负责维护群集的状态,比如故障检测、自动扩展、滚动更新等;
  • Scheduler:负责资源的调度,按照预定的调度策略将pod调度到相应的node节点上;
  • Etcd:担任数据中心的角色,保存了整个群集的状态;

2、Node节点:

  • Kubelet:负责维护容器的生命周期,同时也负责Volume和网络的管理,一般运行在所有的节点,是Node节点的代理,当Scheduler确定某个node上运行pod之后,会将pod的具体信息(image,volume)等发送给该节点的kubelet,kubelet根据这些信息创建和运行容器,并向master返回运行状态。(自动修复功能:如果某个节点中的容器宕机,它会尝试重启该容器,若重启无效,则会将该pod杀死,然后重新创建一个容器);
  • Kube-proxy:Service在逻辑上代表了后端的多个pod。负责为Service提供cluster内部的服务发现和负载均衡(外界通过Service访问pod提供的服务时,Service接收到的请求后就是通过kube-proxy来转发到pod上的);
  • container-runtime:是负责管理运行容器的软件,比如docker
  • Pod:是k8s集群里面最小的单位。每个pod里边可以运行一个或多个container(容器),如果一个pod中有两个container,那么container的USR(用户)、MNT(挂载点)、PID(进程号)是相互隔离的,UTS(主机名和域名)、IPC(消息队列)、NET(网络栈)是相互共享的。我比较喜欢把pod来当做豌豆夹,而豌豆就是pod中的container;

3、 容器和主机部署应用的区别是什么?

答:容器的中心思想就是秒级启动;一次封装、到处运行;这是主机部署应用无法达到的效果,但同时也更应该注重容器的数据持久化问题。

另外,容器部署可以将各个服务进行隔离,互不影响,这也是容器的另一个核心概念。

4、请你说一下kubenetes针对pod资源对象的健康监测机制?

答:K8s中对于pod资源对象的健康状态检测,提供了三类probe(探针)来执行对pod的健康监测:

1) livenessProbe探针

可以根据用户自定义规则来判定pod是否健康,如果livenessProbe探针探测到容器不健康,则kubelet会根据其重启策略来决定是否重启,如果一个容器不包含livenessProbe探针,则kubelet会认为容器的livenessProbe探针的返回值永远成功。

2) ReadinessProbe探针

同样是可以根据用户自定义规则来判断pod是否健康,如果探测失败,控制器会将此pod从对应service的endpoint列表中移除,从此不再将任何请求调度到此Pod上,直到下次探测成功。

3) startupProbe探针

启动检查机制,应用一些启动缓慢的业务,避免业务长时间启动而被上面两类探针kill掉,这个问题也可以换另一种方式解决,就是定义上面两类探针机制时,初始化时间定义的长一些即可。

每种探测方法能支持以下几个相同的检查参数,用于设置控制检查时间:

  • initialDelaySeconds:初始第一次探测间隔,用于应用启动的时间,防止应用还没启动而健康检查失败
  • periodSeconds:检查间隔,多久执行probe检查,默认为10s;
  • timeoutSeconds:检查超时时长,探测应用timeout后为失败;
  • successThreshold:成功探测阈值,表示探测多少次为健康正常,默认探测1次。

上面两种探针都支持以下三种探测方法:

1)Exec: 通过执行命令的方式来检查服务是否正常,比如使用cat命令查看pod中的某个重要配置文件是否存在,若存在,则表示pod健康。反之异常。

Exec探测方式的yaml文件语法如下:

#提高Job执行效率的方法:
spec:
  parallelism: 2           #一次运行2个
  completions: 8           #最多运行8个
  template:
metadata:

17、描述一下pod的生命周期有哪些状态?

  • Pending:表示pod已经被同意创建,正在等待kube-scheduler选择合适的节点创建,一般是在准备镜像;
  • Running:表示pod中所有的容器已经被创建,并且至少有一个容器正在运行或者是正在启动或者是正在重启;
  • Succeeded:表示所有容器已经成功终止,并且不会再启动;
  • Failed:表示pod中所有容器都是非0(不正常)状态退出;
  • Unknown:表示无法读取Pod状态,通常是kube-controller-manager无法与Pod通信。

18、 创建一个pod的流程是什么?

  • 客户端提交Pod的配置信息(可以是yaml文件定义好的信息)到kube-apiserver;
  • Apiserver收到指令后,通知给controller-manager创建一个资源对象;
  • Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中;
  • Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
  • Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。

19、 删除一个Pod会发生什么事情?

答:Kube-apiserver会接受到用户的删除指令,默认有30秒时间等待优雅退出,超过30秒会被标记为死亡状态,此时Pod的状态Terminating,kubelet看到pod标记为Terminating就开始了关闭Pod的工作;

关闭流程如下:

  • pod从service的endpoint列表中被移除;
  • 如果该pod定义了一个停止前的钩子,其会在pod内部被调用,停止钩子一般定义了如何优雅的结束进程;
  • 进程被发送TERM信号(kill -14)
  • 当超过优雅退出的时间后,Pod中的所有进程都会被发送SIGKILL信号(kill -9)。

20、 K8s的Service是什么?

答:Pod每次重启或者重新部署,其IP地址都会产生变化,这使得pod间通信和pod与外部通信变得困难,这时候,就需要Service为pod提供一个固定的入口。

Service的Endpoint列表通常绑定了一组相同配置的pod,通过负载均衡的方式把外界请求分配到多个pod上

21、 k8s是怎么进行服务注册的?

答:Pod启动后会加载当前环境所有Service信息,以便不同Pod根据Service名进行通信。

22、 k8s集群外流量怎么访问Pod?

答:可以通过Service的NodePort方式访问,会在所有节点监听同一个端口,比如:30000,访问节点的流量会被重定向到对应的Service上面。

23、 k8s数据持久化的方式有哪些?

答:

1)EmptyDir(空目录):

没有指定要挂载宿主机上的某个目录,直接由Pod内保部映射到宿主机上。类似于docker中的manager volume。

主要使用场景:

  • 只需要临时将数据保存在磁盘上,比如在合并/排序算法中;
  • 作为两个容器的共享存储,使得第一个内容管理的容器可以将生成的数据存入其中,同时由同一个webserver容器对外提供这些页面。

emptyDir的特性:

同个pod里面的不同容器,共享同一个持久化目录,当pod节点删除时,volume的数据也会被删除。如果仅仅是容器被销毁,pod还在,则不会影响volume中的数据。

总结来说:emptyDir的数据持久化的生命周期和使用的pod一致。一般是作为临时存储使用。

2)Hostpath:

将宿主机上已存在的目录或文件挂载到容器内部。类似于docker中的bind mount挂载方式。

这种数据持久化方式,运用场景不多,因为它增加了pod与节点之间的耦合。

一般对于k8s集群本身的数据持久化和docker本身的数据持久化会使用这种方式,可以自行参考apiService的yaml文件,位于:/etc/kubernetes/main…目录下。

3)PersistentVolume(简称PV):

基于NFS服务的PV,也可以基于GFS的PV。它的作用是统一数据持久化目录,方便管理。

在一个PV的yaml文件中,可以对其配置PV的大小,指定PV的访问模式:

  • ReadWriteOnce:只能以读写的方式挂载到单个节点;
  • ReadOnlyMany:能以只读的方式挂载到多个节点;
  • ReadWriteMany:能以读写的方式挂载到多个节点。以及指定pv的回收策略:
  • recycle:清除PV的数据,然后自动回收;
  • Retain:需要手动回收;
  • delete:删除云存储资源,云存储专用;

PS:这里的回收策略指的是在PV被删除后,在这个PV下所存储的源文件是否删除)。

若需使用PV,那么还有一个重要的概念:PVC,PVC是向PV申请应用所需的容量大小,K8s集群中可能会有多个PV,PVC和PV若要关联,其定义的访问模式必须一致。定义的storageClassName也必须一致,若群集中存在相同的(名字、访问模式都一致)两个PV,那么PVC会选择向它所需容量接近的PV去申请,或者随机申请。

来源:blog.csdn.net/lvjianzhaoa/article/details/103240449

END

十期推荐

【261期】面试官:说出几个你熟悉的 Zookeeper 命令
【262期】面试官:谈谈MySQL主从复制的原理
【263期】面试最后一问:你有什么要问我的吗?
【264期】盘点MySQL主从复制,在面试中能被问什么?
【265期】面试官:为什么Integer用==比较时127相等而128不相等?
【266期】面试官:Redis主从集群切换数据丢失问题如何应对?
【267期】10道经典MySQL面试题
【268期】美团面试题:当你的JVM 堆内存溢出后,其他线程是否可继续工作?
【269期】链表高频面试题(包括反转、合并、相交、分割、环长等)
【270期】面试官:Spring的Bean实例化过程应该是怎样的?

与其在网上拼命找题? 不如马上关注我们~

【280期】k8s面试问什么?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/8227.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!