常见的 Kubernetes 面试题总结
# 简述Kubernetes和Docker的关系?
` Docker `提供容器的生命周期管理和通过镜像构建运行时容器。它的主要优点是将将软件/应用程序运行所需的设置和依赖项打包到一个容器中,从而实现了可移植性等优点。
` Kubernetes `用于关联和编排在多个主机上运行的容器。
# 简述Kubernetes常见的部署方式?
* `kubeadm `:也是推荐的一种部署方式;
* 二进制;
* `minikube `:在本地轻松运行一个单节点 Kubernetes 群集的工具;
# 简述Kubernetes如何实现集群管理?
在集群管理方面,` Kubernetes `将集群中的机器划分为一个` Master `节点和一群工作节点 `Node `。其中,在` Master `节点运行着集群管理相关的一组进程` kube-apiserver `、` kube-controller-manager `和` kube-scheduler `,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。
# 简述Kubernetes集群相关组件?
|组件|功能|
|-|-|
|API Server|作为Kubernetes系统的入口,其封装了核心对象的增删改查操作,以RESTful API接口方式提供给外部客户和内部组件调用,集群内各个功能模块之间数据交互和通信的中心枢纽。|
|Scheduler|为新建立的Pod进行节点(node)选择(即分配机器),负责集群的资源调度。|
|Controller|负责执行各种控制器,目前已经提供了很多控制器来保证Kubernetes的正常运行。|
|Replication Controller|管理维护Replication Controller,关联Replication Controller和Pod,保证Replication Controller定义的副本数量与实际运行Pod数量一致。|
|Node Controller|管理维护Node,定期检查Node的健康状态,标识出(失效|未失效)的Node节点。|
|Namespace Controller|管理维护Namespace,定期清理无效的Namespace,包括Namesapce下的API对象,比如Pod、Service等。|
|Service Controller|管理维护Service,提供负载以及服务代理。|
|EndPoints Controller|管理维护Endpoints,关联Service和Pod,创建Endpoints为Service的后端,当Pod发生变化时,实时更新Endpoints。|
|Service Account Controller|管理维护Service Account,为每个Namespace创建默认的Service Account,同时为Service Account创建Service Account Secret。|
|Persistent Volume Controller|管理维护Persistent Volume和Persistent Volume Claim,为新的Persistent Volume Claim分配Persistent Volume进行绑定,为释放的Persistent Volume执行清理回收。|
|Daemon Set Controller|管理维护Daemon Set,负责创建Daemon Pod,保证指定的Node上正常的运行Daemon Pod。|
|Deployment Controller|管理维护Deployment,关联Deployment和Replication Controller,保证运行指定数量的Pod。当Deployment更新时,控制实现Replication Controller和Pod的更新。|
|Job Controller|管理维护Job,为Jod创建一次性任务Pod,保证完成Job指定完成的任务数目|
|Pod Autoscaler Controller|实现Pod的自动伸缩,定时获取监控数据,进行策略匹配,当满足条件时执行Pod的伸缩动作。|
# 简述Kubernetes RC的机制?
`Replication Controller `用来管理Pod的副本,保证集群中存在指定数量的Pod副本。当定义了RC并提交至Kubernetes集群中之后,Master节点上的` Controller Manager `组件获悉,并同时巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RC的期望值,若存在过多的Pod副本在运行,系统会停止一些Pod,反之则自动创建一些Pod。
# 简述Kubernetes Replica Set 和 Replication Controller 之间有什么区别?
`Replica Set `和` Replication Controller `类似,都是确保在任何给定时间运行指定数量的 Pod 副本。不同之处在于` RS `使用基于集合的选择器,而` Replication Controller `使用基于权限的选择器。
# 简述kube-proxy作用?
`kube-proxy `运行在所有节点上,它监听` apiserver `中` service `和` endpoint `的变化情况,创建路由规则以提供服务 IP 和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。
# 简述Kubernetes中什么是静态Pod?
静态pod是由kubelet进行管理的仅存在于特定Node的Pod上,他们不能通过API Server进行管理,无法与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet无法对他们进行健康检查。静态Pod总是由kubelet进行创建,并且总是在kubelet所在的Node上运行。
# 简述Kubernetes中Pod可能位于的状态?
|状态|说明|
|-|-|
|Pending|API Server已经创建该Pod,且Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程。|
|Running|Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态。|
|Succeeded|Pod内所有容器均成功执行退出,且不会重启。|
|Failed|Pod内所有容器均已退出,但至少有一个容器退出为失败状态。|
|Unknown|由于某种原因无法获取该Pod状态,可能由于网络通信不畅导致。|
# 简述Kubernetes创建一个Pod的主要流程?
Kubernetes中创建一个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数据中心。
# 简述Kubernetes中Pod的重启策略?
Pod重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应操作。
Pod的重启策略包括Always、OnFailure和Never,默认值为Always。
* Always:当容器失效时,由kubelet自动重启该容器;
* OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器;
* Never:不论容器运行状态如何,kubelet都不会重启该容器。
同时Pod的重启策略与控制方式关联,当前可用于管理Pod的控制器包括` ReplicationController `、` Job `、` DaemonSet `及直接管理` kubelet `管理(静态Pod)。
不同控制器的重启策略限制如下:
* RC和DaemonSet:必须设置为Always,需要保证该容器持续运行;
* Job:OnFailure或Never,确保容器执行完成后不再重启;
* kubelet:在Pod失效时重启,不论将RestartPolicy设置为何值,也不会对Pod进行健康检查。