K8s 常见面试题
基础概念类面试题
1. 什么是 Kubernetes?它解决了什么问题?
考察点: 基础概念理解、容器编排意义
回答要点: Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
解决的核心问题:
- 服务发现和负载均衡:自动分配流量到健康的 Pod
- 存储编排:自动挂载存储系统
- 自动部署和回滚:声明式更新应用
- 自动装箱:根据资源需求优化容器部署
- 自我修复:重启失败容器,替换不健康节点
- 密钥和配置管理:安全存储和管理敏感信息
2. K8s 的核心组件有哪些?请画出架构图并说明各组件作用
考察点: 架构理解、组件职责
各组件作用:
Master 组件:
- API Server:集群的前端,所有组件都通过它通信
- etcd:分布式键值存储,保存集群状态
- Scheduler:负责 Pod 调度到合适的 Node
- Controller Manager:运行控制器,维护集群状态
Node 组件:
- Kubelet:在每个节点上运行,管理 Pod 和容器
- Kube-proxy:维护网络规则,实现服务抽象
- Container Runtime:运行容器(Docker、containerd 等)
3. Pod 是什么?为什么 K8s 使用 Pod 而不直接使用容器?
考察点: 核心概念理解、设计思想
回答要点: Pod 是 K8s 中最小的可部署单元,包含一个或多个紧密耦合的容器。
使用 Pod 的原因:
- 共享网络:Pod 内容器共享同一个网络命名空间
- 共享存储:Pod 内容器可以共享 Volume
- 生命周期管理:容器作为一个整体进行调度和管理
- 原子性操作:Pod 内所有容器同时创建、启动、停止
工作负载类面试题
4. Deployment、StatefulSet、DaemonSet 的区别和使用场景?
考察点: 工作负载理解、适用场景判断
| 类型 | 特点 | 使用场景 | 示例 |
|---|---|---|---|
| Deployment | 无状态、可扩缩容、滚动更新 | Web 应用、API 服务 | Nginx、微服务 |
| StatefulSet | 有状态、有序部署、持久化存储 | 数据库、消息队列 | MySQL、Redis、Kafka |
| DaemonSet | 每个节点运行一个副本 | 系统级服务、监控 | 日志收集、监控 Agent |
Deployment 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.20
ports:
- containerPort: 80
5. 如何实现 Pod 的滚动更新?更新过程中如何保证服务不中断?
考察点: 部署策略、服务可用性
滚动更新时序图:
保证服务不中断的关键配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 最多不可用Pod数
maxSurge: 1 # 最多超出副本数
template:
spec:
containers:
- name: web
image: nginx:1.21
ports:
- containerPort: 80
readinessProbe: # 就绪检查
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe: # 存活检查
httpGet:
path: /health
port: 80
initialDelaySeconds: 15
periodSeconds: 20
lifecycle:
preStop: # 优雅关闭
exec:
command: ["/bin/sh", "-c", "sleep 10"]
服务发现与网络类面试题
6. Service 的几种类型及其应用场景?
考察点 : 服务暴露方式、网络理解
| 类型 | 特点 | 使用场景 |
|---|---|---|
| ClusterIP | 集群内部访问 | 内部服务通信 |
| NodePort | 通过节点端口访问 | 开发测试环境 |
| LoadBalancer | 云厂商负载均衡器 | 生产环境外部访问 |
| ExternalName | DNS CNAME 记录 | 外部服务映射 |
Service 工作原理:
7. Ingress 是什么?与 Service 有什么区别?
考察点: 七层负载均衡、流量路由
Ingress 架构图:
主要区别:
- Service:四层负载均衡,基于 IP 和端口
- Ingress:七层负载均衡,基于 HTTP/HTTPS,支持域名、路径路由
Ingress 配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: tls-secret
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
存储与配置类面试题
8. K8s 中的存储类型有哪些?PV、PVC、StorageClass 的关系?
考察点: 存储抽象、持久化理解
存储架构关系:
动态存储供应流程:
9. ConfigMap 和 Secret 的区别?如何在应用中使用?
考察点: 配置管理、安全性
| 特性 | ConfigMap | Secret |
|---|---|---|
| 用途 | 非敏感配置 | 敏感信息 |
| 存储方式 | 明文 | Base64 编码 |
| 典型用例 | 配置文件、环境变量 | 密码、证书、Token |
| 大小限制 | 1MB | 1MB |
使用方式示例:
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database.properties: |
db.host=mysql.default.svc.cluster.local
db.port=3306
db.name=myapp
log.level: "INFO"
---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
db.username: YWRtaW4= # admin (base64)
db.password: cGFzc3dvcmQ= # password (base64)
---
# Pod 使用配置
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: myapp:latest
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log.level
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: app-secret
key: db.username
volumeMounts:
- name: config-volume
mountPath: /etc/config
- name: secret-volume
mountPath: /etc/secrets
volumes:
- name: config-volume
configMap:
name: app-config
- name: secret-volume
secret:
secretName: app-secret
调度与资源管理类面试题
10. K8s 的调度器是如何工作的?影响调度的因素有哪些?
考察点: 调度算法、资源分配
调度流程:
影响调度的关键因素:
- 资源需求和限制
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
- 节点选择器
nodeSelector:
disktype: ssd
- 亲和性和反亲和性
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- us-west-1a
- us-west-1b
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname
11. 什么是 Taint 和 Toleration?使用场景是什么?
考察点: 节点管理、工作负载隔离
Taint 和 Toleration 工作原理:
常见使用场景:
- 专用节点:GPU 节点只运行 AI/ML 工作负载
- 节点维护:标记节点进入维护模式
- 故障隔离:隔离有问题的节点
# 添加 Taint
kubectl taint nodes node1 gpu=true:NoSchedule
# Pod 添加 Toleration
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: gpu-container
image: tensorflow/tensorflow:latest-gpu