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
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)