目录

一、Nginx 高频面试题(必背)

1. Nginx 是什么?有什么核心特点?

2. Nginx 为什么能实现高并发、高性能?

3. 什么是反向代理?Nginx 如何实现反向代理?

先区分正向代理与反向代理:

4. Nginx 负载均衡有哪些常用策略?(附配置)

5. Nginx 常用优化配置(实战重点)

6. Nginx 常用命令(必背)

7. Nginx 和 Apache 的核心区别(面试必问)

8. Nginx 惊群问题及解决方案

二、Docker 高频面试题(必背)

1. Docker 是什么?核心价值是什么?

2. 容器(Container)和虚拟机(VM)的区别(面试必问)

3. Docker 三大核心概念(基础必背)

4. Docker 为什么启动速度快?

5. Docker 常用命令(必背,分镜像/容器操作)

6. docker run 常用参数(实战高频)

7. Docker 数据卷(Volume)是什么?作用是什么?

8. Docker 四种常用网络模式

9. Dockerfile 是什么?作用是什么?

10. Dockerfile 常用指令(必背)

11. CMD 和 ENTRYPOINT 的区别(面试必问)

12. 如何优化 Docker 镜像体积?(实战重点)

13. 镜像(Image)和容器(Container)的核心区别

三、K8s(Kubernetes)高频面试题(必背)

1. Kubernetes 是什么?核心功能是什么?

2. K8s 核心架构(Master + Node 节点,必背)

(1)Master 节点(控制平面,集群大脑)

(2)Node 节点(工作节点,集群手脚)

3. Pod 是什么?核心特点是什么?(必背)

4. Pod、Deployment、StatefulSet、DaemonSet 的区别(面试必问)

5. Service 是什么?核心作用是什么?常用类型有哪些?

6. ConfigMap 和 Secret 的区别(必背)

7. Namespace 的作用是什么?

8. K8s 网络模型(三大核心问题,必背)

9. PV、PVC、StorageClass 的区别与关系(必背)

10. Label 和 Selector 的作用是什么?

11. K8s 调度流程(简单易懂,必背)

12. K8s 自愈机制(Self-healing,核心优势)

13. K8s 常用命令(必背,面试高频)

14. Deployment 滚动更新原理(面试必问)

15. 探针:livenessProbe(存活探针)和 readinessProbe(就绪探针)(必背)

16. K8s 如何保证高可用?(面试高频,实战重点)

17. 为什么要用 K8s?(面试必问,体现理解深度)

四、面试复习建议(必看)

一、Nginx 高频面试题(必背)

1. Nginx 是什么?有什么核心特点?

Nginx 是一款高性能、轻量级的 HTTP Web 服务器,同时也是优秀的反向代理服务器、邮件代理服务器和负载均衡器,广泛应用于高并发场景的服务部署。

核心特点:

  • 内存占用极低,并发处理能力极强,支持万级并发连接;

  • 采用异步非阻塞、事件驱动模型(基于 epoll/kqueue 机制),无请求阻塞瓶颈;

  • 功能强大,可实现反向代理、负载均衡、动静分离,适配多种业务场景;

  • 稳定性高,扩展性强,支持自定义模块开发,部署维护便捷。

2. Nginx 为什么能实现高并发、高性能?

核心原因在于其高效的架构设计,具体如下:

  • 采用「多进程 + 异步非阻塞事件驱动模型」,避免进程/线程频繁创建销毁的资源开销;

  • 一个 master 主进程管理多个 worker 工作进程,master 负责配置加载、进程管理,worker 负责处理具体请求;

  • 每个 worker 进程为单线程,可高效处理大量并发请求,无需等待某个请求完成再处理下一个;

  • 连接复用机制完善,内存占用极低,资源利用率拉满。

3. 什么是反向代理?Nginx 如何实现反向代理?

先区分正向代理与反向代理:

  • 正向代理:代理客户端,替客户端访问外部服务(如 VPN),客户端明确知道目标服务器地址,代理仅作为“中间人”转发请求;

  • 反向代理:代理服务端,客户端仅访问 Nginx 代理服务器,不知道后端真实服务节点,由 Nginx 根据配置转发请求到后端服务器集群,再将响应结果返回给客户端。

