侧边栏壁纸
博主头像
问道

问道的小花园,总能给你带来惊喜

  • 累计撰写 68 篇文章
  • 累计创建 35 个标签
  • 累计收到 3 条评论

kubernetes面试题总结

问道
2022-09-21 / 0 评论 / 0 点赞 / 879 阅读 / 21,728 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.什么是k8s?说出你的理解
K8s是kubernetes的简称,其本质是一个开源的容器编排系统,主要用于管理容器化的应用,其目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

2.k8s的组件有哪些,作用分别是什么?
k8s主要由master节点和node节点构成。master节点负责管理集群,node节点是容器应用真正运行的地方。
master节点包含的组件有:kube-api-server、kube-controller-manager、kube-scheduler skedʒuːlər 、etcd。
node节点包含的组件有:kubelet、kube-proxy、docker或者container-runtime。
kube-api-server:资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制。
kube-controller-manager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。
kube-scheduler:负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。
Etcd:负责存储集群中各种资源对象的信息。
kubelet:负责维护pod和容器的生命周期,即通过控制docker,来创建、更新、销毁容器;
kube-proxy:负责提供集群内部的服务发现和负载均衡。
container-runtime:容器运行时环境,即运行容器所需要的一系列程序,目前k8s支持的容器运行时有很多,如docker、rkt或其他,比较受欢迎的是docker,但是新版的k8s已经宣布弃用docker。
docker:负责节点上容器的各种操作

3.k8s中命名空间的作用是什么?
作用:资源隔离
namespace是kubernetes系统中的一种非常重要的资源,namespace的主要作用是用来实现多套环境的资源隔离,或者说是多租户的资源隔离。
k8s通过将集群内部的资源分配到不同的namespace中,可以形成逻辑上的隔离,以方便不同的资源进行隔离使用和管理。不同的命名空间可以存在同名的资源,命名空间为资源提供了一个作用域。
可以通过k8s的授权机制,将不同的namespace交给不同的租户进行管理,这样就实现了多租户的资源隔离,还可以结合k8s的资源配额机制,限定不同的租户能占用的资源,例如CPU使用量、内存使用量等等来实现租户可用资源的管理。

4.请详述kube-proxy原理?
集群中每个Node上都会运行一个kube-proxy服务进程,他是Service的透明代理兼均衡负载器,其核心功能是将某个Service的访问转发到后端的多个Pod上。kube-proxy通过监听集群状态变更,并对本机ipvs做修改,从而实现网络路由。 而其中的负载均衡,也是通过ipvs的特性实现的。
从V1.8版本开始,用IPVS(IP Virtual Server)模式,用于路由规则的配置,主要优势是:1)为大型集群提供了更好的扩展性和性能。采用哈希表的数据结构,更高效;2)支持更复杂的负载均衡算法;3)支持服务器健康检查和连接重试 4)可以动态修改ipset的集合;

5、简述kube-proxy作用?
答:kube-proxy 运行在所有节点上,它监听 apiserver 中 service 和 endpoint 的变化情况,创建路由规则以提供服务 IP 和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上;

6、简述kube-proxy iptables原理?
答:Kubernetes从1.2版本开始,将iptables作为kube-proxy的默认模式。iptables模式下的kube-proxy不再起到Proxy的作用,其核心功能:通过API Server的Watch接口实时跟踪Service与Endpoint的变更信息,并更新对应的iptables规则,Client的请求流量则通过iptables的NAT机制“直接路由”到目标Pod;

7、简述kube-proxy ipvs原理?
答:IPVS在Kubernetes1.11中升级为GA稳定版。IPVS则专门用于高性能负载均衡,并使用更高效的数据结构(Hash表),允许几乎无限的规模扩张,因此被kube-proxy采纳为最新模式;
在IPVS模式下,使用iptables的扩展ipset,而不是直接调用iptables来生成规则链。iptables规则链是一个线性的数据结构,ipset则引入了带索引的数据结构,因此当规则很多时,也可以很高效地查找和匹配;可以将ipset简单理解为一个IP(段)的集合,这个集合的内容可以是IP地址、IP网段、端口等,iptables可以直接添加规则对这个“可变的集合”进行操作,这样做的好处在于可以大大减少iptables规则的数量,从而减少性能损耗;

8、简述kube-proxy ipvs和iptables的异同?
答:iptables是为防火墙而设计的;IPVS则专门用于高性能负载均衡,并使用更高效的数据结构(Hash表),允许几乎无限的规模扩张。与iptables相比,IPVS拥有以下明显优势:为大型集群提供了更好的可扩展性和性能;支持比iptables更复杂的负载均衡算法(最小负载、最少连接、加权等);支持服务器健康检查和连接重试等功能;可以动态修改ipset的集合,即使iptables的规则正在使用这个集合;
9.简述Kubernetes如何实现集群管理?
在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node。其中,在Master节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的;

10、简述Kubernetes的优势、适应场景及其特点?
优势:容器编排、轻量级、开源、弹性伸缩、负载均衡
场景:快速部署应用、快速扩展应用、无缝对接新的应用功能、节省资源,优化硬件资源的使用
特点:
可移植: 支持公有云、私有云、混合云、多重云(multi-cloud)、
可扩展: 模块化,、插件化、可挂载、可组合、
自动化: 自动部署、自动重启、自动复制、自动伸缩/扩展;

