面试题

·10 分钟阅读·3846 字
📋 目录

云原生面试题


什么是云原生?

【题目】 什么是云原生?

【参考答案】 云原生是基于分布式云的一种技术体系和方法论,以容器、微服务、DevOps、声明式 API 为核心技术,旨在构建和运行可弹性扩展的应用。

四大核心技术

  1. 容器:应用打包标准化,秒级启动,环境一致性
  2. 微服务:应用解耦为独立服务,独立部署、独立扩展
  3. DevOps:开发和运维融合,CI/CD 自动化流水线
  4. 声明式 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 每条指令创建一个层,过多层会导致镜像臃肿
  • COPYADD 指令会检查文件变化,文件变化导致后续所有缓存失效

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

特性DeploymentStatefulSet
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对外服务
ExternalNameDNS 别名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 的区别

特性ServiceIngress
层级四层(TCP/UDP)七层(HTTP/HTTPS)
路由依据IP + 端口域名 + 路径
TLS 终止❌ 不支持✅ 支持
会话保持源 IPCookie(生产首选)

典型配置

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 概念