kubernetes面试题

前言

下面是 16Kubernetes 面试题。非标准答案,如有错误地方请指出。目的是帮助大家温习K8S。

题目 与 非标准答案

一、k8s集群规模,使用的版本及部署方式,master节点跑了什么组件,每个组件作用?

k8s集群规模:个人推荐 K8S 集群规模不要超过千台节点

k8s使用版本:比最新版本低一个版本(例:目前最新是1.17版本,生产推荐使用 1.16版本)

k8s部署方式:个人推荐使用 kubeadm二进制 部署

K8S Master 节点一般跑了: ETCDApiServerController ManagerScheduler

ETCD 分布式的K-V存储系统
  • http sever:(在etcd3里面变成了grpc server),主要处理client的操作请求以及节点间的数据同步和心跳保持
  • raft状态机:通过对raft一致性协议的实现来保证etcd集群的高可用性
  • store:负责etcd中事务操作的逻辑,是api server的命令的具体实现
  • wal存储:负责具体的数据持久存储操作。它分为两部分,entry 负责实际的日志数据存储(在etcd里数据的存储都是带版本号的,对于同一个键值可能会有多个版本的记录存在,所以数据实际的存储方式即通过事务日志进行存储,而在内存里则存有键和版本号的映射关系以方便查询)。snapshot 则是对日志数据的的状态存储以防止过多的数据存在。
API Server

ApiServer:对外提供增删查改etcd中资源配置数据,worker节点kubeletmaster节点的API Server进行交互,
Master节点的schedulercontroller manager组件也需要同API Server进行交互以获取和修改对应资源的状态。

ApiServer 三层认证

kubernetes 认证

kubernetes认证:kubernetes 提供了多种认证方式,比如客户端证书静态token静态密码文件ServiceAccountTokens等等。你可以同时使用一种或多种认证方式。只要通过任何一个都被认作是认证通过。下面我们就认识几个常见的认证方式。

  • 客户端证书认证:客户端证书认证叫作TLS双向认证,也就是服务器客户端互相验证证书的正确性,在都正确的情况下协调通信加密方案。为了使用这个方案,api-server 需要用 –client-ca-file 选项来开启。
  • 静态Token:当我们有非常多的node节点时,手动为每个node节点配置TLS认证比较麻烦,这时就可以用到引导token的认证方式,前提是需要在api-server开启 experimental-bootstrap-token-auth 特性,客户端的token信息与预先定义的token匹配认证通过后,自动为node颁发证书。当然引导token是一种机制,可以用到各种场景中。
  • Service Account Tokens 认证:有些情况下,我们希望在pod内部访问api-server,获取集群的信息,甚至对集群进行改动。针对这种情况,kubernetes提供了一种特殊的认证方式:Service Account。 Service Account 和 pod、service、deployment 一样是 kubernetes 集群中的一种资源,用户也可以创建自己的 Service Account。
    ServiceAccount 主要包含了三个内容:namespace、Token 和 CA。namespace 指定了 pod 所在的 namespace,CA 用于验证 apiserver 的证书,token 用作身份验证。它们都通过 mount 的方式保存在 pod 的文件系统中。
kubernetes 授权

Kubernetes1.6 版本中新增角色访问控制机制(Role-Based Access,RBAC)让集群管理员可以针对特定使用者或服务账号的角色,进行更精确的资源访问控制。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。

目前 Kubernetes 中有一系列的鉴权机制,因为Kubernetes社区的投入和偏好,相对于其它鉴权机制而言,RBAC是更好的选择。

kubernetes 准入控制

准入控制(AdmissionControl)准入控制本质上为一段准入代码,在对kubernetes api的请求过程中,顺序为:先经过认证 & 授权,然后执行准入操作,最后对目标对象进行操作。这个准入代码在api-server中,而且必须被编译到二进制文件中才能被执行。

