DevOps 面试题大全(三):Kubernetes 容器编排 50 题详解

前言

Kubernetes(K8s)是容器编排的事实标准,也是 DevOps 工程师的必备技能。本文整理了 50 道 Kubernetes 面试题,从基础概念到高级架构,每道题都配有详细的答案和解析,帮助你深入理解 K8s 核心技术。

一、基础概念题(1-15 题)

1. 什么是 Kubernetes?它解决了什么问题?

答案:

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。

解决的问题:

  1. 服务发现和负载均衡 - 自动分配 IP 和 DNS,负载均衡流量
  2. 存储编排 - 自动挂载存储系统(本地、云存储、网络存储)
  3. 自动部署和回滚 - 声明式配置,自动滚动更新,支持回滚
  4. 自动 bin packing - 根据资源需求调度容器到合适的节点
  5. 自我修复 - 自动重启失败的容器,替换故障节点
  6. 密钥和配置管理 - 管理敏感信息,无需重新构建镜像
# K8s 核心特性:
- 容器编排
- 自动扩缩容
- 服务发现
- 负载均衡
- 自我修复
- 滚动更新

2. 解释 Kubernetes 的架构组成

答案:

Kubernetes 集群由 Control Plane(控制平面)和 Worker Nodes(工作节点)组成。

1. Control Plane(控制平面):

  • kube-apiserver - API 服务器,集群的统一入口,处理 REST 操作
  • etcd - 分布式键值存储,保存集群所有状态数据
  • kube-scheduler - 调度器,决定 Pod 调度到哪个节点
  • kube-controller-manager - 控制器管理器,运行各种控制器
  • cloud-controller-manager - 云控制器管理器(云环境)

2. Worker Nodes(工作节点):

  • kubelet - 节点代理,管理 Pod 生命周期
  • kube-proxy - 网络代理,维护网络规则和负载均衡
  • 容器运行时 - Docker、containerd、CRI-O 等
# 查看集群组件
kubectl get componentstatuses
kubectl get nodes
kubectl get pods -n kube-system

3. 什么是 Pod?它和容器有什么区别?

答案:

Pod 是 Kubernetes 中最小的调度和管理单元,可以包含一个或多个容器。

Pod vs 容器:

特性 Pod 容器
定义 K8s 调度单元 进程隔离环境
容器数量 1 个或多个 单个
网络 Pod 内共享 IP 和端口 独立网络命名空间
存储 可共享 Volume 独立存储
生命周期 同生共死 独立
# Pod 示例 - 多容器 Pod
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: web
    image: nginx
    ports:
    - containerPort: 80
  - name: sidecar
    image: busybox
    command: ['sh', '-c', 'while true; do echo "Logging..."; sleep 10; done']
  volumes:
  - name: shared-data
    emptyDir: {}

4. 解释 Deployment、StatefulSet 和 DaemonSet 的区别

答案:

1. Deployment(部署):

  • 用于无状态应用
  • Pod 名称和 IP 不固定
  • 支持滚动更新和回滚
  • Pod 可以调度到任意节点
  • 适用场景:Web 服务器、API 服务

2. StatefulSet(有状态集):

  • 用于有状态应用
  • Pod 名称固定(pod-0, pod-1, pod-2...)
  • Pod 有稳定的网络标识和存储
  • 有序部署和扩展
  • 适用场景:数据库、Zookeeper、Kafka

3. DaemonSet(守护进程集):

  • 每个节点运行一个 Pod 副本
  • 新节点加入时自动部署
  • 节点删除时自动清理
  • 适用场景:日志收集、监控代理、网络插件
# Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

# StatefulSet 示例
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 3
  template:
    spec:
      containers:
      - name: mysql
        image: mysql:8.0

# DaemonSet 示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  template:
    spec:
      containers:
      - name: fluentd
        image: fluentd:latest

5. 什么是 Service?有哪些类型?

答案:

Service 是定义一组 Pod 的访问策略,提供稳定的 IP 和 DNS 名称。

Service 类型:

  1. ClusterIP(默认)
    • 只在集群内部可访问
    • 分配集群内部 IP
    • 用于内部服务通信
  2. NodePort
    • 在每个节点上开放固定端口
    • 外部可通过 NodeIP:NodePort 访问
    • 端口范围:30000-32767
  3. LoadBalancer
    • 创建云负载均衡器
    • 提供外部 IP
    • 需要云提供商支持
  4. ExternalName
    • 映射到外部服务
    • 通过 CNAME 记录
    • 用于访问集群外服务
# ClusterIP Service
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

# NodePort Service
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30080

# LoadBalancer Service
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

6. 解释 ConfigMap 和 Secret 的区别

