k8s面试题
目录
[toc]
常规题
概述
简述 Kubernetes 的优势、适应场景及其特点?
答:
Kubernetes 作为一个完备的分布式系统支撑平台,其主要优势:
- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡
Kubernetes 常见场景:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
Kubernetes 相关特点:
- 可移植: 支持公有云、私有云、混合云、多重云(multi-cloud)。
- 可扩展: 模块化,、插件化、可挂载、可组合。
- 自动化: 自动部署、自动重启、自动复制、自动伸缩/扩展。
简述 Kubernetes 的缺点或当前的不足之处
Kubernetes 当前存在的缺点(不足)如下:
- 安装过程和配置相对困难复杂。
- 管理服务相对繁琐。
- 运行和编译需要很多时间。
- 它比其他替代品更昂贵。
- 对于简单的应用程序来说,可能不需要涉及 Kubernetes 即可满足。
k8s是什么?请说出你的了解
答:Kubernetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的容器编排。
K8S是Google公司推出的,它来源于由Google公司内部使用了15年的Borg系统,集结了Borg的精华。
简述什么是 Kubernetes
答:
Kubernetes 是一个全新的基于容器技术的分布式系统支撑平台。
是 Google 开源的容器集群管理系统(谷歌内部:Borg)。
在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。并且具有完备的集群管理能力,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。
简述 Kubernetes 和 Docker 的关系
答:
Docker 提供容器的生命周期管理,Docker 镜像构建运行时容器。它的主要优点是将将软件/应用程序运行所需的设置和依赖项打包到一个容器中,从而实现了可移植性等优点。 Kubernetes 用于关联和编排在多个主机上运行的容器。
架构
简述 Kubernetes 相关基础概念
答:
-
master:k8s 集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有 Etcd 存储服务(可选),运行 Api Server 进程,Controller Manager 服务进程及 Scheduler 服务进程。
-
node(worker):Node(worker)是 Kubernetes 集群架构中运行 Pod 的服务节点,是 Kubernetes 集群操作的单元,用来承载被分配 Pod 的运行,是 Pod运行的宿主机。运行 docker eninge 服务,守护进程 kunelet 及负载均衡器kube-proxy。
-
pod:运行于 Node 节点上,若干相关容器的组合。Pod 内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP 地址和端口,能够通过 localhost 进行通信。Pod 是 Kurbernetes 进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个 Pod 可以包含一个容器或者多个相关容器。
-
label:Kubernetes 中的 Label 实质是一系列的 Key/Value 键值对,其中 key 与value 可自定义。Label 可以附加到各种资源对象上,如 Node、Pod、Service、RC 等。一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上去。Kubernetes 通过 **Label Selector(标签选择器)**查询和筛选资源对象。
-
Replication Controller:Replication Controller 用来管理 Pod 的副本,保证集群中存在指定数量的 Pod 副本。集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量。反之,则会启动少于指定数量个数的容器,保证数量不变。Replication Controller 是实现弹性伸缩、动态扩容和滚动升级的核心。
-
Deployment:Deployment 在内部使用了 RS 来实现目的,Deployment 相当于 RC 的一次升级,其最大的特色为可以随时获知当前 Pod 的部署进度。
-
HPA(Horizontal Pod Autoscaler):Pod 的横向自动扩容,也是 Kubernetes的一种资源,通过追踪分析 RC 控制的所有 Pod 目标的负载变化情况,来确定是否需要针对性的调整 Pod 副本数量。
-
Service:Service 定义了 Pod 的逻辑集合和访问该集合的策略,是真实服务的抽象。Service 提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同 Label 的 Pod,用户不需要了解后台 Pod 是如何运行。
-
Volume:Volume 是 Pod 中能够被多个容器访问的共享目录,Kubernetes 中的Volume 是定义在 Pod 上,可以被一个或多个 Pod 中的容器挂载到某个目录下。
-
Namespace:Namespace 用于实现多租户的资源隔离,可将集群内部的资源对象分配到不同的 Namespace 中,形成逻辑上的不同项目、小组或用户组,便于不同的 Namespace 在共享使用整个集群的资源的同时还能被分别管理。
K8s架构的组成是什么
答:
和大多数分布式系统一样,K8S集群至少需要一个主节点(Master)和多个计算节点(Node)。
- 主节点主要用于暴露API,调度部署和节点的管理;
- 计算节点运行一个容器运行环境,一般是docker环境(类似docker环境的还有rkt),同时运行一个K8s的代理(kubelet)用于和master通信。计算节点也会运行一些额外的组件,像记录日志,节点监控,服务发现等等,计算节点是k8s集群中真正工作的节点。
K8S架构细分:
1、Master节点(默认不参加实际工作):
- Kubectl:客户端命令行工具,作为整个K8s集群的操作入口;
- Api Server:在K8s架构中承担的是“桥梁”的角色,作为资源操作的唯一入口,它提供了认证、授权、访问控制、API注册和发现等机制。客户端与k8s群集及K8s内部组件的通信,都要通过ApiServer这个组件;
- 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接收到的请求后就是通过kubeproxy来转发到pod上的);
-
container-runtime:是负责管理运行容器的软件,比如docker
简述 Kubernetes 集群相关组件
答:Kubernetes Master 控制组件,调度管理整个系统(集群),包含如下组件:
-
Kubernetes API Server:作为 Kubernetes 系统的入口,其封装了核心对象的增删改查操作,以 RESTful API 接口方式提供给外部客户和内部组件调用,集群内各个功能模块之间数据交互和通信的中心枢纽。
-
Kubernetes Scheduler:为新建立的 Pod 进行节点(node)选择(即分配机器),负责集群的资源调度。
-
Kubernetes Controller:负责执行各种控制器,目前已经提供了很多控制器来保证 Kubernetes 的正常运行。
常见控制器:
-
Replication Controller:管理维护 Replication Controller,关联 ReplicationController 和 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 的伸缩动作。
k8s中常见类型的资源介绍和区别?
Kubernetes 体系结构有哪些不同的组成部分
答:
Kubernetes 架构主要包含两个组件-主节点和工作节点。
如下图所示,主节点和工作节点中有许多内置组件。主节点具有 kube-controller-manager,kube-apiserver,kube-scheduler 等。而工作程序节点在每个节点上都运行 kubelet 和 kube-proxy。
k8s 中各个节点上组件有哪些?各自作用是什么?
k8s里命名空间的作用?
部署
简述 Kubernetes 常见的部署方式
答:常见的 Kubernetes 部署方式有:
- kubeadm:也是推荐的一种部署方式;
- 二进制:
- minikube:在本地轻松运行一个单节点 Kubernetes 群集的工具。
- sealos:(2次封装kubeadm,可一键安装k8s集群哦)
简述 Kubernetes Worker 节点加入集群的过程
答:通常需要对 Worker 节点进行扩容,从而将应用系统进行水平扩展。主要过程如下:
- 在该 Node 上安装 Docker、kubelet 和 kube-proxy 服务;
- 然后配置 kubelet 和 kubeproxy 的启动参数,将 Master URL 指定为当前Kubernetes 集群 Master 的地址,最后启动这些服务;
- 通过 kubelet 默认的自动注册机制,新的 Worker 将会自动加入现有的Kubernetes 集群中;
- Kubernetes Master 在接受了新 Worker 的注册之后,会自动将其纳入当前集群的调度范围。
k8s 集群中有没有高可用?你们公司的高可用架构是什么样的?
kubeadm初始化的k8s集群,token过期后,集群中如何增加一个新node节点?
简述Kubernetes如何实现集群管理?
API Server
简述 Kubernetes 各模块如何与 API Server 通信?
答:
Kubernetes API Server 作为集群的核心,负责集群各功能模块之间的通信。
集群内的各个功能模块通过 API Server 将信息存入 etcd,当需要获取和操作这些数据时,则通过 API Server 提供的 REST 接口(用 GET、LIST 或 WATCH 方法)来实现,从而实现各模块之间的信息交互。
如 kubelet 进程与 API Server 的交互:每个 Node 上的 kubelet 每隔一个时间周期,就会调用一次 API Server 的 REST 接口报告自身状态,API Server 在接收到这些信息后,会将节点状态信息更新到 etcd 中。
如 kube-controller-manager 进程与 API Server 的交互:kube-controllermanager 中的 Node Controller 模块通过 API Server 提供的 Watch 接口实时监控Node 的信息,并做相应处理。
如 kube-scheduler 进程与 API Server 的交互:Scheduler 通过 API Server 的Watch 接口监听到新建 Pod 副本的信息后,会检索所有符合该 Pod 要求的 Node 列表,开始执行 Pod 调度逻辑,在调度成功后将 Pod 绑定到目标节点上。
客户端访问 k8s资源需要经过几关?分别是什么?
控制器
如何控制滚动更新过程
答:可以通过下面的命令查看到更新时可以控制的参数:
[root@master yaml]# kubectl explain deploy.spec.strategy.rollingUpdate
maxSurge: 此参数控制滚动更新过程,副本总数超过预期pod数量的上限。可以是百分比,也可以是具体的值。默认为1。 (上述参数的作用就是在更新过程中,值若为3,那么不管三七二一,先运行三个pod,用于替换旧的pod,以此类推)
maxUnavailable: 此参数控制滚动更新过程中,不可用的Pod的数量。 (这个值和上面的值没有任何关系,举个例子:我有十个pod,但是在更新的过程中,我允许这十个pod中最多有三个不可用,那么就将这个参数的值设置为3,在更新的过程中,只要不可用的pod数量小于或等于3,那么更新过程就不会停止)。
DaemonSet资源对象的特性
DaemonSet这种资源对象会在每个k8s集群中的节点上运行,并且每个节点只能运行一个pod,这是它和deployment资源对象的最大也是唯一的区别。所以,在其yaml文件中,不支持定义replicas,除此之外,与Deployment、RS等资源对象的写法相同。
它的一般使用场景如下:
- 在去做每个节点的日志收集工作;
- 监控每个节点的的运行状态;