反向代理流程:客户端 → Nginx(反向代理) → 后端服务节点 → Nginx → 客户端

Nginx 实现反向代理:通过配置 upstream 模块定义后端服务集群,再在 server 模块中使用 proxy_pass 指令,将客户端请求转发到 upstream 定义的集群地址,核心配置示例如下:

upstream backend_server {
    server 127.0.0.1:8080;  # 后端服务1
    server 127.0.0.1:8081;  # 后端服务2
}
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://backend_server;  # 转发请求到后端集群
    }
}

4. Nginx 负载均衡有哪些常用策略?(附配置)

Nginx 内置多种负载均衡策略,可根据后端服务器性能、业务需求灵活选择,核心策略如下:

  1. 轮询(默认):请求按顺序依次分配到后端每个服务器,适用于后端服务器性能一致的场景,无需额外配置,默认启用。

  2. 权重轮询(weight):根据服务器性能设置权重值,权重越高,分配到的请求越多,适用于后端服务器性能不均衡的场景,配置示例: 

    upstream backend {
        server 127.0.0.1:8080 weight=1;  # 权重1,接收1份请求
        server 127.0.0.1:8081 weight=2;  # 权重2,接收2份请求
    }

  3. ip_hash:根据客户端 IP 地址进行哈希计算,将同一个客户端的请求固定分配到同一台后端服务器,实现会话保持,配置示例:

    upstream backend {
        ip_hash;  # 启用ip_hash策略
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }

    注意:不推荐优先使用 ip_hash,性能较低,实际场景更建议用 token 实现会话跟踪。

  4. 最少连接数(least_conn):实时统计后端服务器的连接数,将请求转发到当前连接数最少的节点,适用于请求处理时间差异较大的场景,配置示例:

    upstream backend {
        least_conn;  # 启用最少连接数策略
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }

  5. fair(第三方):根据后端服务器的请求响应时间分配请求,响应时间越短,优先分配,需额外安装第三方模块,配置示例:

    upstream backend {
        fair;  # 启用fair策略
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }

5. Nginx 常用优化配置(实战重点)

通过简单配置优化,可进一步提升 Nginx 性能、安全性和稳定性,核心优化项:

  • 调整 worker_processes:设置为 CPU 核心数(如 4 核 CPU 设为 4),充分利用 CPU 资源;

  • 增大 worker_connections:设置单 worker 进程最大连接数(如 10240),提升并发能力;

  • 开启 keepalive 长连接:减少 TCP 连接建立/关闭的开销,配置 keepalive_timeout 60s;

  • 开启 gzip 压缩:压缩响应数据,减少网络传输量,提升访问速度;

  • 设置 expires 缓存:对静态资源(图片、CSS、JS)设置缓存时间,减少重复请求;

  • 隐藏 Nginx 版本号:避免版本漏洞被利用,配置 server_tokens off;

  • 限制请求速率、并发连接:防止恶意攻击,配置 limit_req、limit_conn 模块。

6. Nginx 常用命令(必背)

nginx            # 启动Nginx服务
nginx -s stop    # 强制停止Nginx(立即终止,可能丢失请求)
nginx -s quit    # 优雅停止Nginx(处理完当前请求后终止)
nginx -s reload  # 热加载配置文件(无需停止服务,不影响业务)
nginx -t         # 检查配置文件语法是否正确
nginx -v         # 查看Nginx版本号

7. Nginx 和 Apache 的核心区别(面试必问)

对比维度

Nginx

Apache

处理模型

异步非阻塞,事件驱动

同步多进程/多线程

并发能力

极强,支持万级并发

较弱,适合中低并发

资源占用

轻量,内存占用低

较重,内存占用高

适用场景

静态资源、反向代理、高并发场景

动态请求、模块丰富,适合传统应用

核心结论:高并发场景下,Nginx 性能远优于 Apache,是当前主流的 Web 服务器和反向代理选择。

8. Nginx 惊群问题及解决方案

惊群现象:多个 worker 进程同时争抢同一个客户端连接,导致 CPU 资源浪费、请求处理效率下降。