答案:

ConfigMap:

  • 存储非敏感配置数据
  • 键值对形式
  • 明文存储
  • 用于配置文件、环境变量等

Secret:

  • 存储敏感数据(密码、token、密钥)
  • Base64 编码(不是加密)
  • 可以加密存储(Encryption at Rest)
  • 更严格的访问控制
# 创建 ConfigMap
kubectl create configmap app-config \
  --from-literal=db_host=mysql.default.svc \
  --from-literal=db_port=3306

# 创建 Secret
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

# 在 Pod 中使用
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: myapp
    envFrom:
    - configMapRef:
        name: app-config
    - secretRef:
        name: db-secret

7. 什么是 Namespace?有什么作用?

答案:

Namespace 是 Kubernetes 中的虚拟集群,用于资源隔离和组织。

作用:

  1. 资源隔离 - 不同团队/项目使用不同 Namespace
  2. 资源配额 - 限制每个 Namespace 的资源使用
  3. 访问控制 - 基于 Namespace 的 RBAC
  4. 环境隔离 - dev、test、prod 环境分离

默认 Namespace:

  • default - 默认命名空间
  • kube-system - 系统组件
  • kube-public - 公共资源
  • kube-node-lease - 节点租约
# 创建 Namespace
kubectl create namespace dev

# 查看 Namespace
kubectl get namespaces

# 在特定 Namespace 部署
kubectl apply -f app.yaml -n dev

# 设置默认 Namespace
kubectl config set-context --current --namespace=dev

# Namespace 资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
    pods: "50"

8. 解释 Pod 的生命周期

答案:

Pod 状态:

  1. Pending - API 服务器已接受,等待调度
  2. Running - 已调度到节点,容器正在运行
  3. Succeeded - 所有容器成功完成(退出码 0)
  4. Failed - 至少一个容器失败
  5. Unknown - 无法获取 Pod 状态

生命周期阶段:

  1. 创建 - kubectl 提交 Pod 定义
  2. 调度 - Scheduler 选择节点
  3. 绑定 - Pod 绑定到节点
  4. 拉取镜像 - Kubelet 拉取容器镜像
  5. 创建容器 - 创建容器并启动
  6. 运行 - 容器正常运行
  7. 终止 - 删除 Pod,优雅关闭容器
# 查看 Pod 状态
kubectl get pods
kubectl get pods -o wide

# 查看 Pod 详细信息
kubectl describe pod 

# 查看 Pod 日志
kubectl logs 
kubectl logs  -c 

# 查看 Pod 事件
kubectl get events --field-selector involvedObject.name=

9. 什么是 Probe?有哪些类型?

答案:

Probe(探针) 用于检查容器的健康状态。

三种类型:

  1. livenessProbe(存活探针)
    • 检查容器是否运行
    • 失败则重启容器
    • 用于检测死锁
  2. readinessProbe(就绪探针)
    • 检查容器是否准备好接收流量
    • 失败则从 Service 后端移除
    • 用于启动完成检查
  3. startupProbe(启动探针)
    • 检查应用是否已启动
    • 失败不会被杀死(给慢启动应用时间)
    • K8s 1.16+ 支持
# Probe 配置示例
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: myapp
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 3
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
    startupProbe:
      httpGet:
        path: /startup
        port: 8080
      failureThreshold: 30
      periodSeconds: 10

10. 解释 Kubernetes 的网络模型

答案:

K8s 网络模型要求:

  1. 所有 Pod 可以直接通信,无需 NAT
  2. 所有节点可以直接通信,无需 NAT
  3. Pod IP 与容器内看到的 IP 一致

网络实现:

  1. Overlay 网络 - Flannel、Calico、Weave
  2. 路由网络 - Calico(BGP)
  3. 云提供商网络 - AWS VPC、GCP VPC

网络插件(CNI):

  • Flannel - 简单,Overlay 网络
  • Calico - 高性能,支持 NetworkPolicy
  • Weave - 加密通信
  • Cilium - eBPF 为基础
# 查看 Pod IP
kubectl get pods -o wide

# 测试 Pod 间通信
kubectl exec pod1 -- ping 

# 查看网络插件
kubectl get pods -n kube-system | grep -E "flannel|calico|weave"

# NetworkPolicy 示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

11-15. 更多基础题

题号 题目 答案要点
11 什么是 kubelet? 节点代理,管理 Pod 生命周期
12 什么是 kube-proxy? 网络代理,维护网络规则
13 解释 etcd 的作用 分布式存储,保存集群状态
14 什么是 kubectl? K8s 命令行工具
15 解释 Label 和 Selector 标签用于标识,选择器用于筛选

二、进阶实战题(16-35 题)