11、简述Kubernetes各组件模块如何与API Server通信?
答:K8s API Server作为集群的核心,负责集群各功能模块之间的通信。集群内的各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时,则通过API Server提供的REST接口(用GET、LIST或WATCH方法)来实现,从而实现各模块之间的信息交互。
1)kubelet进程与API Server的交互:每个Node上的kubelet每隔一个时间周期,就会调用一次API Server的REST接口报告自身状态,API Server在接收到这些信息后,会将节点状态信息更新到etcd中;
2)kube-controller-manager进程与API Server的交互:kube-controller-manager中的Node Controller模块通过API Server提供的Watch接口实时监控Node的信息,并做相应处理;
3)kube-scheduler进程与API Server的交互:Scheduler通过API Server的Watch接口监听到新建Pod副本的信息后,会检索所有符合该Pod要求的Node列表,开始执行Pod调度逻辑,在调度成功后将Pod绑定到目标节点上;

12、简述Kubernetes Scheduler作用及实现原理?
答:Scheduler是负责Pod调度的重要功能模块,负责接收Controller Manager创建的新Pod,为其调度至目标Node,调度完成后,目标Node上的kubelet服务进程接管后继工作,负责Pod接下来生命周期;Scheduler的作用是将待调度的Pod,按照特定的调度算法和调度策略绑定(Binding)到集群中某个合适的Node上,并将绑定信息写入etcd中;Scheduler通过调度算法调度为待调度Pod列表中的每个Pod从Node列表中选择一个最适合的Node来实现Pod的调度。随后,目标节点上的kubelet通过API Server监听到Kubernetes Scheduler产生的Pod绑定事件,然后获取对应的Pod清单,下载Image镜像并启动容器;

13、简述Kubernetes Scheduler使用哪两种算法将Pod绑定到worker节点?
1)预选(Predicates):输入是所有节点,输出是满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes。如果某节点的资源不足或者不满足预选策略的条件则无法通过预选;
2)优选(Priorities):输入是预选阶段筛选出的节点,优选会根据优先策略为通过预选的Nodes进行打分排名,选择得分最高的Node。例如,资源越富裕、负载越小的Node可能具有越高的排名;

14、简述Kubernetes kubelet的作用?
答:在Kubernetes集群中,在每个Node(又称Worker)上都会启动一个kubelet服务进程。该进程用于处理Master下发到本节点的任务,管理Pod及Pod中的容器。每个kubelet进程都会在API Server上注册节点自身的信息,定期向Master汇报节点资源的使用情况,并通过cAdvisor监控容器和节点资源;

15、简述Kubernetes kubelet监控Worker节点资源是使用什么组件来实现的?
答:kubelet使用cAdvisor对worker节点资源进行监控。在 Kubernetes 系统中,cAdvisor 已被默认集成到 kubelet 组件内,当 kubelet 服务启动时,它会自动启动 cAdvisor 服务,然后 cAdvisor 会实时采集所在节点的性能指标及在节点上运行的容器的性能指标;

16.pod是什么?
在k8s中,k8s并不直接处理容器,而是使用多个容器共存的理念,这组容器就叫做pod。
pod是k8s中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,其他的资源对象都是用来支撑pod对象功能的,比如,pod控制器就是用来管理pod对象的,service或者ingress资源对象是用来暴露pod引用对象的,persistentvolume资源是用来为pod提供存储等等,简而言之,k8s不会直接处理容器,而是pod,pod才是k8s中可以创建和管理的最小单元,也是基本单元。

17.pod的原理是什么?
在微服务的概念里,一般的一个容器会被设计为运行一个进程,除非进程本身产生子进程,由于不能将多个进程聚集在同一个单独的容器中,所以需要一种更高级的结构将容器绑定在一起,并将它们作为一个单元进行管理,这就是k8s中pod的原理。

18.pod有什么特点?
1、每个pod就像一个独立的逻辑机器,k8s会为每个pod分配一个集群内部唯一的IP地址,所以每个pod都拥有自己的IP地址、主机名、进程等;
2、一个pod可以包含1个或多个容器,1个容器一般被设计成只运行1个进程,1个pod只可能运行在单个节点上,即不可能1个pod跨节点运行,pod的生命周期是短暂,也就是说pod可能随时被消亡(如节点异常,pod异常等情况);
2、每一个pod都有一个特殊的被称为"根容器"的pause容器,也称info容器,pause容器对应的镜像属于k8s平台的一部分,除了pause容器,每个pod还包含一个或多个跑业务相关组件的应用容器;
3、一个pod中的容器共享network命名空间;
4、一个pod里的多个容器共享pod IP,这就意味着1个pod里面的多个容器的进程所占用的端口不能相同,否则在这个pod里面就会产生端口冲突;既然每个pod都有自己的IP和端口空间,那么对不同的两个pod来说就不可能存在端口冲突;
5、应该将应用程序组织到多个pod中,而每个pod只包含紧密相关的组件或进程;
6、pod是k8s中扩容、缩容的基本单位,也就是说k8s中扩容缩容是针对pod而言而非容器。

19.pause容器作用是什么?
每个pod里运行着一个特殊的被称之为pause的容器,也称根容器,而其他容器则称为业务容器;创建pause容器主要是为了为应用容器提供 Linux命名空间,共享基础:包括 pid、icp、net 等,以及启动 init 进程,并收割僵尸进程;这些业务容器共享pause容器的网络命名空间和volume挂载卷,当pod被创建时,pod首先会创建pause容器,从而把其他业务容器加入pause容器,从而让所有业务容器都在同一个命名空间中,这样就可以实现网络共享。pod还可以共享存储,在pod级别引入数据卷volume,业务容器都可以挂载这个数据卷从而实现持久化存储。