解决方案:开启 Nginx 的 accept_mutex 互斥锁,配置 accept_mutex on,确保同一时间只有一个 worker 进程去 accept 客户端连接,避免争抢。


二、Docker 高频面试题(必背)

1. Docker 是什么?核心价值是什么?

Docker 是一款开源的应用容器引擎,基于 Go 语言开发,遵循 Apache2.0 开源协议,核心是“打包应用及依赖,实现一次封装,到处运行”。

核心价值:解决应用“环境不一致”问题,简化部署流程,实现应用与环境的解耦,同时轻量、可移植、可隔离,提升开发、测试、部署效率。

2. 容器(Container)和虚拟机(VM)的区别(面试必问)

两者都是实现隔离的技术,但架构差异极大,核心区别如下:

  • 虚拟机:虚拟出完整的硬件(CPU、内存、磁盘),在硬件上运行完整的操作系统,再在系统上安装应用,重量级,启动慢(分钟级),资源占用高,隔离性强。

  • 容器:不虚拟硬件,共享宿主机的内核,仅隔离应用的运行环境(文件系统、网络),是“进程级”隔离,轻量级,启动快(秒级/毫秒级),资源占用低,隔离性略弱于虚拟机。

核心结论:容器更适合微服务、高可用、快速部署场景,虚拟机更适合需要强隔离、运行不同内核系统的场景。

3. Docker 三大核心概念(基础必背)

Docker 的所有操作都围绕三大核心概念展开,必须熟记:

  1. 镜像(Image):只读的模板,包含应用及运行所需的所有依赖(系统环境、库、配置),是创建容器的基础,可理解为“容器的模板”。

  2. 容器(Container):镜像的运行实例,是可读写的,一个镜像可以启动多个相互隔离的容器,容器停止后,其内部数据(未挂载数据卷)会丢失。

  3. 仓库(Repository):用于存储和分发镜像的地方,分为公开仓库(如 Docker Hub)和私有仓库,类似“代码仓库”,用于管理镜像版本。

4. Docker 为什么启动速度快?

核心原因在于其轻量化的架构设计,具体有三点:

  • 容器共享宿主机内核,无需启动完整的操作系统,省去了系统启动的耗时;

  • 容器是进程级启动,仅启动应用进程,而非整个系统,启动耗时极短(秒级);

  • 采用 UnionFS(联合文件系统),分层存储,不同镜像可复用相同的层,减少存储占用,同时启动时无需加载完整镜像,提升启动速度。

5. Docker 常用命令(必背,分镜像/容器操作)

# 一、镜像操作
docker search  镜像名        # 搜索镜像(如 docker search nginx)
docker pull    镜像名:版本   # 拉取镜像(如 docker pull nginx:latest)
docker images               # 查看本地所有镜像
docker rmi     镜像ID/镜像名 # 删除本地镜像(需先删除依赖该镜像的容器)

# 二、容器操作
docker run      [参数] 镜像名 # 创建并启动容器(核心命令)
docker ps                    # 查看当前运行中的容器
docker ps -a                 # 查看所有容器(包括已停止的)
docker start/stop/restart 容器ID # 启动/停止/重启容器
docker rm       容器ID        # 删除容器(已停止的容器,强制删除加 -f)
docker exec -it 容器ID /bin/bash # 进入容器内部(交互模式)
docker logs     容器ID        # 查看容器运行日志(加 -f 实时查看)

6. docker run 常用参数(实战高频)

docker run 是最常用的命令,核心参数必须掌握,可灵活组合使用:

  • -d:后台运行容器(守护进程模式),避免终端关闭后容器停止;

  • -p:端口映射,格式为「宿主机端口:容器端口」(如 -p 80:80,将宿主机80端口映射到容器80端口);

  • -P:随机端口映射,Docker 自动分配宿主机端口映射到容器暴露的端口;

  • --name:指定容器名称,便于后续操作(如 --name mynginx);

  • -v:挂载数据卷,格式为「宿主机目录:容器目录」,实现数据持久化;

  • --restart=always:设置容器开机自启,避免服务器重启后容器未启动;

  • -e:设置环境变量(如 -e MYSQL_ROOT_PASSWORD=123456,设置MySQLroot密码)。