在对集群进行请求时,每个准入控制代码都按照一定顺序执行。如果有一个准入控制拒绝了此次请求,那么整个请求的结果将会立即返回,并提示用户相应的error信息。
常用组件(控制代码)如下:

  • AlwaysAdmit:允许所有请求
  • AlwaysDeny:禁止所有请求,多用于测试环境
  • ServiceAccount:它将serviceAccounts实现了自动化,它会辅助serviceAccount做一些事情,比如如果pod没有serviceAccount属性,它会自动添加一个default,并确保pod的serviceAccount始终存在
  • LimitRanger:他会观察所有的请求,确保没有违反已经定义好的约束条件,这些条件定义在namespace中LimitRange对象中。如果在kubernetes中使用LimitRange对象,则必须使用这个插件。
  • NamespaceExists:它会观察所有的请求,如果请求尝试创建一个不存在的namespace,则这个请求被拒绝。
Controller Manager

Controller Manager:以守护进程的形式运行着kubernetes几个核心的控制循环(也就是控制器),包括deployment,replicaset,namespace,serviceaccount,node等等,通过调用Api Server 的 list watch接口来监控自己负责的资源的配置变化.

Scheduler

Scheduler:是一个策略丰富、拓扑感知、工作负载特定的功能,调度器显著影响可用性、性能和容量。调度器需要考虑个人和集体的资源要求、服务质量要求、硬件/软件/政策约束、亲和力和反亲和力规范、数据局部性、负载间干扰、完成期限等。

kube-scheduler 给一个 pod 做调度选择包含两个步骤:

  • 过滤:过滤阶段会将所有满足 Pod 调度需求的 Node 选出来。例如,PodFitsResources 过滤函数会检查候选 Node 的可用资源能否满足 Pod 的资源请求。在过滤之后,得出一个 Node 列表,里面包含了所有可调度节点;通常情况下,这个 Node 列表包含不止一个 Node。如果这个列表是空的,代表这个 Pod 不可调度。
  • 打分:打分阶段,调度器会为 Pod 从所有可调度节点中选取一个最合适的 Node。根据当前启用的打分规则,调度器会给每一个可调度节点进行打分。最后,kube-scheduler 会将 Pod 调度到得分最高的 Node 上。如果存在多个得分最高的 Node,kube-scheduler 会从中随机选取一个。

二、kube-scheduler工作原理,多少节点对外提供服务

根据各种调度算法将 Pod 绑定到最合适的工作节点

  • 预选(Predicates):输入是所有节点,输出是满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes。例如,如果某节点的资源不足或者不满足预选策略的条件如“Node的label必须与Pod的Selector一致”时则无法通过预选。

  • 优选(Priorities):输入是预选阶段筛选出的节点,优选会根据优先策略为通过预选的Nodes进行打分排名,选择得分最高的Node。例如,资源越富裕、负载越小的Node可能具有越高的排名。

三、apiserver工作原理,多少节点对外提供服务,负载均衡高可用如何实现

apiserver 工作原理图

在这里插入图片描述

一般规模小的集群,3 台 apiserver 已经够用,如果集群规则大,apiserver 和 ECT 节点都需要扩容。

apiserver 负载均衡:apiserver 服务是一个无状态服务,可以使用 Nginx + KeepalivedHAProxy + Keepalived和 云厂商LB(比如:阿里云SLB)。

四、controller-manager 和etcd 通信吗?

不通信

原因:controller-managerscheduler 它们都是和 kube-apiserver通信,然后 kube-apiserver 再和etcd通信。

五、headless-service使用场景

  • 自主选择权 client可以自主选择哪个server
  • Headless Service 的对应的每一个 Endpoints,即每一个Pod,都会有对应的DNS域名,这样Pod之间就可以互相访问。

六、集群使用的网络方案,pod如何和node网络通信的

Flannel:使用vxlan技术为各节点创建一个可以互通的Pod网络,使用的端口为UDP 8472(需要开放该端口,如公有云AWS等)。flanneld第一次启动时,从etcd获取配置的Pod网段信息,为本节点分配一个未使用的地址段,然后创建flannedl.1网络接口(也可能是其它名称,如flannel1等)。flannel将分配给自己的Pod网段信息写入 /run/flannel/subnet.env 文件,docker后续使用这个文件中的环境变量设置docker0网桥,从而从这个地址段为本节点的所有Pod容器分配IP。

Calico:在宿主机部署calico作为虚拟路由器,容器流量通过veth pair到达宿主机的网络命名空间上。

七、etcd高可用及备份恢复方案