20.pod的重启策略有哪些? restartPolicyˈpɒləsi:重启策略
pod重启容器策略是指针对pod内所有容器的重启策略,不是重启pod,其可以通过restartPolicy 字段配置pod重启容器的策略,如下:
Always: 当容器终止退出后,总是重启容器,默认策略就是Always。
OnFailureˈfeɪljər: 当容器异常退出,退出状态码非0时,才重启容器。
Never: 当容器终止退出,不管退出状态码是什么,从不重启容器。

21.pod的镜像拉取策略有哪几种?
pod镜像拉取策略可以通过imagePullPolicypɒləsi 字段配置镜像拉取策略,主要有3中镜像拉取策略,如下:
IfNotPresent prez(ə)nt: 默认值,本地有则使用本地镜像,本地没有则从远程仓库拉取镜像。
Always: 总是重新拉取,即每次创建pod都会重新从镜像仓库拉取一次镜像。
Never: 只使用本地镜像,从不去远程仓库拉取,本地没有就报错。

22.pod的liveness probes prəʊbz存活探针有哪几种?
kubernetes可以通过存活探针检查容器是否还在运行,可以为pod中的每个容器单独定义存活探针,kubernetes将定期执行探针,如果探测失败,将杀死容器,并根据restartPolicy策略来决定是否重启容器,kubernetes提供了3种探测容器的存活探针,如下:
httpGet:调用容器内Web应用的URL,如果返回的状态码在200和400之间,则认为程序正常,否则不正常。
exec:在容器内执行shell命令,根据命令退出状态码是否为0判定成功失败。
TCPSocket:与容器的端口建立TCP Socket链接 如果能够建立这条连接,则认为程序正常,否则不正常。
存活探针的属性参数有哪几个?
存活探针的附加属性参数有以下几个:
initialDelaySeconds:表示在容器启动后延时多久秒才开始探测;
periodSeconds:表示执行探测的频率,即间隔多少秒探测一次,默认间隔周期是10秒,最小1秒;
timeoutSeconds:表示探测超时时间,默认1秒,最小1秒,表示容器必须在超时时间范围内做出响应,否则视为本次探测失败;
successThreshold:表示最少连续探测成功多少次才被认定为成功,默认是1,对于liveness必须是1,最小值是1;
failureThreshold:表示连续探测失败多少次才被认定为失败,默认是3,连续3次失败,k8s 将根据pod重启策略对容器做出决定;
注意:定义存活探针时,一定要设置initialDelaySeconds属性,该属性为初始延时,如果不设置,默认容器启动时探针就开始探测了,这样可能会存在
应用程序还未启动就绪,就会导致探针检测失败,k8s就会根据pod重启策略杀掉容器然后再重新创建容器的莫名其妙的问题。
在生产环境中,一定要定义一个存活探针。

23.pod的readiness redinəs probes就绪探针有哪几种?
我们知道,当一个pod启动后,就会立即加入service的endpointendˌpɔɪnt ip列表中,并开始接收到客户端的链接请求,假如此时pod中的容器的业务进程还没有初始化完毕,那么这些客户端链接请求就会失败,为了解决这个问题,kubernetes提供了就绪探针来解决这个问题的。
在pod中的容器定义一个就绪探针,就绪探针周期性检查容器,如果就绪探针检查失败了,说明该pod还未准备就绪,不能接受客户端链接,则该pod将从endpoint列表中移除,被剔除了service就不会把请求分发给该pod,然后就绪探针继续检查,如果随后容器就绪,则再重新把pod加回endpoint列表。k8s提供了3种就绪探针,如下:
exec:执行容器中的命令并检查命令退出的状态码,如果状态码为0则说明容器已经准备就绪;
httpGet:向容器发送http get请求,通过响应的http状态码判断容器是否准备就绪;
tcpSocke:打开一个tcp连接到容器的指定端口,如果连接已建立,则认为容器已经准备就绪。
就绪探针的属性参数有哪些?
就绪探针的附加属性参数有以下几个:
initialDelaySeconds:延时秒数,即容器启动多少秒后才开始探测,不写默认容器启动就探测;
periodSeconds :执行探测的频率(秒),默认为10秒,最低值为1;
timeoutSeconds :超时时间,表示探测时在超时时间内必须得到响应,负责视为本次探测失败,默认为1秒,最小值为1;
failureThreshold :连续探测失败的次数,视为本次探测失败,默认为3次,最小值为1次;
successThreshold :连续探测成功的次数,视为本次探测成功,默认为1次,最小值为1次;

24就绪探针与存活探针区别是什么?
两者作用不一样,存活探针是将检查失败的容器,创建新的启动容器来保持pod正常工作;
就绪探针是,当就绪探针检查失败,并不重启容器,而是将pod移出endpoint,就绪探针确保了service中的pod都是可用的,确保客户端只与正常的pod交互并且客户端永远不会知道系统存在问题。

25.简述Kubernetes Pod的常见调度方式?
1)Deployment或RC:该调度策略主要功能就是自动部署一个容器应用的多份副本,以及持续监控副本的数量,在集群内始终维持用户指定的副本数量
2)NodeSelector sɪˈlektər:定向调度,当需要手动指定将Pod调度到特定Node上,可以通过Node的标签(Label)和Pod的nodeSelector属性相匹配
3)NodeAffinity əˈfɪnəti 亲和性调度:亲和性调度机制极大的扩展了Pod的调度能力,目前有两种节点亲和力表达:硬规则,必须满足指定的规则,调度器才可以调度Pod至Node上(类似nodeSelector,语法不同);软规则,优先调度至满足的Node的节点,但不强求,多个优先级规则还可以设置权重值
4)Taints teɪnt和Tolerations tɒləˈreɪʃn(污点和容忍):Taint:使Node拒绝特定Pod运行;Toleration:为Pod的属性,表示Pod能容忍(运行)标注了Taint的Node;