7. Docker 数据卷(Volume)是什么?作用是什么?

数据卷是宿主机上的目录或文件,通过 -v 参数挂载到容器内部,本质是“宿主机与容器之间的文件共享通道”。

核心作用:

  • 数据持久化:容器删除后,挂载在数据卷中的数据不会丢失(容器本身的可写层数据会丢失);

  • 数据共享:宿主机与容器之间、多个容器之间,可通过数据卷共享数据;

  • 简化操作:直接在宿主机修改文件,无需进入容器,提升运维效率。

8. Docker 四种常用网络模式

Docker 内置四种网络模式,可根据业务需求选择,核心区别如下:

  1. bridge(默认):为每个容器分配独立的网络地址,容器之间、容器与宿主机之间可通过网络通信,需通过端口映射实现外部访问;

  2. host:容器与宿主机共享网络命名空间,容器不拥有独立IP,直接使用宿主机的IP和端口,无需端口映射;

  3. none:容器无网络配置,完全隔离,无法与外部通信,仅用于内部测试场景;

  4. container:容器与另一个指定容器共享网络命名空间,两个容器拥有相同的IP和端口,可直接通信,无需额外配置。

9. Dockerfile 是什么?作用是什么?

Dockerfile 是用于构建 Docker 镜像的脚本文件,包含一系列有序的构建指令,每一条指令对应镜像的一层,通过 docker build 命令可自动执行指令,构建出自定义镜像。

核心作用:标准化镜像构建流程,实现镜像的可复用、可版本控制,避免手动构建镜像的繁琐操作,同时确保镜像环境的一致性。

10. Dockerfile 常用指令(必背)

FROM         # 指定基础镜像(必须是Dockerfile的第一条指令,如 FROM nginx:latest)
MAINTAINER   # 指定镜像作者信息(可选,如 MAINTAINER xxx <xxx@163.com>)
RUN          # 构建镜像时执行的命令(如 RUN apt-get update,安装依赖)
CMD          # 容器启动时执行的默认命令(可被命令行参数覆盖)
ENTRYPOINT   # 容器启动时执行的固定命令(不会被覆盖,必执行)
EXPOSE       # 声明容器暴露的端口(仅声明,不实际映射,需配合 -p 参数)
ENV          # 设置环境变量(如 ENV JAVA_HOME /usr/local/jdk)
ADD/COPY     # 拷贝文件到镜像中(ADD支持解压,COPY仅拷贝,推荐用COPY)
VOLUME       # 声明数据卷(指定容器内需要挂载的目录)
WORKDIR      # 指定容器启动后的工作目录(进入容器后默认所在目录)

11. CMD 和 ENTRYPOINT 的区别(面试必问)

两者都用于指定容器启动时执行的命令,核心区别在于“是否可被覆盖”:

  • CMD:容器启动时的默认命令,可被 docker run 命令后追加的参数覆盖(如 docker run nginx echo "hello",会覆盖CMD的默认命令);

  • ENTRYPOINT:容器启动时的固定命令,不会被 docker run 追加的参数覆盖,只会将追加的参数作为ENTRYPOINT命令的参数;

  • 实际场景常用搭配:ENTRYPOINT + CMD,ENTRYPOINT 定义核心命令,CMD 定义默认参数,示例: ENTRYPOINT ["echo"] CMD ["hello world"] # 容器启动默认执行 echo "hello world",追加参数后执行 echo "xxx"

12. 如何优化 Docker 镜像体积?(实战重点)

镜像体积越小,拉取速度越快、存储占用越低,核心优化方法如下:

  1. 选择轻量化基础镜像:优先使用 alpine 版本(如 nginx:alpine),体积远小于 latest 版本;

  2. 合并 RUN 指令:将多个 RUN 命令用 && 合并,减少镜像层数(每一条 RUN 指令对应一层);

  3. 删除无用缓存:构建完成后,删除安装依赖的缓存(如 RUN apt-get update && apt-get install -y xxx && apt-get clean);

  4. 使用 .dockerignore 文件:忽略与镜像构建无关的文件(如 .git、node_modules),避免不必要的文件被拷贝到镜像中;

  5. 采用多阶段构建:将构建过程分为多个阶段,仅将最终运行所需的文件拷贝到最终镜像中,丢弃构建过程中的临时文件和依赖。

