K8S常见的⾯试题
kubernetes⾯试题汇总
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⽂件语法如下:
spec:
containers:
- name: liveness
image: io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: #选择livenessProbe的探测机制
exec: #执⾏以下命令
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #在容器运⾏五秒后开始探测
periodSeconds: 5 #每次探测的时间间隔为5秒
在上⾯的配置⽂件中,探测机制为在容器运⾏5秒后,每隔五秒探测⼀次,如果cat命令返回的值为“0”,则表⽰健康,如果为⾮0,则表⽰异常。
手机unknown是什么意思
2)Httpget:通过发送http/htps请求检查服务是否正常,返回的状态码为200-399则表⽰容器健康(注http get类似于命令curl -I)。
Httpget探测⽅式的yaml⽂件语法如下:
spec:
containers:
- name: liveness
image: io/liveness
livenessProbe: #采⽤livenessProbe机制探测
httpGet: #采⽤httpget的⽅式
scheme:HTTP #指定协议,也⽀持https
path: /healthz #检测是否可以访问到⽹页根⽬录下的healthz⽹页⽂件
port: 8080 #监听端⼝是8080
initialDelaySeconds: 3 #容器运⾏3秒后开始探测
periodSeconds: 3 #探测频率为3秒
上述配置⽂件中,探测⽅式为项容器发送HTTP GET请求,请求的是8080端⼝下的healthz⽂件,返回任何⼤于或等于200且⼩于400的状态码表⽰成功。任何其他代码表⽰异常。
3)tcpSocket:通过容器的IP和Port执⾏TCP检查,如果能够建⽴TCP连接,则表明容器健康,这种⽅式与HTTPget的探测机制有些类似,tcpsocket健康检查适⽤于TCP业务。
tcpSocket探测⽅式的yaml⽂件语法如下:
spec:
containers:
- name: goproxy
image: io/goproxy:0.1
ports:
- containerPort: 8080
#这⾥两种探测机制都⽤上了,都是为了和容器的8080端⼝建⽴TCP连接
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
在上述的yaml配置⽂件中,两类探针都使⽤了,在容器启动5秒后,kubelet将发送第⼀个readinessProbe探针,这将连接容器的8080端⼝,如果探测成功,则该pod为健康,⼗秒后,kubelet将进⾏第⼆次连接。
除了readinessProbe探针外,在容器启动15秒后,kubelet将发送第⼀个livenessProbe探针,仍然尝试连接容器的8080端⼝,如果连接失败,则重启容器。
探针探测的结果⽆外乎以下三者之⼀:
Success:Container通过了检查;
Failure:Container没有通过检查;
Unknown:没有执⾏检查,因此不采取任何措施(通常是我们没有定义探针检测,默认为成功)。
若觉得上⾯还不够透彻,可以移步其官⽹⽂档:kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
5、如何控制滚动更新过程?
答:可以通过下⾯的命令查看到更新时可以控制的参数:
[root@master yaml]# kubectl explain deploy.llingUpdate
maxSurge :此参数控制滚动更新过程,副本总数超过预期pod数量的上限。可以是百分⽐,也可以是具体的值。默认为1。
(上述参数的作⽤就是在更新过程中,值若为3,那么不管三七⼆⼀,先运⾏三个pod,⽤于替换旧的pod,以此类推)
maxUnavailable:此参数控制滚动更新过程中,不可⽤的Pod的数量。 (这个值和上⾯的值没有任何
关系,举个例⼦:我有⼗个pod,但是在更新的过程中,我允许这⼗个pod中最多有三个不可⽤,那么就将这个参数的值设置为3,在更新的过程中,只要不可⽤的pod数量⼩于或等于3,那么更新过程就不会停⽌)。
6、K8s中镜像的下载策略是什么?
答:可通过命令“kubectl explain ainers”来查看imagePullPolicy这⾏的解释。
K8s的镜像下载策略有三种:Always、Never、IFNotPresent;
Always:镜像标签为latest时,总是从指定的仓库中获取镜像;
Never:禁⽌从仓库中下载镜像,也就是说只能使⽤本地镜像;
IfNotPresent:仅当本地没有对应镜像时,才从⽬标仓库中下载。
默认的镜像下载策略是:当镜像标签是latest时,默认策略是Always;当镜像标签是⾃定义时(也就是标签不是latest),那么默认策略是IfNotPresent。
7、 image的状态有哪些?
Running:Pod所需的容器已经被成功调度到某个节点,且已经成功运⾏,
Pending:APIserver创建了pod资源对象,并且已经存⼊etcd中,但它尚未被调度完成或者仍然处于仓库中下载镜像的过程
Unknown:APIserver⽆法正常获取到pod对象的状态,通常是其⽆法与所在⼯作节点的kubelet通信所致。
8、 pod的重启策略是什么?
答:可以通过命令“kubectl explain pod.spec”查看pod的重启策略。(restartPolicy字段)
Always:但凡pod对象终⽌就重启,此为默认策略。
OnFailure:仅在pod对象出现错误时才重启
9、 Service这种资源对象的作⽤是什么?
答:⽤来给相同的多个pod对象提供⼀个固定的统⼀访问接⼝,常⽤于服务发现和服务访问。
10、版本回滚相关的命令?
[root@master httpd-web]# kubectl apply -f httpd2-deploy1.yaml --record
#运⾏yaml⽂件,并记录版本信息;
[root@master httpd-web]# kubectl rollout history deployment httpd-devploy1
#查看该deployment的历史版本
[root@master httpd-web]# kubectl rollout undo deployment httpd-devploy1 --to-revision=1
#执⾏回滚操作,指定回滚到版本1
#在yaml⽂件的spec字段中,可以写以下选项(⽤于限制最多记录多少个历史版本):
spec:
revisionHistoryLimit: 5
#这个字段通过 kubectl explain deploy.spec 命令到revisionHistoryLimit <integer>⾏获得
11、标签与标签选择器的作⽤是什么?
标签:是当相同类型的资源对象越来越多的时候,为了更好的管理,可以按照标签将其分为⼀个组,为的是提升资源对象的管理效率。
标签选择器:就是标签的查询过滤条件。⽬前API⽀持两种标签选择器:
基于等值关系的,如:“=”、“”“==”、“!=”(注:“==”也是等于的意思,yaml⽂件中的matchLabels字段);
基于集合的,如:in、notin、exists(yaml⽂件中的matchExpressions字段);
注:in:在这个集合中;notin:不在这个集合中;exists:要么全在(exists)这个集合中,要么都不在(notexists);
使⽤标签选择器的操作逻辑:
在使⽤基于集合的标签选择器同时指定多个选择器之间的逻辑关系为“与”操作(⽐如:- {key: name,operator: In,values: [zhangsan,lisi]} ,那么只要拥有这两个值的资源,都会被选中);
使⽤空值的标签选择器,意味着每个资源对象都被选中(如:标签选择器的键是“A”,两个资源对象同时拥有A这个键,但是值不⼀样,这种情况下,如果使⽤空值的标签选择器,那么将同时选中这两个资源对象)
空的标签选择器(注意不是上⾯说的空值,⽽是空的,都没有定义键的名称),将⽆法选择出任何资源;
在基于集合的选择器中,使⽤“In”或者“Notin”操作时,其values可以为空,但是如果为空,这个标签选择器,就没有任何意义了。
两种标签选择器类型(基于等值、基于集合的书写⽅法):
selector:
matchLabels: #基于等值
app: nginx
matchExpressions: #基于集合
- {key: name,operator: In,values: [zhangsan,lisi]} #key、operator、values这三个字段是固定的
- {key: age,operator: Exists,values:} #如果指定为exists,那么values的值⼀定要为空
12、常⽤的标签分类有哪些?
标签分类是可以⾃定义的,但是为了能使他⼈可以达到⼀⽬了然的效果,⼀般会使⽤以下⼀些分类:
版本类标签(release):stable(稳定版)、canary(⾦丝雀版本,可以将其称之为测试版中的测试版)、beta(测试版);
环境类标签(environment):dev(开发)、qa(测试)、production(⽣产)、op(运维);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。