26.简单讲一下 pod创建过程
1、用户通过kubectl或其他api客户端工具提交需要创建的pod信息给apiserver;
2、apiserver开始生成pod对象信息,并将信息存入etcd,然后返回确认信息给客户端;
3、apiserver开始反馈etcd中pod对象的变化,其他组件使用watch机制跟踪apiserver上的变动;
4、scheduler发现有新的pod对象要创建,开始调用内部算法机制为pod分配主机,并将结果信息更新至apiserver;
5、node节点上的kubelet发现有pod调度过来,尝试调用docker启动容器,并将结果反馈apiserver;
6、apiserver将收到的pod状态信息存入etcd中。

27.简单描述一下pod的终止过程
1、用户向apiserver发送删除pod对象的命令;
2、apiserver中的pod对象信息会随着时间的推移而更新,在宽限期内(默认30s),pod被视为dead ded ;
3、将pod标记为terminating ˈtɜːrməˌnet 停止状态 ;
4、kubelet在监控到pod对象为terminating状态了就会启动pod关闭过程;
5、端点控制器endpoint监控到pod对象的关闭行为时,将所有匹配到此端点的server资源从端点列表中删除;
6、如果当前pod对象定义了preStop钩子处理器,则在其被标记为terminating后会以同步的方式启动执行;
7、pod对象中的容器进程收到停止信息;
8、宽限期结束后,若pod中还存在运行的进程,那么pod对象会收到立即终止的信息;
9、kubelet请求apiserver将此pod资源的宽限期设置为0从而完成删除操作,此时pod对用户已不可见。

28.pod的生命周期有哪几种?
pod生命周期有的5种状态(也称5种相位),如下:
Pending(挂起):API server已经创建pod,但是该pod还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程;
Running(运行中):pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成;
Succeed səkˈsiːd (成功):Pod内所有容器均已退出,且不会再重启;
Failed feɪld (失败):Pod内所有容器均已退出,且至少有一个容器为退出失败状态
Unknown(未知):某于某种原因apiserver无法获取该pod的状态,可能由于网络通行问题导致;

29.pod的钩子函数有哪几种,作用是什么?
钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码
容器创建后钩子poststart:容器创建之后执行,如果失败了会重启容器
容器终止前钩子prestop :容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作

30.pod的初始化容器是干什么的?
init container,初始化容器用于在启动应用容器之前完成应用容器所需要的前置条件,初始化容器本质上和应用容器是一样的,但是初始化容器是仅允许一次就结束的任务,初始化容器具有两大特征:
1、初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成;
2、初始化容器必须按照定义的顺序执行,当且仅当前一个初始化容器成功之后,后面的一个初始化容器才能运行;

31、简述Kubernetes中什么是静态Pod?
答:静态pod是由kubelet进行管理的仅存在于特定Node的Pod上,他们不能通过API Server进行管理,无法与ReplicaSet、Deployment或者DaemonSet进行关联,并且kubelet无法对他们进行健康检查。静态Pod总是由kubelet进行创建,并且总是在kubelet所在的Node上运行;

32.pod的资源限制如何定义?
pod中,容器的程序要运行肯定是要占用一定资源的,比如CPU和内存等,如果不对某个容器的资源对限制,那么它就可能消耗大量资源,导致其他容器无法运行,针对这样情况,kubernetes提供了对内存和CPU资源进行配额的机制,这种机制主要通过配置pod中容器的resources rɪˈsɔːsɪz选项实现,resources提供了2个主要的参数,如下:
limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limit时就会被终止,进行重启;
requests rɪˈkwests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动;

33、简述Kubernetes Pod如何实现对节点的资源控制?
答:Kubernetes集群里的节点提供的资源主要是计算资源,计算资源是可计量的能被申请、分配和使用的基础资源。当前Kubernetes集群中的计算资源主要包括CPU、GPU及Memory meməri。CPU与Memory是被Pod使用的,因此在配置Pod时可以通过参数CPU Request及Memory Request为其中的每个容器指定所需使用的CPU与Memory量,Kubernetes会根据Request的值去查找有足够资源的Node来调度此Pod;

34、简述Kubernetes Requests和Limits如何影响Pod的调度?
答:当一个Pod创建成功时,Kubernetes调度器(Scheduler)会为该Pod选择一个节点来执行。对于每种计算资源(CPU和Memory)而言,每个节点都有一个能用于运行Pod的最大容量值。调度器在调度时,首先要确保调度后该节点上所有Pod的CPU和内存的Requests总和,不超过该节点能提供给Pod使用的CPU和Memory的最大容量值;

35、常用的标签分类有哪些?
答:release(版本):stable(稳定版)、canary(金丝雀版本)、beta(测试版本)、environment(环境变量):dev(开发)、qa(测试)、production(生产)、application(应用):ui、as(application software应用软件)、pc、sc、tier(架构层级):frontend(前端)、backend(后端)、cache(缓存)、partition(分区):customerA(客户A)、customerB(客户B)、track(品控级别):daily(每天)、weekly(每周);