13. 镜像(Image)和容器(Container)的核心区别

  • 镜像:静态只读模板,不可修改,可复用、可分发,是容器的“模板”;

  • 容器:镜像的运行实例,可读写,有自己的运行状态,容器停止后,可重启、删除,多个容器可共享同一个镜像;

  • 核心关系:镜像 → 容器(一个镜像可启动多个容器,容器是镜像的“实例化”)。


三、K8s(Kubernetes)高频面试题(必背)

1. Kubernetes 是什么?核心功能是什么?

K8s(Kubernetes)是 Google 开源的容器集群管理平台,基于 Go 语言开发,核心是“自动化部署、扩缩容、管理容器化应用”,是容器编排的主流工具。

核心功能:

  • 容器编排与调度:自动将容器调度到合适的节点,实现负载均衡;

  • 自动扩缩容:根据业务流量自动增加或减少容器副本数,应对流量波动;

  • 自愈能力:容器崩溃、节点故障时,自动重启容器、迁移 Pod 到健康节点;

  • 服务发现与负载均衡:通过 Service 为 Pod 提供固定访问入口,实现内部负载均衡;

  • 滚动更新与回滚:支持应用的无缝更新,更新失败可快速回滚到上一版本;

  • 配置与密钥管理:通过 ConfigMap、Secret 管理应用配置和敏感信息,无需修改镜像。

2. K8s 核心架构(Master + Node 节点,必背)

K8s 集群由控制平面(Master 节点)和工作节点(Node 节点)组成,各组件分工明确,协同工作:

(1)Master 节点(控制平面,集群大脑)

负责集群的管理和调度,核心组件:

  • etcd:分布式键值存储,保存集群的所有配置数据、状态数据,是集群的“数据中心”;

  • kube-apiserver:集群的统一入口,提供 REST API 接口,所有组件的通信都通过 apiserver;

  • kube-scheduler:调度器,根据节点资源情况、Pod 需求,决定将 Pod 调度到哪个 Node 节点;

  • kube-controller-manager:控制器管理器,包含多种控制器(如副本控制器、节点控制器),负责维护集群的期望状态(如副本数、节点健康)。

(2)Node 节点(工作节点,集群手脚)

负责运行容器化应用,核心组件:

  • kubelet:运行在每个 Node 节点上,与 Master 节点通信,负责管理当前节点上的 Pod(启动、停止、监控);

  • kube-proxy:网络代理,运行在每个 Node 节点上,维护 Service 的网络规则,实现 Pod 与 Service、外部的通信;

  • 容器运行时:负责运行容器,如 Docker、containerd 等,是 K8s 与容器之间的桥梁。

3. Pod 是什么?核心特点是什么?(必背)

Pod 是 K8s 集群中最小的调度单元,不是容器,而是容器的“集合”,核心特点:

  • 一个 Pod 可以包含一个或多个容器(通常是一个主容器 + 多个辅助容器);

  • 同一个 Pod 内的所有容器共享网络命名空间、存储卷,可直接通过 localhost 通信;

  • Pod 是短暂的、一次性的,生命周期短暂,一旦 Pod 被删除,其内部容器也会被销毁,数据(未挂载存储)会丢失;

  • Pod 本身不具备自愈能力,需通过 Deployment、StatefulSet 等控制器管理。

4. Pod、Deployment、StatefulSet、DaemonSet 的区别(面试必问)

四者都是 K8s 的核心资源对象,用途不同,核心区别如下:

  1. Pod:最小调度单元,无自愈、无扩缩容能力,通常不直接创建,由控制器管理;

  2. Deployment:最常用的控制器,用于管理无状态应用(如 Nginx、Tomcat),支持滚动更新、回滚、多副本,不保证 Pod 名称、IP 固定;

  3. StatefulSet:用于管理有状态应用(如 MySQL、Redis、ZooKeeper),Pod 名称有序、IP 固定,提供稳定的网络标识和存储,支持有序部署、有序删除;

  4. DaemonSet:用于在每一个 Node 节点上只运行一个 Pod,适用于日志采集(如 Fluentd)、监控(如 Prometheus)、网络插件(如 Calico)等场景。