16. 如何排查 Pod 无法启动的问题?

答案:

排查步骤:

  1. 查看 Pod 状态
    kubectl get pod 
    kubectl describe pod 
  2. 查看 Pod 事件
    kubectl get events --field-selector involvedObject.name=
  3. 查看容器日志
    kubectl logs 
    kubectl logs  -c 
  4. 查看节点资源
    kubectl describe node 
    kubectl top node
  5. 检查常见错误:
    • ImagePullBackOff - 镜像拉取失败
    • CrashLoopBackOff - 容器启动失败
    • Pending - 资源不足或调度失败
    • OOMKilled - 内存超限

17. 如何配置 Pod 的资源限制?

答案:

# 资源配置示例
apiVersion: v1
kind: Pod
metadata:
  name: resource-pod
spec:
  containers:
  - name: app
    image: myapp
    resources:
      requests:
        memory: "256Mi"
        cpu: "250m"
      limits:
        memory: "512Mi"
        cpu: "500m"

# 关键概念:
# requests - 保证的最小资源
# limits - 允许的最大资源
# 1 CPU = 1000m (millicores)
# 内存单位:Ki, Mi, Gi

18. 解释滚动更新的原理

答案:

滚动更新策略:

  1. 创建新版本的 Pod
  2. 等待新 Pod 就绪
  3. 删除旧版本的 Pod
  4. 重复直到所有 Pod 更新
# 滚动更新配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多超出副本数的 Pod
      maxUnavailable: 0  # 最多不可用的 Pod
  template:
    spec:
      containers:
      - name: app
        image: myapp:v2

# 执行滚动更新
kubectl set image deployment/my-app app=myapp:v2

# 查看更新状态
kubectl rollout status deployment/my-app

# 回滚
kubectl rollout undo deployment/my-app

19-35. 更多进阶题(详细答案略)

题号 题目 答案要点
19 如何配置持久化存储? PV、PVC、StorageClass
20 解释 Ingress 的作用 七层负载均衡,HTTP 路由
21 如何配置 HPA? HorizontalPodAutoscaler
22 解释 Init Container 初始化容器,先于主容器运行
23 如何配置 RBAC? Role、RoleBinding、ServiceAccount
24 解释 Sidecar 模式 辅助容器,增强主容器功能
25 如何配置网络策略? NetworkPolicy
26 解释 PodDisruptionBudget 控制自愿中断的 Pod 数量
27 如何调试 Service? Endpoints、kube-proxy 日志
28 解释 Affinity 和 Taint 节点亲和性和污点
29 如何配置 Pod 安全策略? PodSecurityPolicy/PodSecurityStandard
30 解释 Operator 模式 自动化运维应用
31 如何备份 etcd? etcdctl snapshot save
32 解释 Helm 的作用 包管理器,Chart 模板
33 如何配置多容器 Pod? 共享网络和存储
34 解释 Job 和 CronJob 批处理任务
35 如何监控 K8s 集群? Prometheus、Metrics Server

三、高级架构题(36-50 题)

36. 如何设计高可用的 K8s 集群?

答案:

高可用架构:

  1. 多 Master 节点 - 至少 3 个,避免脑裂
  2. etcd 集群 - 奇数节点(3、5、7)
  3. 负载均衡 - API Server 前加 LB
  4. 多可用区 - 跨 AZ 部署
  5. 节点池 - 分离不同类型工作负载
# 高可用检查清单:
□ 多 Master 节点(至少 3 个)
□ etcd 集群(奇数节点)
□ 负载均衡器(API Server)
□ 多可用区部署
□ 节点自动修复
□ 自动扩缩容
□ 备份和恢复策略
□ 监控和告警

37-50. 高级题(详细答案略)

题号 题目
37 K8s 故障排查思路
38 性能优化最佳实践
39 大规模集群管理
40 多集群管理方案
41 Service Mesh 集成
42 GitOps 实践
43 安全加固措施
44 网络插件选型
45 存储方案对比
46 CI/CD 集成方案
47 监控告警体系
48 日志收集方案
49 灾备和恢复
50 K8s 未来趋势

总结

本文整理了 50 道 Kubernetes 面试题,涵盖基础概念、进阶实战和高级架构。掌握这些知识点,足以应对 DevOps 面试中的 K8s 相关问题。

学习建议:

  1. 理解核心概念(Pod、Service、Deployment)
  2. 动手实践(搭建集群、部署应用)
  3. 深入原理(调度、网络、存储)
  4. 关注生态(Helm、Operator、Service Mesh)

下一篇预告:DevOps 面试题大全(四):CI/CD 持续集成部署 50 题详解

发表回复

后才能评论