36.标签及标签选择器是什么,如何使用?
标签是键值对类型,标签可以附加到任何资源对象上,主要用于管理对象,查询和筛选。标签常被用于标签选择器的匹配度检查,从而完成资源筛选;一个资源可以定义一个或多个标签在其上面。
标签选择器:标签要与标签选择器结合在一起,标签选择器允许我们选择标记有特定标签的资源对象子集,如pod,并对这些特定标签的pod进行查询,删除等操作。
标签和标签选择器最重要的使用之一在于,在deployment中,在pod模板中定义pod的标签,然后在deployment定义标签选择器,这样就通过标签选择器来选择哪些pod是受其控制的,service也是通过标签选择器来关联哪些pod 最后去服务后端pod。

37.标签与标签选择器的作用是什么?
标签:是当相同类型的资源对象越来越多的时候,为了更好的管理,可以按照标签将其分为一个组,为的是提升资源对象的管理效率;标签选择器:就是标签的查询过滤条件

38.deployment/rs的区别
deployment是rs的超集,提供更多的部署功能,如:回滚、暂停和重启、 版本记录、事件和状态查看、滚动升级和替换升级。如果能使用deployment,则不应再使用rs

39、简述Kubernetes deployment升级过程?
答:初始创建Deployment时,系统创建了一个ReplicaSet,并按用户的需求创建了对应数量的Pod副本;当更新Deployment时,系统创建了一个新的ReplicaSet,并将其副本数量扩展到1,然后将旧ReplicaSet缩减为2;之后,系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整;最后,新的ReplicaSet运行了对应个新版本Pod副本,旧的ReplicaSet副本数量则缩减为0;

40、简述Kubernetes deployment升级策略?
答:在Deployment的定义中,可以通过spec.strategy strætə dʒi 指定Pod更新的策略,目前支持两种策略:Recreate ˌriːkriˈeɪt (重建)和RollingUpdate(滚动更新),默认值为RollingUpdate;
Recreate:设置spec.strategy.type=Recreate,表示Deployment在更新Pod时,会先杀掉所有正在运行的Pod,然后创建新的Pod;
Rolling roʊlɪŋ Update:设置spec.strategy.type=RollingUpdate,表示Deployment会以滚动更新的方式来逐个更新Pod。同时,可以通过设置spec.strategy.rollingUpdate下的两个参数(maxUnavailable和maxSurge)来控制滚动更新的过程;

41、简述Kubernetes自动扩容机制? HPA
答:Kubernetes使用Horizontal Pod Autoscaler(HPA)的控制器实现基于CPU使用率进行自动Pod扩缩容的功能。HPA控制器周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整;

42.k8s集群外流量怎么访问Pod
可以通过Service的NodePort方式访问,会在所有节点监听同一个端口,比如:30000,访问节点的流量会被重定向到对应的Service上面.

43.service是如何与pod关联的?
是通过标签选择器,每一个由deployment创建的pod都带有标签,这样,service就可以定义标签选择器来关联哪些pod是作为其后端了,就是这样,service就与pod管联在一起了。

44.k8s发布(暴露)服务,servcie的类型有那些?
1)ClusterIP:这是k8s默认的ServiceType。通过集群内的ClusterIP在内部发布服务。
2)NodePort:这种方式是常用的,用来对集群外暴露Service,你可以通过访问集群内的每个NodeIP:NodePort的方式,访问到对应Service后端的Endpoint。
3)LoadBalancer: 这也是用来对集群外暴露服务的,不同的是这需要Cloud Provider prəˈ vaɪ dər 云公司商的支持,比如AWS等。
4)ExternalName:这个也是在集群内发布服务用的,需要借助KubeDNS(version >= 1.7)的支持,就是用KubeDNS将该service和ExternalName做一个Map,KubeDNS返回一个CNAME记录

45.kubernetes服务发现?
1)环境变量: 当你创建一个Pod的时候,kubelet会在该Pod中注入集群内所有Service的相关环境变量。需要注意: 要想一个Pod中注入某个Service的环境变量,则必须Service要先比该Pod创建
2)DNS:可以通过cluster add-on方式轻松的创建KubeDNS来对集群内的Service进行服务发现

46、简述Kubernetes Service分发后端的策略?
1)RoundRobin ˌraʊnd ˈrɒ bɪn:默认为轮询模式,即轮询将请求转发到后端的各个Pod上;
2)SessionAffinity əˈfɪnəti :基于客户端IP地址进行会话保持的模式,即第1次将某个客户端发起的请求转发到后端的某个Pod上,之后从相同的客户端发起的请求都将被转发到后端相同的Pod上;

47、简述Kubernetes HeadLiness Service?
在某些场景中,不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes提供了HeadLiness Service,这类Service不会分配Cluster IP,如果想要访问service,只能通过service的域名进行查询

48、简述Kubernetes外部如何访问集群内的服务?
映射Pod到物理机:将Pod端口号映射到宿主机,即在Pod中采用hostPort方式,以使客户端应用能够通过物理机访问容器应用
映射Service到物理机:将Service端口号映射到宿主机,即在Service中采用nodePort方式,以使客户端应用能够通过物理机访问容器应用
映射Service到LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置Service的场景;

49.DaemonSet资源对象的特性
DaemonSet这种资源对象会在每个k8s集群中的节点上运行,并且每个节点只能运行一个pod,这是它和deployment资源对象的最大也是唯一的区别
https://item.jd.com/10053560377078.html#crumb-wrap