5. Service 是什么?核心作用是什么?常用类型有哪些?

Service 是 K8s 中用于暴露 Pod 访问入口的资源对象,核心作用是“为一组 Pod 提供固定的访问地址,实现服务发现和负载均衡”,解决 Pod 动态变化(IP、数量)导致的访问问题。

常用 Service 类型:

  1. ClusterIP(默认):仅集群内部可访问,分配一个集群内部的虚拟 IP,用于集群内 Pod 之间的通信;

  2. NodePort:在每个 Node 节点上开放一个固定端口,外部可通过「节点 IP:NodePort」访问 Pod,适用于测试、小型应用;

  3. LoadBalancer:结合云厂商的负载均衡器(如阿里云 SLB、AWS ELB),自动分配公网 IP,外部可直接通过该 IP 访问,适用于生产环境;

  4. ExternalName:将 Service 映射到外部服务(如百度、数据库),无需部署 Pod,直接转发请求到外部服务。

6. ConfigMap 和 Secret 的区别(必背)

两者都是用于管理配置的资源对象,核心区别在于“存储内容的敏感性”:

  • ConfigMap:用于存储普通配置信息,如应用的配置文件、环境变量(如数据库地址、端口),明文存储,不加密;

  • Secret:用于存储敏感信息,如密码、密钥、证书等,采用 Base64 编码存储(注意:Base64 是编码,不是加密,需配合加密插件实现真正加密);

  • 两者均可通过环境变量或存储卷的方式挂载到 Pod 中,实现配置与镜像的解耦。

7. Namespace 的作用是什么?

Namespace 是 K8s 中用于实现“资源逻辑隔离”的资源对象,核心作用:

  • 环境隔离:区分开发、测试、生产环境(如 dev、test、prod 三个 Namespace),不同环境的资源相互独立,避免冲突;

  • 资源配额:为每个 Namespace 设置资源配额(CPU、内存),限制该环境的资源使用,避免某一环境占用过多资源;

  • 权限控制:基于 Namespace 分配权限,实现不同团队对不同环境的权限管理(如开发团队仅能操作 dev 环境)。

8. K8s 网络模型(三大核心问题,必背)

K8s 网络模型的核心要求是:所有 Pod 之间可以直接通信,无需 NAT 转换;Pod 与 Service 之间、外部与 Service 之间可正常通信,核心解决三大问题:

  1. Pod 与 Pod 之间的通信:同一节点、不同节点的 Pod 可直接通过 IP 通信;

  2. Pod 与 Service 之间的通信:Pod 可通过 Service 的 ClusterIP 访问 Service,Service 会将请求转发到后端 Pod;

  3. 外部与 Service 之间的通信:通过 NodePort、LoadBalancer 等 Service 类型,实现外部请求访问集群内的 Pod。

常见 K8s 网络插件:Calico(主流,性能好、隔离性强)、Flannel(简单易用)、Canal(结合 Calico 和 Flannel 优势)。

9. PV、PVC、StorageClass 的区别与关系(必背)

三者都是 K8s 中用于实现“持久化存储”的资源对象,分工不同,协同工作:

  • PV(PersistentVolume,持久化存储卷):由集群管理员创建,是集群中的“存储资源”,包含存储类型、容量、访问模式等信息,可理解为“存储池”;

  • PVC(PersistentVolumeClaim,存储卷申请):由用户创建,是用户对存储资源的“申请”,指定需要的存储容量、访问模式,无需关心 PV 的具体实现;

  • StorageClass(存储类):用于实现 PV 的“动态供给”,管理员创建 StorageClass 定义存储类型(如阿里云 EBS、本地存储),用户创建 PVC 时指定 StorageClass,K8s 会自动创建对应的 PV,无需管理员手动创建。

核心关系:StorageClass → 动态创建 PV → PVC 绑定 PV → Pod 挂载 PVC 实现数据持久化。

