k8s 面试题汇总

一、基础

1、k8s的部署方式有那几种?

答:二进制、kubeadmin,kubesphere,开发环境和生产环境部署有什么不同?要注意什么?

2、k8s核心组件有哪些?之间是怎么通信的?master和worker怎么收集信息的?

master: apiServer, scheduler, ControllerManager
worker: kubelet,kubeprox
etcd

示例:

[root@master-165 ~]# kubectl get pods -n kube-system -o wide
NAME                                                              READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
calico-kube-controllers-57c7b58f66-l5jzs                          1/1     Running   0          63d   10.244.69.131   master-165   <none>           <none>
calico-node-l9j65                                                 1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
calico-node-rlkp8                                                 1/1     Running   1          63d   172.26.40.167   bide-167     <none>           <none>
calico-node-wsspg                                                 1/1     Running   1          63d   172.26.40.166   node-166     <none>           <none>
coredns-74ff55c5b-2d4vw                                           1/1     Running   0          63d   10.244.69.129   master-165   <none>           <none>
coredns-74ff55c5b-j5stt                                           1/1     Running   0          63d   10.244.69.130   master-165   <none>           <none>
etcd-master-165                                                   1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
kube-apiserver-master-165                                         1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
kube-controller-manager-master-165                                1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
kube-proxy-bpjhc                                                  1/1     Running   1          63d   172.26.40.166   node-166     <none>           <none>
kube-proxy-cpgnl                                                  1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
kube-proxy-st2jv                                                  1/1     Running   1          63d   172.26.40.167   bide-167     <none>           <none>
kube-scheduler-master-165                                         1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
nfs-subdir-external-nfs-subdir-external-provisioner-55ff98kzk2p   1/1     Running   1          63d   10.244.27.27    bide-167     <none>           <none>
[root@master-165 ~]# 

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


# 查看 proxy
[root@master-165 ~]# kubectl get pods -n kube-system -o wide | grep proxy
kube-proxy-bpjhc                                                  1/1     Running   1          63d   172.26.40.166   node-166     <none>           <none>
kube-proxy-cpgnl                                                  1/1     Running   0          63d   172.26.40.165   master-165   <none>           <none>
kube-proxy-st2jv                                                  1/1     Running   1          63d   172.26.40.167   bide-167     <none>           <none>

题2.2:Kube-apiserver 和 Kube-scheduler 的作用是什么?

Kube-apiserver 遵循横向扩展架构,是主节点控制面板的前端。这将公开 Kubernetes 主节点组件的所有 API,并负责在 Kubernetes 节点和 Kubernetes 主组件之间建立通信

「 Kubernetes API Server的核心功能是提供了Kubernetes各类资源对象(如Pod,RC, Service等)的增、删、改、查及Watch等HTTP Rest接口,接受外部请求,并将信息写到ETCD中,成为集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。除此之外,它还有以下一些功能特性。」

  • (1)是集群管理的API入口。
  • (2)是资源配额控制的入口。
  • (3)提供了完备的集群安全机制。

「Kubernetes API Server通过一个名为kube-apiserver的进程提供服务,该进程运行在Master节点上,如果小伙伴使用二进制方式安装k8s,会发现,kube-apiserver是docker之后第一个要启动的服务」

旧版本中kube-apiserver进程在本机的8080端口(对应参数-insecure-port)提供REST服务。

新版本中启动HTTPS安全端口(--secure-port=6443)来启动安全机制,加强REST API访问的安全性。这里需要说明的是,好像是从1.20开始就不支持了,在apiserver配置文件里添加 --insecure-port=8080会导致启动不了,所以不在支持直接http的方式访问(可以用代理)

在高版本的环境中,有时候环境起不来,会报错说6443端口没有开放,我们需要确认kube-apiserver服务是否启动成功

通常我们可以通过命令行工具kubectl来与Kubernetes API Server交互,它们之间的接口是REST调用。

kube-scheduler 负责工作节点上工作负载的分配和管理。因此,它根据资源需求选择最合适的节点来运行未调度的 Pod,并跟踪资源利用率。它确保不在已满的节点上调度工作负载。

题2.3 什么是 Etcd?怎么实现高可用?

Etcd 是用 Go 编程语言编写的一个分布式键值存储,用于协调分布式工作的软件。因此,Etcd 用来存储 Kubernetes 集群的配置数据,这些数据代表在任何给定时间点的集群状态。

3、部署一个pod,如果该pod未运行起来,有那几种情况,怎么排查?

答:

kubeclt describe pod xx
kubectl logs -f -n xxx.pod

4、k8s如何实现不同服务间的服务发现?从集群外部访问集群内部的服务该如何实现?

  • ①、集群内部(集群内部如何实现服务发现、服务通信?)
    答:集群内部访问,如果两个pod要相互访问,可以通过 pod ip 来访问,但这不是一个很好的方式,因为pod ip 是不稳定的,会经常变化(pod 挂了之后会重新拉取一个新的pod),这时候可以通过service 来解决该问题;service可以对应多个pod,通过内部机制来实现负载均衡,只要service不被删掉,则IP 永远是不变的;
    如果集群中布满了service,也是不够优雅的,这时候k8s提供了DNS的概念,可以通过service 的名字来访问到service,比如名字叫(SerB),这个DNS可以解析service ip(10.0.0.1),从而实现对pod的访问;
    这种方案我们叫做 DNS + ClusterIP
    还有一种方案,Pod C 有多个实例,Pod A 访问HeadlessService,会将pod C 的实例列表返回,客户端拿到实例列表后自己来确定访问。

  • ②、集群内部访问集群外部的访问方式:
    示例:集群内部访问集群外部的MySQL服务,第一种在pod内部直接访问外部的服务,第二种通过将外部的服务以 Endpoint 的方式添加,更加优雅。

  • ③、集群外部如何访问集群内部的服务,有那几种方式?
    答:NodePort, Ingress

5、Ingress是什么?怎么实现其高可用?

公开了从集群外部到集群内部的 Http/https服务路由。

就是一个负载均衡的玩意,其主要用来解决使用NodePort暴露Service的端口时Node IP会漂移的问题。同时,若大量使用NodePort暴露主机端口,管理会非常混乱。

好的解决方案就是让外界通过域名去访问Service,而无需关心其Node IP及Port。那为什么不直接使用Nginx?这是因为在K8S集群中,如果每加入一个服务,我们都在Nginx中添加一个配置,其实是一个重复性的体力活,只要是重复性的体力活,我们都应该通过技术将它干掉。

6、kubectl create 和 kubectl apply区别

kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的
kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性

7、在k8s部署策略中,如何实现灰度发布,通过什么组件可以实现?

答:可通过Istio来实现,具体sidecar, Envoy 代理,服务网络,配置。

8、在k8s中如何实现日志采集?都有哪些方案,最常用的是哪些?

答:通过EFK(es、fluentd、kibana)

9、如何监控k8s组件状态,pod状态,通过哪些监控组件来实现的?

答:prometheus,内置时间序列数据库TSDB,pod的cup、内存又是通过什么实现的?metric server

10、如何搭建高可用k8s集群?假如有 10台机器做集群(cpu 16C, 内存:256G,硬盘 500G),如何进行规划?

如何规划设计?k8s安装方式?二进制,kubeadmin,kubekey

二、进阶

三、高阶

六、面试问题

- 过往项目经验,从中了解他的沟通表达能力,思维逻辑能力,然后会问一些技术问题,考察技术能力
- 然后会问他自己的未来的规划
- 期待薪资多少
- 对加班的看法
- 为什么离职

相关文章:
Kubernetes控制平面组件:API Server

为者常成,行者常至