50、说说你对Job这种资源对象的了解?
答:Job控制一组Pod容器,可以通过Job这种资源对象定义并启动一个批处理任务的Job,其中Job所控制的Pod副本是短暂运行的,可以将其视为一组Docker容器,每个Docker容器都仅仅运行一次,当Job控制的所有Pod的副本都运行结束时,对应的Job也就结来。Job生成的副本是不能自动重启的,对应的Pod副本的RestartPolicy都被设置为Never。Job所控制的Pod副本的工作模式能够多实例并行计算。

51.k8s数据持久化的方式有哪些
1)EmptyDir ˈemp ti (空目录):没有指定要挂载宿主机上的某个目录,直接由Pod内保部映射到宿主机上。emptyDir的数据持久化的生命周期和使用的pod一致。一般是作为临时存储使用。
2)Hostpath:将宿主机上已存在的目录或文件挂载到容器内部
3)PersistentVolume(简称PV):基于NFS服务的PV,也可以基于GFS的PV。它的作用是统一数据持久化目录,方便管理,PVC是向PV申请应用所需的容量大小,K8s集群中可能会有多个PV,PVC和PV若要关联,其定义的访问模式必须一致。

52、简述Kubernetes共享存储的作用?
答:Kubernetes对于有状态的容器应用或者对数据需要持久化的应用,需要更加可靠的存储来保存这些应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。因此需要使用共享存储;

53、简述Kubernetes PV和PVC?
答:PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”;PVC则是用户对存储资源的一个“申请”;

54、简述Kubernetes PV生命周期内的阶段?
1)Available əˈveɪləb(ə)l:可用状态,还未与某个PVC绑定;
2)Bound:已与某个PVC绑定
3)Released rɪˈliːst:绑定的PVC已经删除,资源已释放,但没有被集群回收;
4)Failed:自动资源回收失败;

55、简述Kubernetes Secret siːkrət 作用?
答:Secret对象,主要作用是保管私密数据,比如密码、OAuth Tokens、SSH Keys等信息。将这些私密信息放在Secret对象中比直接放在Pod或Docker Image中更安全,也更便于使用和分发;

55、简述Kubernetes Secret有哪些使用方式?
1)在创建Pod时,通过为Pod指定Service Account来自动使用该Secret;
2)通过挂载该Secret到Pod来使用它;
3)在Docker镜像下载时使用,通过指定Pod的spc.ImagePullSecrets来引用它;

56.kubelet 监控 Node 节点资源使用是通过什么组件来实现的
用me trɪ ks Metrics Server提供核心指标,包括Node、Pod的CPU和内存的使用。而Metrics Server需要采集node上的cAdvisor ədˈvaɪzər 提供的数据资源,当 kubelet 服务启动时,它会自动启动 cAdvisor 服务,然后 cAdvisor 会实时采集所在节点的性能指标及在节点上运行的容器的性能指标。kubelet 的启动参数 --cadvisor-port 可自定义 cAdvisor 对外提供服务的端口号,默认是 4194

57.简述ETCD及其特点?
1)完全复制:集群中的每个节点都可以使用完整的存档
2)高可用性:Etcd可用于避免硬件的单点故障或网络问题
3)一致性:每次读取都会返回跨多主机的最新写入
4)简单:包括一个定义良好、面向用户的API(gRPC)
5) 安全:实现了带有可选的客户端证书身份验证的自动化TLS;
6) 快速:每秒10000次写入的基准速度
7) 可靠:使用Raft算法实现了强一致、高可用的服务存储目录;

58.简述Kubernetes和Docker的关系?
Docker是开源的容器引擎,一种更加轻量级的虚拟化技术;K8s,容器管理工具,用来管理容器pod的集合,它可以实现容器集群的自动化部署、自动扩缩容、维护等功能.

59、简述Kubernetes ingress?
答:K8s的Ingress资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制。K8s使用了Ingress策略和Ingress Controller,两者结合并实现了一个完整的Ingress负载均衡器。使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,从而跳过kube-proxy的转发功能,kube-proxy不再起作用,全过程为:ingress controller + ingress 规则 ----> services;

60、简述Kubernetes的负载均衡器?
答:根据工作环境使用两种类型的负载均衡器,即内部负载均衡器或外部负载均衡器。内部负载均衡器自动平衡负载并使用所需配置分配容器,而外部负载均衡器将流量从外部负载引导至后端容器;

61、简述Kubernetes如何保证集群的安全性?
1)基础设施方面:保证容器与其所在宿主机的隔离;
2)用户权限:划分普通用户和管理员的角色;
3)API Server的认证授权:Kubernetes集群中所有资源的访问和变更都是通过Kubernetes API Server来实现的,因此需要建议采用更安全的HTTPS或Token来识别和认证客户端身份(Authentication),以及随后访问权限的授权(Authorization)环节;
4)API Server的授权管理:通过授权策略来决定一个API调用是否合法。对合法用户进行授权并且随后在用户访问时进行鉴权,建议采用更安全的RBAC方式来提升集群安全授权;
5)AdmissionControl(准入机制):对kubernetes api的请求过程中,顺序为:先经过认证 & 授权,然后执行准入操作,最后对目标对象进行操作;

62、简述Kubernetes准入机制?
答:在对集群进行请求时,每个准入控制代码都按照一定顺序执行。如果有一个准入控制拒绝了此次请求,那么整个请求的结果将会立即返回,并提示用户相应的error信息,准入控制(AdmissionControl)准入控制本质上为一段准入代码,在对kubernetes api的请求过程中,顺序为:先经过认证 & 授权,然后执行准入操作,最后对目标对象进行操作。常用组件(控制代码)如下:AlwaysAdmit:允许所有请求;AlwaysDeny:禁止所有请求,多用于测试环境;ServiceAccount:它将serviceAccounts实现了自动化,它会辅助serviceAccount做一些事情,比如如果pod没有serviceAccount属性,它会自动添加一个default,并确保pod的serviceAccount始终存在;LimitRanger:观察所有的请求,确保没有违反已经定义好的约束条件,这些条件定义在namespace中LimitRange对象中;NamespaceExists:观察所有的请求,如果请求尝试创建一个不存在的namespace,则这个请求被拒绝;