etcd高可用:部署ETCD时,在配置文件中配置 ETCD_INITIAL_CLUSTER=“etcd节点ip:端口,etcd节点ip:端口,etcd节点ip:端口”,集群数量最好是奇数

备份命令

$ ETCDCTL_API=3 etcdctl \
--cacert="${CACERT}" --cert="${CERT}" --key="${EKY}" \
--endpoints=${ENDPOINTS} \
snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db

具体备份与恢复:参考 Etcd v3备份与恢复

八、k8s集群节点需要关机维护,需要怎么操作

# 驱逐 node 节点上 pod
$ kubectl drain k8s-node-01 --force --ignore-daemonsets

# 关机
$ init 0

九、使用什么pod控制器,crd都需要定义什么,存活性监测和就绪性监测的实现方式

Pod控制器:Deployment,ReplicationController,StatefulSet,DaemonSet,Cronjob,Job

CRD定义:在 Kubernetes 中一切都可视为资源,Kubernetes 1.7 之后增加了对 CRD 自定义资源二次开发能力来扩展 Kubernetes API,通过 CRD 我们可以向 Kubernetes API 中增加新资源类型,而不需要修改 Kubernetes 源码来创建自定义的 API server,该功能大大提高了 Kubernetes 的扩展能力。当你创建一个新的CustomResourceDefinition (CRD)时,Kubernetes API服务器将为你指定的每个版本创建一个新的RESTful资源路径,我们可以根据该api路径来创建一些我们自己定义的类型资源。CRD可以是命名空间的,也可以是集群范围的,由CRD的作用域(scpoe)字段中所指定的,与现有的内置对象一样,删除名称空间将删除该名称空间中的所有自定义对象。customresourcedefinition本身没有名称空间,所有名称空间都可以使用。

存活性监测和就绪性监测的实现方式:readiness probe,liveness probe:HTTP请求,TCP连接,命令行

十、pod如何平滑升级

minReadySeconds: 5
strategy:
  # indicate which strategy we want for rolling update
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 30%
    maxUnavailable: 30%

十一、k8s内核及文件系统需要哪些设置

开启网桥模式、禁止使用swap空间 只有当系统OOM时才允许使用它、开启OOM、不检查物理内存是否够用、关闭ipv6(防止触发docker BUG)、设置系统时区、设置Hostname、tcp_tw_recycle关闭、与k8s的NAT冲突、升级系统内核 4.4+

十二、存储卷使用方式

  • 动态存储使用 storageclass
  • 静态存储使用 persistentvolume

十三、对外提供服务的pod暴露方式有哪些

  • hostNetwork:在pod中使用该配置,在这种Pod中运行的应用程序可以直接看到pod启动的主机的网络接口
  • hostPort:直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过主机的IP来访问Pod
  • NodePort:是K8s里一个广泛应用的服务暴露方式。K8s中的service默认情况都是使用Cluster IP这种类型,会产生一个只能在内部访问的Cluster IP,如果想能够直接访问service,需要将service type修改为nodePort。同时给改service指定一个nodeport值(30000-32767),用 --service-node-port-range 定义。
  • LoadBalancer:只能在service上定义,是公有云提供的负载均衡器
  • Ingress:ingress controller是由K8s管理的负载均衡容器,它的镜像包含一个nginx或HAProxy负载均衡器和一个控制器守护进程。

十四、traefik的实现原理

Traefik 作为一种边缘路由器,动态感知后端服务实例变化,进行动态调整转发配置,会与ApiServer进行交互,发现k8s集群内部容器状态变化。

十五、生产中碰到过什么问题,故障排查思路,如何解决的

故障排查,参考下面几篇文章:

十六、容器日志收集方案,都收集了什么类型日志,实现方式,filebeat和logstash区别,grafana绘图

一般使用EFK方式收集日志;logstash是jvm跑的,资源消耗比较大,filebeat更轻量级,但logstash有filter功能
一般结构都是filebeat采集日志,然后发送到消息队列,redis,kafaka。然后logstash去获取,利用filter功能过滤分析,然后存储到elasticsearch中。

grafana绘图:省略。。。

参考链接

  • https://kubernetes.io/zh/docs/reference/access-authn-authz/controlling-access/
  • https://www.kubernetes.org.cn/3789.html
  • https://blog.youkuaiyun.com/huwh_/article/details/75675706