10. Label 和 Selector 的作用是什么?

Label 和 Selector 是 K8s 中用于“资源关联”的核心机制:

  • Label:键值对形式的标签(如 app=nginx、env=dev),可给 Pod、Service、Deployment 等资源添加标签,用于标记资源的属性;

  • Selector:标签选择器,用于筛选带有指定 Label 的资源,实现资源之间的关联;

  • 示例:Deployment 通过 Selector 匹配带有 app=nginx 标签的 Pod,实现对这些 Pod 的管理(扩缩容、滚动更新);Service 通过 Selector 匹配 Pod,实现请求转发。

11. K8s 调度流程(简单易懂,必背)

K8s 调度的核心是“将 Pod 分配到合适的 Node 节点”,流程如下:

  1. 用户通过 kubectl 或 API 创建 Deployment(或 Pod);

  2. Deployment 的控制器根据配置,创建对应的 Pod 实例,提交到 apiserver;

  3. kube-scheduler 监听 apiserver,发现未被调度的 Pod,开始调度;

  4. scheduler 筛选出符合条件的 Node 节点(如资源充足、节点健康),再根据调度策略(如优先级、亲和性)选择最优 Node;

  5. scheduler 将调度结果(Pod 分配到哪个 Node)提交到 apiserver;

  6. 目标 Node 上的 kubelet 监听 apiserver,发现分配给自己的 Pod,启动 Pod 内的容器,完成服务上线。

12. K8s 自愈机制(Self-healing,核心优势)

K8s 的自愈机制是其核心优势之一,无需人工干预,自动恢复集群的正常状态,主要体现在:

  • Pod 自愈:Pod 崩溃、健康检查失败时,控制器(如 Deployment)会自动重启 Pod;若重启失败,会重新调度到其他健康节点;

  • 节点自愈:Node 节点故障(宕机、失联)时,该节点上的 Pod 会被自动迁移到其他健康节点,确保服务不中断;

  • 副本自愈:若 Pod 副本数少于期望数(如配置 3 个副本,实际只有 2 个),控制器会自动创建新的 Pod,补充副本数;

  • 服务自愈:Service 会自动检测后端 Pod 的健康状态,将请求转发到健康的 Pod,避免请求发送到故障 Pod。

13. K8s 常用命令(必背,面试高频)

# 一、查看资源
kubectl get nodes          # 查看集群所有节点
kubectl get pods           # 查看当前 Namespace 下的 Pod
kubectl get pods -n 命名空间 # 查看指定 Namespace 下的 Pod
kubectl get svc            # 查看 Service
kubectl get deployments    # 查看 Deployment
kubectl get pv/pvc         # 查看 PV、PVC

# 二、查看详细信息
kubectl describe pod Pod名称        # 查看 Pod 详细信息(排查故障常用)
kubectl describe deployment 名称    # 查看 Deployment 详细信息
kubectl logs Pod名称               # 查看 Pod 运行日志(加 -f 实时查看)

# 三、容器操作
kubectl exec -it Pod名称 -- /bin/bash # 进入 Pod 内部(交互模式)
kubectl cp 本地文件  Pod名称:容器路径 # 本地文件拷贝到 Pod 内部

# 四、扩缩容与更新
kubectl scale deployment 名称 --replicas=3 # 扩缩容(设置副本数为3)
kubectl set image deployment 名称 容器名=镜像名:版本 # 滚动更新
kubectl rollout undo deployment 名称 # 回滚到上一版本
kubectl rollout history deployment 名称 # 查看更新历史

# 五、其他常用
kubectl create namespace 名称 # 创建命名空间
kubectl delete pod Pod名称    # 删除 Pod
kubectl apply -f 配置文件.yaml # 通过配置文件创建资源
kubectl delete -f 配置文件.yaml # 通过配置文件删除资源

14. Deployment 滚动更新原理(面试必问)