63、简述Kubernetes RBAC及其特点(优势)?
答:RBAC是基于角色的访问控制,是一种基于个人用户的角色来管理对计算机或网络资源的访问的方法,优势:1)对集群中的资源和非资源权限均有完整的覆盖;2)整个RBAC完全由几个API对象完成, 同其他API对象一样, 可以用kubectl或API进行操作;3)可以在运行时进行调整,无须重新启动API Server;

64、简述Kubernetes PodSecurityPolicy机制?
答:Kubernetes PodSecurityPolicy是为了更精细地控制Pod对资源的使用方式以及提升安全策略。在开启PodSecurityPolicy准入控制器后,Kubernetes默认不允许创建任何Pod,需要创建PodSecurityPolicy策略和相应的RBAC授权策略(Authorizing Policies),Pod才能创建成功;

65、简述Kubernetes PodSecurityPolicy机制能实现哪些安全策略?
答:1)特权模式:privileged是否允许Pod以特权模式运行;2)宿主机资源:控制Pod对宿主机资源的控制,如hostPID:是否允许Pod共享宿主机的进程空间;3)用户和组:设置运行容器的用户ID(范围)或组(范围);4)提升权限:AllowPrivilegeEscalation:设置容器内的子进程是否可以提升权限,通常在设置非root用户(MustRunAsNonRoot)时进行设置;5)SELinux:进行SELinux的相关配置;

66、简述Kubernetes网络模型?
答:Kubernetes网络模型中每个Pod都拥有一个独立的IP地址,不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问;同时为每个Pod都设置一个IP地址的模型使得同一个Pod内的不同容器会共享同一个网络命名空间,也就是同一个Linux网络协议栈。这就意味着同一个Pod内的容器可以通过localhost来连接对方的端口;在Kubernetes的集群里,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈;

67、简述Kubernetes CNI模型?
答:是对容器网络进行操作和配置的规范,通过插件的形式对CNI接口进行实现。CNI仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源。容器(Container):是拥有独立Linux网络命名空间的环境,例如使用Docker或rkt创建的容器。容器需要拥有自己的Linux网络命名空间,这是加入网络的必要条件;网络(Network):表示可以互连的一组实体,这些实体拥有各自独立、唯一的IP地址,可以是容器、物理机或者其他网络设备(比如路由器)等;

68、简述Kubernetes网络策略?
答:为实现细粒度的容器间网络访问隔离策略,K8s引入Network Policy主要功能是对Pod间的网络通信进行限制和准入控制,设置允许访问或禁止访问的客户端Pod列表。Network Policy定义网络策略,配合策略控制器(Policy Controller)进行策略的实现;

69、简述Kubernetes网络策略原理?
答:Network Policy的工作原理主要为:policy controller需要实现一个API Listener,监听用户设置的Network Policy定义,并将网络访问规则通过各Node的Agent进行实际设置(Agent则需要通过CNI网络插件实现);

70、简述Kubernetes Calico网络组件实现原理?
答:Calico是一个基于BGP的纯三层的网络方案,与OpenStack、Kubernetes、AWS、GCE等云平台都能够良好地集成,Calico在每个计算节点都利用Linux Kernel实现了一个高效的vRouter来负责数据转发。每个vRouter都通过BGP协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则;Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率;

71、简述Kubernetes CSI模型?
答:CSI是Kubernetes推出与容器对接的存储接口标准,存储提供方只需要基于标准接口进行存储插件的实现,就能使用Kubernetes的原生存储机制为容器提供存储服务,CSI使得存储提供方的代码能和Kubernetes代码彻底解耦,部署也与Kubernetes核心组件分离;CSI包括CSI Controller:的主要功能是提供存储服务视角对存储资源和存储卷进行管理和操作;Node的主要功能是对主机(Node)上的Volume进行管理和操作;

72、简述Kubernetes Worker节点加入集群的过程?
答:在该Node上安装Docker、kubelet和kube-proxy服务; 然后配置kubelet和kube-proxy的启动参数,将Master URL指定为当前Kubernetes集群Master的地址,最后启动这些服务; 通过kubelet默认的自动注册机制,新的Worker将会自动加入现有的Kubernetes集群中; Kubernetes Master在接受了新Worker的注册之后,会自动将其纳入当前集群的调度范围;

73、简述Kubernetes Metric Service?
答:在Kubernetes从1.10版本后采用Metrics ˈmetrɪks Server作为默认的性能数据采集和监控,主要用于提供核心指标(Core Metrics),包括Node、Pod的CPU和内存使用指标。对其他自定义指标(Custom Metrics)的监控则由Prometheus等组件来完成;

74、简述Kubernetes中,如何使用EFK实现日志的统一管理?
答:在Kubernetes集群环境中,通常一个完整的应用或服务涉及组件过多,建议对日志系统进行集中化管理,EFK是 Elasticsearch、Fluentd 和 Kibana 的组合,Elasticsearch:是一个搜索引擎,负责存储日志并提供查询接口;Fluentd:负责从 Kubernetes 搜集日志,每个node节点上面的fluentd监控并收集该节点上面的系统日志,并将处理过后的日志信息发送给Elasticsearch;Kibana:提供了一个 Web GUI,用户可以浏览和搜索存储在 Elasticsearch 中的日志;

