最近参加了几场Kubernetes相关的面试,被问到了不少关于K8s 1.22新特性和核心原理的问题。K8s 1.22预计在2021年8月发布,目前已经进入beta阶段,很多公司开始关注新版本的变化。本文整理了我被问到的高频面试题,以及我的回答思路。
一、基础概念题
1. 什么是Kubernetes?它解决了什么问题?
这是最基础的开场题。我的回答思路是:Kubernetes是一个容器编排平台,主要解决容器化应用的部署、扩缩容、服务发现、负载均衡和故障自愈等问题。在没有K8s之前,这些都需要运维人员手动处理,效率低且容易出错。
2. Pod和Container的区别是什么?
Pod是K8s中最小的调度单元,一个Pod可以包含一个或多个Container。同一个Pod里的容器共享网络命名空间和存储卷,可以通过localhost互相通信。通常一个Pod只放一个容器,只有当两个容器需要紧密协作时才放在同一个Pod里。
3. Deployment、StatefulSet和DaemonSet的区别?
- Deployment用于无状态应用,比如Web服务,Pod是可以随意替换的。
- StatefulSet用于有状态应用,比如数据库,每个Pod有稳定的网络标识和持久化存储。
- DaemonSet确保每个节点上都运行一个Pod副本,比如日志收集、监控代理。
二、核心原理题
1. K8s的调度流程是怎样的?
这是高频题。调度流程大致是:用户创建Pod → API Server写入etcd → Scheduler监听未调度的Pod → 过滤不满足条件的节点(资源、亲和性等)→ 对剩余节点打分 → 选择分数最高的节点 → 绑定Pod到节点 → Kubelet创建容器。
2. etcd在K8s中的作用是什么?
etcd是一个分布式键值存储,K8s用它来存储整个集群的状态数据,包括节点信息、Pod配置、服务定义等。API Server是唯一直接和etcd交互的组件,其他组件都通过API Server来读写数据。
3. Kube-proxy的工作原理?
Kube-proxy运行在每个节点上,负责实现Service的负载均衡。它主要有三种模式:userspace(最早的模式,性能差)、iptables(目前最常用,规则匹配转发)、IPVS(性能更好,支持更多负载均衡算法)。在K8s 1.22中,IPVS模式已经比较成熟。
三、K8s 1.22新特性题
1. K8s 1.22有哪些重要的新特性?
这是针对新版本的问题。K8s 1.22的重要变化包括:
- Server-side Apply正式GA:之前是beta,1.22中正式成为稳定特性,允许客户端声明字段的所有权。
- CronJob正式GA:CronJob在1.21中是beta,1.22中正式稳定。
- EndpointSlice默认启用:替代传统的Endpoints,在大规模集群中性能更好。
- PodDisruptionBudget更新:支持不健康的Pod驱逐策略。
- 移除了一些已废弃的API:比如beta版本的Ingress、RBAC等,需要迁移到稳定版本。
2. Server-side Apply和客户端Apply有什么区别?
传统的kubectl apply是客户端计算diff,然后发送给API Server。Server-side Apply把这个逻辑移到了服务端,多个客户端可以同时管理同一个资源的不同字段,通过字段所有权来避免冲突。这对于多控制器协作的场景非常有用。
3. K8s 1.22中移除了哪些API?迁移需要注意什么?
K8s 1.22移除了一批长期废弃的beta API,包括extensions/v1beta1的Ingress、networking.k8s.io/v1beta1的IngressClass等。迁移时需要把这些API版本更新到稳定版本,同时注意字段的变化,比如Ingress的pathType字段变成了必填项。
四、网络和存储题
1. K8s的Service有哪几种类型?
- ClusterIP:集群内部访问,默认类型。
- NodePort:通过节点端口暴露服务。
- LoadBalancer:通过云服务商的负载均衡器暴露服务。
- ExternalName:通过CNAME记录映射到外部服务。
2. Ingress和Service的区别?
Service是四层负载均衡,基于IP和端口转发。Ingress是七层负载均衡,基于HTTP/HTTPS规则路由,可以做域名、路径匹配和SSL终止。Ingress需要配合Ingress Controller使用,比如Nginx Ingress。
3. PV和PVC的关系?
PV(PersistentVolume)是集群中的一块存储,由管理员预先创建或通过StorageClass动态供给。PVC(PersistentVolumeClaim)是用户对存储的需求声明,K8s会根据PVC的需求找到匹配的PV并绑定。Pod通过PVC来使用持久化存储。
五、排障和运维题
1. Pod一直处于Pending状态,可能是什么原因?
常见原因包括:节点资源不足、镜像拉取失败、PVC未绑定、节点亲和性不满足、污点和容忍不匹配。排查时可以用kubectl describe pod查看事件信息。
2. 如何查看Pod的日志?
用kubectl logs <pod-name>查看当前容器日志,加--previous可以查看上一次崩溃的容器日志,加-f可以实时跟踪日志。如果Pod有多个容器,需要用-c指定容器名。
3. 如何滚动更新一个Deployment?
修改Deployment的Pod模板后,K8s会自动进行滚动更新,逐步创建新Pod并删除旧Pod。可以用kubectl rollout status查看更新进度,用kubectl rollout undo回滚到上一个版本。
六、我的面试感悟
这几场面试下来,我有几个感悟:
- 基础比新特性更重要:虽然面试官会问K8s 1.22的新特性,但大部分问题还是围绕核心原理。把调度、网络、存储这些基础搞懂了,新特性只是锦上添花。
- 实践经验很关键:很多问题如果只是背概念,回答会很空洞。只有真正在生产环境中用过K8s,遇到过各种问题,回答时才能有细节、有深度。
- 关注版本变化:K8s每个版本都有新特性和API变更,面试前最好了解一下最新版本的变化,尤其是即将GA或被移除的特性。
- 排障思路比答案更重要:有些问题没有标准答案,面试官更看重你的排查思路。遇到不确定的问题,可以说出你的分析过程,比直接说"不知道"要好得多。
希望这些面试题和回答思路能帮到正在准备K8s面试的朋友。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录