Kubernetes面试题
2026/1/15大约 7 分钟KubernetesK8s容器编排云原生DevOps
Kubernetes 面试题
基础概念
Q1: 什么是 Kubernetes?它解决了什么问题?
Kubernetes(K8s)是 Google 开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。
解决的问题:
- 服务发现和负载均衡:自动分配 IP 和 DNS,负载均衡流量
- 存储编排:自动挂载存储系统
- 自动部署和回滚:声明式配置,自动回滚
- 自动装箱:根据资源需求自动调度
- 自我修复:自动重启、替换、杀死不健康容器
- 密钥和配置管理:安全管理敏感信息
Q2: K8s 的核心组件有哪些?
| 组件 | 作用 |
|---|---|
| API Server | 集群统一入口,RESTful API |
| etcd | 分布式键值存储,保存集群状态 |
| Scheduler | 负责 Pod 调度到合适的 Node |
| Controller Manager | 运行各种控制器(Deployment、ReplicaSet 等) |
| kubelet | 管理 Node 上的 Pod 和容器 |
| kube-proxy | 实现 Service 的网络代理和负载均衡 |
Q3: Pod 是什么?为什么需要 Pod?
Pod 是 K8s 最小的调度单元,包含一个或多个容器。
为什么需要 Pod:
- 共享网络:同一 Pod 内容器共享 IP 和端口
- 共享存储:可以挂载相同的 Volume
- 紧密协作:适合需要紧密配合的容器(如 Sidecar 模式)
- 原子调度:确保相关容器调度到同一节点
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: app
image: myapp:v1
- name: sidecar
image: fluentd:latestQ4: Deployment、ReplicaSet、Pod 的关系?
- Deployment:声明式管理,支持滚动更新、回滚
- ReplicaSet:确保指定数量的 Pod 副本运行
- Pod:实际运行的容器组
Deployment 通过创建新 ReplicaSet 实现滚动更新,保留旧 ReplicaSet 支持回滚。
网络相关
Q5: Service 的类型有哪些?
| 类型 | 说明 | 使用场景 |
|---|---|---|
| ClusterIP | 集群内部 IP(默认) | 内部服务通信 |
| NodePort | 在每个 Node 上开放端口 | 开发测试、简单暴露 |
| LoadBalancer | 云厂商负载均衡器 | 生产环境外部访问 |
| ExternalName | 映射到外部 DNS | 访问集群外服务 |
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
nodePort: 30080Q6: kube-proxy 的工作模式?
| 模式 | 说明 | 性能 |
|---|---|---|
| userspace | 用户空间代理(已废弃) | 低 |
| iptables | 基于 iptables 规则 | 中 |
| ipvs | 基于 IPVS 负载均衡 | 高 |
# 查看当前模式
kubectl get configmap kube-proxy -n kube-system -o yaml | grep modeIPVS 优势:
- 更高的性能和吞吐量
- 更多的负载均衡算法(rr、lc、dh、sh 等)
- 支持更大规模的 Service
Q7: Ingress 和 Service 的区别?
| 特性 | Service | Ingress |
|---|---|---|
| 层级 | L4(TCP/UDP) | L7(HTTP/HTTPS) |
| 路由 | 基于 IP:Port | 基于域名/路径 |
| SSL | 不支持 | 支持 |
| 负载均衡 | 简单轮询 | 高级路由规则 |
Q8: K8s 网络模型的要求?
K8s 网络模型的三个基本要求:
- Pod 间通信:所有 Pod 可以直接通信,无需 NAT
- Node 与 Pod 通信:所有 Node 可以与所有 Pod 通信
- Pod 看到的 IP:Pod 看到的自己 IP 与其他 Pod 看到的一致
常用 CNI 插件:
| 插件 | 特点 |
|---|---|
| Flannel | 简单易用,适合入门 |
| Calico | 支持网络策略,性能好 |
| Cilium | 基于 eBPF,高性能 |
| Weave | 支持加密,易于配置 |
调度相关
Q9: Pod 调度流程是怎样的?
调度过程:
- 过滤(Predicates):排除不满足条件的 Node
- 打分(Priorities):对剩余 Node 打分
- 选择:选择得分最高的 Node
Q10: 如何影响 Pod 调度?
| 方式 | 说明 | 示例 |
|---|---|---|
| nodeSelector | 简单的节点选择 | nodeSelector: {disk: ssd} |
| nodeAffinity | 高级节点亲和性 | 软/硬亲和 |
| podAffinity | Pod 亲和性 | 与某些 Pod 调度到一起 |
| podAntiAffinity | Pod 反亲和性 | 与某些 Pod 分开调度 |
| Taints/Tolerations | 污点和容忍 | 专用节点 |
# nodeAffinity 示例
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linuxQ11: 什么是 Taints 和 Tolerations?
Taints(污点):标记 Node,阻止 Pod 调度
Tolerations(容忍):允许 Pod 调度到有污点的 Node
# 给 Node 添加污点
kubectl taint nodes node1 key=value:NoSchedule
# 移除污点
kubectl taint nodes node1 key=value:NoSchedule-# Pod 容忍污点
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"污点效果:
| Effect | 说明 |
|---|---|
| NoSchedule | 不调度新 Pod |
| PreferNoSchedule | 尽量不调度 |
| NoExecute | 不调度且驱逐现有 Pod |
存储相关
Q12: PV 和 PVC 的关系?
- PV(PersistentVolume):集群级别的存储资源
- PVC(PersistentVolumeClaim):用户对存储的请求
- StorageClass:动态创建 PV 的模板
# PVC 示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standardQ13: Volume 的访问模式有哪些?
| 模式 | 缩写 | 说明 |
|---|---|---|
| ReadWriteOnce | RWO | 单节点读写 |
| ReadOnlyMany | ROX | 多节点只读 |
| ReadWriteMany | RWX | 多节点读写 |
| ReadWriteOncePod | RWOP | 单 Pod 读写(1.22+) |
安全相关
Q14: RBAC 是什么?
RBAC(Role-Based Access Control)基于角色的访问控制。
核心概念:
| 资源 | 作用域 | 说明 |
|---|---|---|
| Role | Namespace | 定义命名空间内权限 |
| ClusterRole | Cluster | 定义集群级别权限 |
| RoleBinding | Namespace | 绑定 Role 到用户 |
| ClusterRoleBinding | Cluster | 绑定 ClusterRole 到用户 |
# Role 示例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]Q15: ServiceAccount 的作用?
ServiceAccount 为 Pod 内进程提供身份标识,用于访问 API Server。
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa
---
apiVersion: v1
kind: Pod
spec:
serviceAccountName: my-sa
containers:
- name: app
image: myapp每个 Namespace 都有默认的 default ServiceAccount。
高可用和运维
Q16: 如何实现 K8s 集群高可用?
高可用要点:
- 多 Master 节点:至少 3 个,奇数个
- etcd 集群:独立部署或与 Master 共存
- 负载均衡:API Server 前置 LB
- 多 Node 节点:工作负载分散
Q17: Pod 的重启策略有哪些?
| 策略 | 说明 | 适用场景 |
|---|---|---|
| Always | 总是重启(默认) | 长期运行的服务 |
| OnFailure | 失败时重启 | Job、批处理任务 |
| Never | 从不重启 | 一次性任务 |
Q18: 如何进行滚动更新?
# 更新镜像
kubectl set image deployment/myapp app=myapp:v2
# 查看更新状态
kubectl rollout status deployment/myapp
# 查看历史
kubectl rollout history deployment/myapp
# 回滚
kubectl rollout undo deployment/myapp
# 回滚到指定版本
kubectl rollout undo deployment/myapp --to-revision=2滚动更新策略:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # 最多超出期望数量
maxUnavailable: 25% # 最多不可用数量Q19: 如何排查 Pod 问题?
# 查看 Pod 状态
kubectl get pods -o wide
# 查看 Pod 详情
kubectl describe pod <pod-name>
# 查看日志
kubectl logs <pod-name> -c <container-name>
# 查看之前容器的日志
kubectl logs <pod-name> --previous
# 进入容器
kubectl exec -it <pod-name> -- /bin/sh
# 查看事件
kubectl get events --sort-by='.lastTimestamp'常见 Pod 状态:
| 状态 | 说明 | 排查方向 |
|---|---|---|
| Pending | 等待调度 | 资源不足、调度约束 |
| ImagePullBackOff | 拉取镜像失败 | 镜像名、仓库认证 |
| CrashLoopBackOff | 容器反复崩溃 | 查看日志、启动命令 |
| OOMKilled | 内存不足被杀 | 增加内存限制 |
Q20: K8s 1.24+ 为什么移除 Docker?
K8s 移除的是 dockershim(Docker 适配层),不是禁止使用 Docker 镜像。
原因:
- 维护成本:dockershim 是 K8s 代码库的一部分,维护负担重
- 架构冗余:Docker 底层也是 containerd,多了一层
- CRI 标准化:containerd、CRI-O 原生支持 CRI
影响:
- Docker 构建的镜像仍然可用(OCI 标准)
- 需要使用 containerd 或 CRI-O 作为运行时
docker命令改用crictl或nerdctl
小结
K8s 面试重点:
- 核心组件和架构
- Pod、Deployment、Service 等核心资源
- 网络模型和 CNI
- 调度机制和亲和性
- 存储(PV/PVC)
- RBAC 安全
- 高可用和运维
- 新版本变化(containerd、Gateway API 等)
面试题预览
高频面试题
- K8s 的架构是怎样的?各组件的作用?
- Pod 的生命周期和状态有哪些?
- Service 的几种类型及使用场景?
- 如何实现 Pod 的滚动更新和回滚?
- K8s 网络模型的要求是什么?