🔥运维干货分享

Kubernetes是一个用于自动化容器化应用程序部署、扩展和管理的开源平台。它提供了一种可靠的方式来管理和编排容器,以便应用程序在集群中运行。[16] Kubernetes不是一个特定的技术或工具,而是一个完整的容器管理解决方案。它提供了许多功能,包括自动化部署和扩展、容器编排、服务发现和负载均衡、容器健康检查、故障恢复和自动化滚动更新等。[17] Kubernetes使用Deployment来定义和管理Pod的副本数量。Deployment可以指定应该在集群中运行多少个Pod的精确副本数量,这称为replication。它提供了滚动更新的功能,以便在不影响应用的情况下进行版本升级。 Kubernetes中的镜像下载策略是根据镜像是否已经在节点上存在来决定是否下载。如果镜像已经在节点上存在,则不会进行下载,直接使用已有的镜像。如果镜像不存在,则会根据配置的策略进行下载,常见的策略有Always、IfNotPresent和Never。 删除一个Pod会导致Kubernetes自动重新调度一个新的Pod来替代被删除的Pod。Kubernetes会根据定义的副本数量和调度策略来选择一个合适的节点,并在该节点上启动一个新的Pod。 Kubernetes Scheduler是负责将Pod绑定到Worker节点的组件。它根据定义的调度策略和节点资源的可用性来选择合适的节点。调度的过程是基于节点的资源需求和Pod的约束条件,并使用一些调度算法,如最佳适应和最差适应算法。 对于Pod的健康监测,Kubernetes提供了两种机制。一种是通过容器的探针来监测容器的健康状态,包括存活探针和就绪探针。另一种是通过使用kubelet组件来监测容器的运行状态,并将状态报告给Kubernetes控制平面。 Kubernetes使用两种算法来将Pod绑定到Worker节点:最佳适应算法和最差适应算法。最佳适应算法将Pod绑定到能够满足其资源需求的节点上,而最差适应算法将Pod绑定到资源最不充足的节点上,以便更好地利用资源。[15] 创建一个Pod的流程包括定义Pod的配置文件,使用kubectl命令将配置文件提交给Kubernetes API服务器,API服务器接收到请求后将Pod的配置信息存储到etcd中,然后调度器根据调度策略选择一个合适的节点,并在该节点上创建和启动Pod。[19] Kubernetes通过使用命名空间来隔离资源。每个命名空间都是一个独立的资源容器,拥有自己的Pod、服务、配置等资源。命名空间可以帮助用户将不同的应用程序或环境进行隔离,从而提高安全性和管理灵活性。[20] Kubernetes中的常用标签分类包括应用程序、环境、版本等。通过使用标签,可以根据需要对Pod、服务等资源进行分类和管理,实现更好的资源管理和组织。[21] 容器和主机部署应用的区别在于容器部署应用是将应用程序打包成容器镜像,并在Kubernetes集群中运行,而主机部署应用是直接在主机上安装和运行应用程序。容器部署提供了更好的隔离性、可移植性和扩展性,使应用程序更易于管理和部署。[22] Kubernetes Deployment的升级过程包括创建新的Pod副本、逐步将流量转移到新的Pod副本上、停止旧的Pod副本。这个过程可以保证应用程序在升级过程中的高可用性和零停机时间。[23] Kubernetes中的Metric Service可以用于收集和存储集群中的度量数据,如CPU使用率、内存使用率等。这些度量数据可以用于监控和调优集群的性能和资源利用情况。[24] Kubernetes中的RBAC(Role-Based Access Control)是一种访问控制机制,它基于角色和权限来管理用户对集群资源的访问。RBAC提供了更细粒度的权限控制和安全性,可以帮助管理员更好地管理和控制集群中的资源访问。[25] Kube-proxy在Kubernetes中的作用是提供网络代理和负载均衡的功能。它负责将集群内部的服务暴露给外部网络,并根据定义的服务规则将请求转发到相应的后端Pod。 以上是关于Kubernetes面试题的解答。希望对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [最新 2022 年 Kubernetes 面试题高级面试题及附答案解析](https://blog.youkuaiyun.com/afreon/article/details/122782334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字劳动力

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值