滚动更新是 Deployment 的核心功能,实现“应用无缝更新,服务不中断”,原理如下:

  1. 用户触发滚动更新(如修改镜像版本);

  2. Deployment 控制器根据配置,逐步创建新版本的 Pod(默认每次创建 1 个,可配置);

  3. 当新版本 Pod 启动并通过就绪探针(readinessProbe)检测,确认服务就绪后,再逐步销毁旧版本的 Pod;

  4. 重复步骤 2-3,直到所有旧版本 Pod 被销毁,新版本 Pod 全部启动,更新完成;

  5. 若更新过程中出现问题,可通过 kubectl rollout undo 快速回滚到上一版本,避免服务中断。

15. 探针:livenessProbe(存活探针)和 readinessProbe(就绪探针)(必背)

探针是 K8s 用于检测 Pod 健康状态的机制,核心有两种探针,用途不同:

  1. livenessProbe(存活探针):用于判断 Pod 内的容器是否“活着”,若探针检测失败,kubelet 会自动重启该容器; 常用检测方式:HTTP 请求(如访问 /health)、命令执行(如 ps -ef | grep 进程)、TCP 端口检测。

  2. readinessProbe(就绪探针):用于判断 Pod 内的服务是否“就绪”,若探针检测失败,Service 会停止将请求转发到该 Pod,直到检测成功; 核心作用:避免将请求发送到未启动完成、服务异常的 Pod,保证服务可用性。

16. K8s 如何保证高可用?(面试高频,实战重点)

K8s 高可用的核心是“避免单点故障”,通过多节点部署、自愈机制、负载均衡实现,具体措施:

  • Master 节点多副本部署:部署 3 个 Master 节点(避免单点故障),etcd 集群部署(至少 3 个节点),确保控制平面高可用;

  • Node 节点多副本部署:部署多个 Node 节点,Pod 可在节点故障时自动迁移,避免服务中断;

  • 控制器保证副本数:通过 Deployment、StatefulSet 配置足够的 Pod 副本,确保即使部分 Pod 故障,仍有可用实例;

  • Service 负载均衡:通过 Service 实现 Pod 的负载均衡,避免单个 Pod 过载,同时自动剔除故障 Pod;

  • 数据持久化:通过 PV、PVC 实现数据持久化,避免 Pod 销毁导致数据丢失;

  • 监控与告警:部署监控工具(如 Prometheus + Grafana),实时监控集群状态,异常时及时告警,便于快速排查。

17. 为什么要用 K8s?(面试必问,体现理解深度)

在容器化普及的今天,K8s 成为主流容器编排工具,核心原因的如下:

  • 统一管理容器集群:解决多容器、多节点的管理难题,实现集群的统一调度、监控、运维;

  • 自动化运维:减少人工操作,实现容器的自动部署、扩缩容、自愈、滚动更新,提升运维效率;

  • 弹性伸缩:根据业务流量自动调整 Pod 副本数,高峰期扩容、低峰期缩容,节省服务器资源;

  • 高可用性:通过多节点、自愈机制,确保服务不中断,提升应用的可用性;

  • 适配微服务架构:微服务架构下,服务数量多、部署复杂,K8s 可实现微服务的快速部署、服务发现、负载均衡,简化微服务管理;

  • 可扩展性强:支持自定义资源、自定义控制器,可根据业务需求扩展集群功能,适配不同行业场景。


四、面试复习建议(必看)

结合 Nginx、Docker、K8s 三大技术的面试重点,建议按以下顺序复习,高效突击:

  1. 先掌握基础概念:明确每个技术的核心定义、核心组件,建立知识框架;

  2. 再吃透核心原理:如 Nginx 异步非阻塞模型、Docker 隔离机制、K8s 调度与自愈机制,这是面试加分项;

  3. 熟练常用命令与配置:背诵高频命令、核心配置,确保面试时能快速回答,体现实操能力;

  4. 结合实战场景:思考每个技术的实际应用场景(如 Nginx 做动静分离、Docker 打包应用、K8s 部署微服务),面试时能结合项目说明,提升竞争力;

  5. 查漏补缺:重点记忆易混淆知识点(如 CMD vs ENTRYPOINT、Deployment vs StatefulSet),避免面试出错。

本文所有内容均为面试高频考点,排版简洁、答案精准,可直接打印背诵或发布博客,助力快速通过后端/运维面试!

更多推荐