云原生面试题
什么是云原生?
【题目】 什么是云原生?
【参考答案】 云原生是基于分布式云的一种技术体系和方法论,以容器、微服务、DevOps、声明式 API 为核心技术,旨在构建和运行可弹性扩展的应用。
四大核心技术:
- 容器:应用打包标准化,秒级启动,环境一致性
- 微服务:应用解耦为独立服务,独立部署、独立扩展
- DevOps:开发和运维融合,CI/CD 自动化流水线
- 声明式 API:描述期望状态,由平台自动调和到目标状态
核心目标:充分利用云平台的弹性、分布式特性,快速响应变化。
【延伸追问】
- 云原生和传统云上部署(上云)的根本区别是什么?
- 云原生应用是否一定要跑在 Kubernetes 上?
【易错坑点】
- 云原生 ≠ K8s,K8s 是云原生生态的一部分但不是全部
- 把传统应用直接容器化部署到 K8s 不等于云原生
Docker 与虚拟机的区别
【题目】 Docker 是什么?它与虚拟机的区别是什么?
【参考答案】 Docker 是一种开源的容器化平台,通过容器打包和运行应用。
| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 内核 | 共享宿主机内核 | 独立内核(每个 VM 有自己的 OS) |
| 启动时间 | 秒级 | 分钟级 |
| 资源占用 | 轻量(MB 级) | 重量(GB 级) |
| 隔离级别 | 进程级隔离(namespace) | 硬件级隔离 |
| 性能损耗 | 几乎无 | 有一定损耗(硬件虚拟化) |
本质区别:容器是进程隔离,虚拟机是操作系统隔离。
【延伸追问】
- 容器安全隔离性是否足够?(Docker 的 namespace 隔离与 VM 的硬件隔离差距)
- 什么是 Kata Containers / gVisor?它们如何提升容器安全性?
【易错坑点】
- 容器不是轻量级虚拟机,两者架构完全不同
- 由于共享内核,Linux 容器不能运行 Windows 应用(反之亦然)
Dockerfile 与镜像分层
【题目】 什么是 Dockerfile?镜像和容器的区别是什么?
【参考答案】 Dockerfile 是定义 Docker 镜像构建过程的文本文件,包含一系列指令。
镜像 vs 容器:
| 概念 | 类比 | 说明 |
|---|---|---|
| Docker 镜像 | 类/模板 | 应用 + 依赖的只读静态快照 |
| Docker 容器 | 实例/对象 | 镜像运行后的可写实例 |
镜像分层原理:
基础镜像(Ubuntu/CentOS)
→ 安装依赖层(apt install)
→ 应用代码层(COPY . /app)
→ 启动命令层(CMD/ENTRYPOINT)
→ 容器运行时在最上层添加**可写层**
分层优势:
- 复用:相同层可缓存共享,节省空间
- 增量:只需传输变更层,加速部署
【延伸追问】
- 如何通过多阶段构建减小镜像体积?
- 镜像层的缓存失效机制是怎样的?
【易错坑点】
- Dockerfile 每条指令创建一个层,过多层会导致镜像臃肿
COPY和ADD指令会检查文件变化,文件变化导致后续所有缓存失效
Kubernetes 核心组件
【题目】 Kubernetes 的核心组件和作用?
【参考答案】 控制平面(Control Plane):
| 组件 | 作用 | 面试价值 |
|---|---|---|
| kube-apiserver | 所有组件通信入口,提供 REST API | ⭐⭐⭐⭐⭐ |
| kube-controller-manager | 运行控制器(Deployment、Node 等控制器) | ⭐⭐⭐⭐ |
| kube-scheduler | 将 Pod 调度到合适的 Node | ⭐⭐⭐⭐ |
| etcd | 分布式键值存储,保存集群所有状态 | ⭐⭐⭐⭐⭐ |
工作节点(Worker Node):
| 组件 | 作用 |
|---|---|
| kubelet | 节点代理,管理 Pod 和容器生命周期 |
| kube-proxy | 网络代理,维护 Service 负载均衡规则 |
| 容器运行时 | containerd / CRI-O |
关键面试点:
- API Server 是 stateless 的,所有状态存 etcd
- 控制平面组件通常以静态 Pod 方式运行
【延伸追问】
- 如果 etcd 挂了,K8s 集群还能正常工作吗?
- kube-scheduler 的调度流程是怎样的?
【易错坑点】
- API Server 是唯一与 etcd 通信的组件,其他组件都通过 API Server
- kubelet 不是 K8s 原生组件,它是节点的 agent
Pod 与 Deployment
【题目】 什么是 Pod?什么是 Deployment?
【参考答案】 Pod:Kubernetes 中最小的部署单元,封装一个或多个容器。
- 同 Pod 容器共享网络命名空间(同一 IP)
- Pod 是临时的,重建后 IP 会变化
Deployment:声明式管理 Pod 副本数、滚动更新和回滚。
- ReplicaSet 确保指定数量的 Pod 运行
- 滚动更新策略:
maxSurge(超量数)、maxUnavailable(不可用数) - 支持回滚到历史版本
Deployment vs StatefulSet:
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机后缀 | 有序编号(0, 1, 2…) |
| 网络标识 | 随机 IP | 稳定 DNS 名称 |
| 存储 | 共享卷 | 每个 Pod 独立 PVC |
| 启动顺序 | 并行 | 顺序启动 |
【延伸追问】
- Deployment 的滚动更新策略如何影响发布过程?
- 什么场景下必须使用 StatefulSet 而不是 Deployment?
【易错坑点】
- Deployment 直接管理的是 ReplicaSet,不是直接管理 Pod
- StatefulSet 删除后 Pod 不会自动清理,需要手动操作
Service 类型
【题目】 Kubernetes Service 有哪些类型?各有什么作用?
【参考答案】
| 类型 | 访问范围 | 原理 | 适用场景 |
|---|---|---|---|
| ClusterIP | 集群内部 | 虚拟 IP + kube-proxy DNAT | 内部服务互调 |
| NodePort | 集群外部 | 每节点开端口 → ClusterIP → Pod | 测试/简单暴露 |
| LoadBalancer | 公网 | 云厂商 LB → NodePort → ClusterIP → Pod | 对外服务 |
| ExternalName | DNS 别名 | CoreDNS 返回 CNAME,无流量转发 | 对接外部服务 |
包含关系:LoadBalancer 包含 NodePort 包含 ClusterIP
【延伸追问】
- ClusterIP 是虚拟 IP,ping 不通是正常现象还是异常?
- Headless Service(ClusterIP: None)的作用是什么?
【易错坑点】
- Service 没有进程,不处理流量,它只是 kube-proxy 生成规则的描述
- NodePort 端口范围固定 30000-32767,不能自定义
Ingress
【题目】 什么是 Ingress?
【参考答案】 Ingress 是 Kubernetes 的 七层 HTTP/HTTPS 路由资源,将外部流量按域名/路径分发到不同的 Service。
与 Service 的区别:
| 特性 | Service | Ingress |
|---|---|---|
| 层级 | 四层(TCP/UDP) | 七层(HTTP/HTTPS) |
| 路由依据 | IP + 端口 | 域名 + 路径 |
| TLS 终止 | ❌ 不支持 | ✅ 支持 |
| 会话保持 | 源 IP | Cookie(生产首选) |
典型配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port: number: 80
【延伸追问】
- Ingress Controller 和 Ingress 资源的关系是什么?
- Gateway API 相比 Ingress 的优势是什么?
【易错坑点】
- Ingress 资源本身不做流量转发,需要 Ingress Controller(如 Nginx Ingress)
- 没有部署 Ingress Controller 的情况下创建 Ingress 资源不会生效
关联文档
- ../容器技术 — 容器基础
- ../../kubernetes/core/K8s 核心概念 — K8s 概念