75、简述Kubernetes如何进行优雅的节点关机维护?
答:由于Kubernetes节点运行大量Pod,因此在进行关机维护之前,建议先使用kubectl drain将该节点的Pod进行驱逐,然后进行关机维护;

76、简述Kubernetes集群联邦?
答:Kubernetes集群联邦可以将多个Kubernetes集群作为一个集群进行管理。因此,可以在一个数据中心/云中创建多个Kubernetes集群,并使用集群联邦在一个地方控制/管理所有集群;

77、简述Helm及其优势?
答:Helm 是 Kubernetes 的软件包管理工具,Helm能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。 Helm中通常每个包称为一个Chart,一个Chart是一个目录,优势:1)统一管理、配置和更新这些分散的 k8s 的应用资源文件;2)分发和复用一套应用模板;3)将应用的一系列资源当做一个软件包管理;4)对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库;5)对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序;

78、pod的共享资源?
1)PID 命名空间:Pod 中的不同应用程序可以看到其他应用程序的进程 ID;
2)网络命名空间:Pod 中的多个容器能够访问同一个IP和端口范围;3)
IPC 命名空间:Pod 中的多个容器能够使用 SystemV IPC 或 POSIX 消息队列进行通信;
4)UTS 命名空间:Pod 中的多个容器共享一个主机名;
5)Volumes(共享存储卷):Pod 中的各个容器可以访问在 Pod 级别定义的 Volumes;

79、Pod与Service的通信?
1)k8s在创建服务时为服务分配一个虚拟IP,客户端通过该IP访问服务,服务则负责将请求转发到后端Pod上;
2)Service是通过kube-proxy服务进程实现,该进程在每个Node上均运行可以看作一个透明代理兼负载均衡器;
3)对每个TCP类型Service,kube-proxy都会在本地Node上建立一个SocketServer来负责接受请求,然后均匀发送到后端Pod默认采用Round Robin负载均衡算法;
4)Service的Cluster IP与NodePort等概念是kube-proxy通过Iptables的NAT转换实现,kube-proxy进程动态创建与Service相关的Iptables规则;
5)kube-proxy通过查询和监听API Server中Service与Endpoints的变化来实现其主要功能,包括为新创建的Service打开一个本地代理对象,接收请求针对针对发生变化的Service列表,kube-proxy会逐个处理;

80、Kubernetes与Docker Swarm的区别如何?
答:1)安装和部署:k8s安装很复杂;但是一旦安装完毕,集群就非常强大,Docker Swarm安装非常简单;但是集群不是很强大;2)图形用户界面:k8s有,Docker Swarm无;3)可伸缩性:k8s支持,Docker Swarm比k8s快5倍;4)自动伸缩:k8s有,Docker Swarm无;5)负载均衡:k8s在不同的Pods中的不同容器之间平衡负载流量,需要手动干预,Docker Swarm可以自动平衡集群中容器之间的流量;6)滚动更新回滚:k8s支持,Docker Swarm可以部署滚动更新,但不能自动回滚;7)数据量:k8s可以共享存储卷。只能与其他集装箱在同一Pod,Docker Swarm可以与任何其他容器共享存储卷;8)日志记录和监控:k8s内置的日志和监控工具,Docker Swarm要用第三方工具进行日志记录和监控;

81、什么是Container Orchestration?
1)资源编排 - 负责资源的分配,如限制 namespace 的可用资源,scheduler 针对资源的不同调度策略;
2)工作负载编排 - 负责在资源之间共享工作负载,如 Kubernetes 通过不同的 controller 将 Pod 调度到合适的 node 上,并且负责管理它们的生命周期;3)服务编排 - 负责服务发现和高可用等,如 Kubernetes 中可用通过 Service 来对内暴露服务,通过 Ingress 来对外暴露服务;容器编排常用的控制器有:Deployment 经常被作为无状态实例控制器使用; StatefulSet 是一个有状态实例控制器; DaemonSet 可以指定在选定的 Node 上跑,每个 Node 上会跑一个副本,它有一个特点是它的 Pod 的调度不经过调度器,在 Pod 创建的时候就直接绑定 NodeName;最后一个是定时任务,它是一个上级控制器,和 Deployment 有些类似,当一个定时任务触发的时候,它会去创建一个 Job ,具体的任务实际上是由 Job 来负责执行的;

82、什么是Heapster?
答:Heapster 是 K8s 原生的集群监控方案。Heapster 以 Pod 的形式运行,它会自动发现集群节点、从节点上的 Kubelet 获取监控数据。Kubelet 则是从节点上的 cAdvisor 收集数据;

83、你能简要介绍一下Kubernetes控制管理器吗?
答:是集群内部的控制中心,负责node,pod,namespace等管理,负责管理各种控制器,每个控制器通过api server监控资源对象状态,将现有状态修正到期望状态;

86、你对Kubernetes的负载均衡器有什么了解?
1)内部负载均衡器: 自动平衡负载并使用所需配置分配容器;
2)外部负载均衡器: 将流量从外部负载引导至后端容器;

85、使用Kubernetes时可以采取哪些最佳安全措施?
1)确保容器本身安全;
2)锁定容器的Linux内核;
3)使用基于角色的访问控制(RBAC);
4)保守秘密的辛勤工作;
5)保持网络安全;

0

评论区