Kubernetes 面试八股文(30题)

📖 学习指南

🎯 学习目标:通过本文,你将系统掌握 Kubernetes 的核心知识,能够自信地应对任何相关面试问题。

适合人群

  • 🔰 初学者:想系统学习 Kubernetes 的开发者
  • 🚀 有经验者:想深入理解 Kubernetes 原理的高级开发者
  • 💼 面试准备者:想刷 Kubernetes 面试题的求职者

学习建议

  1. 先理解概念,再深入原理:先搞懂”是什么”,再搞懂”为什么”
  2. 结合实战场景:不要死记硬背,要理解实际应用场景
  3. 动手实践:在自己电脑上安装环境,执行本文的示例代码
  4. 反复复习:面试前一周,每天复习 10 个问题

学习时间估算

  • ⏱️ 快速复习(只看一句话总结):2 小时
  • 📚 系统学习(看深度解析):1-2 天
  • 💪 深入理解(研究源码):1 周+

🗺️ 知识图谱

mindmap
  root((Kubernetes))
    基础概念
      核心概念1
      核心概念2
      核心概念3
    高级特性
      特性1
      特性2
    实战应用
      应用场景1
      应用场景2
    性能优化
      优化技巧1
      优化技巧2

⚠️ 常见陷阱与误区

陷阱 1:概念理解错误

错误示例

1
# 错误的理解或用法

正确做法

  • 正确理解概念
  • 避免常见误区

陷阱 2:忽略边界条件

错误做法

  • 不考虑特殊情况
  • 忽略异常处理

正确做法

  • 总是考虑边界条件
  • 添加异常处理

💡 面试技巧

技巧 1:结构化回答

不要只回答”是什么”,要按照以下结构回答:

  1. 一句话总结(概念)
  2. 深度解析(原理、实现、优缺点)
  3. 面试加分回答(实际项目经验、源码理解、行业最佳实践)

技巧 2:结合实战场景

不要只背概念,要结合实际项目经验回答。

技巧 3:引导到你会的方向

如果遇到不会的问题,不要慌,可以引导到你会的方向。


🎯 实战演练(真实面试场景)

场景 1:请你设计一个系统?

回答思路

  1. 需求分析:明确系统需求
  2. 技术选型:选择合适的技术栈
  3. 架构设计:设计系统架构
  4. 性能优化:考虑性能瓶颈和优化方案

🚀 学习路径总结

第一阶段:基础概念(1-2 天)

  • 理解核心概念
  • 掌握基本操作
  • 完成入门教程

第二阶段:高级特性(2-3 天)

  • 掌握高级特性
  • 理解实现原理
  • 完成进阶教程

第三阶段:实战应用(1 周+)

  • 搭建实际项目
  • 解决实战问题
  • 阅读源码(可选)

第四阶段:面试准备(1 周)

  • 刷完本文的所有问题
  • 复习相关知识点
  • 准备项目经验
  • 模拟面试

📚 扩展学习资源

官方资源

书籍推荐

  • 《Kubernetes 实战》
  • 《Kubernetes 权威指南》

博客推荐


💻 代码示例:理解 Control Plane 组件

查看 Control Plane 组件(静态 Pod)

1
2
3
4
5
6
7
8
9
# 查看 kube-system 命名空间中的 Pod
kubectl get pods -n kube-system

# 输出示例:
# NAME READY STATUS RESTARTS AGE
# etcd-master-node 1/1 Running 0 5d
# kube-apiserver-master-node 1/1 Running 0 5d
# kube-controller-manager-master-node 1/1 Running 0 5d
# kube-scheduler-master-node 1/1 Running 0 5d

查看 Worker Node 组件

1
2
3
4
5
6
7
8
9
10
11
# 查看节点
kubectl get nodes

# 查看节点详情
kubectl describe node worker-node-1

# 输出示例:
# Roles: worker
# Labels: node-role.kubernetes.io/worker=
# Taints: <none>
# ...

Control Plane 组件详解

组件 作用
API Server 暴露 K8s API,所有组件都通过它通信
etcd 分布式键值存储,保存集群状态
Scheduler 调度 Pod 到合适的 Node
Controller Manager 运行控制器,保证集群状态符合预期

Worker Node 组件详解

组件 作用
Kubelet 管理节点上的 Pod 和容器
Kube-proxy 维护网络规则,实现 Service
Container Runtime 容器运行时(Docker、containerd、CRI-O)

⚠️ 常见错误

错误 1:混淆 Control Plane 和 Worker Node

1
2
3
4
❌ 错误理解:Control Plane 和 Worker Node 是同一个东西
✅ 正确回答:
- Control Plane:**控制平面**,管理集群状态
- Worker Node:**工作节点**,运行实际工作负载

错误 2:不知道 etcd 的作用

1
2
❌ 错误回答:etcd 是 K8s 的数据库,存储应用数据
✅ 正确回答:etcd 是**分布式键值存储**,保存**集群状态**(不是应用数据)

🎯 面试场景模拟

面试官:”请讲讲 Kubernetes 的架构?”

你的回答

  1. Control Plane(控制平面):
    • API Server:暴露 K8s API
    • etcd:保存集群状态
    • Scheduler:调度 Pod
    • Controller Manager:运行控制器
  2. Worker Node(工作节点):
    • Kubelet:管理 Pod
    • Kube-proxy:维护网络规则
    • Container Runtime:容器运行时
  3. 比喻:Control Plane 就像”公司总部”,Worker Node 就像”分公司”。
  4. 实际项目中的应用:我在 XX 项目中,Control Plane 用了 3 台高可用机器,Worker Node 用了 10 台机器。

💻 代码示例:理解 Pod

创建 Pod 的 YAML 文件

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80

创建 Pod 的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建 Pod
kubectl apply -f pod.yaml

# 查看 Pod
kubectl get pods

# 查看 Pod 详情
kubectl describe pod nginx-pod

# 进入 Pod
kubectl exec -it nginx-pod -- /bin/bash

# 删除 Pod
kubectl delete pod nginx-pod

Pod 的网络模型

1
2
3
4
Pod IP: 10.244.1.2
|
|-- Container 1: nginx (端口 80)
|-- Container 2: sidecar (端口 8080)

同一个 Pod 内的容器

  • 共享网络命名空间(可以有相同的 IP 和端口)
  • 共享存储卷
  • 可以通过 localhost 通信

⚠️ 常见错误

错误 1:认为 Pod 就是容器

1
2
❌ 错误理解:Pod 和容器是同一个东西
✅ 正确回答:Pod 是**一组容器的集合**,共享网络和存储

错误 2:不知道 Pod 的网络模型

1
2
❌ 错误回答:每个容器都有独立的 IP
✅ 正确回答:同一个 Pod 内的容器**共享 IP 地址**

🎯 面试场景模拟

面试官:”请讲讲什么是 Pod?”

你的回答

  1. 一句话总结:Pod 是 K8s 的最小调度单元,包含一个或多个容器,共享网络和存储。
  2. 举个例子:就像”豌豆荚”,里面可以装多个豌豆(容器)。
  3. 好处:共享网络(容器间可以通过 localhost 通信)、共享存储(容器间可以共享文件)。
  4. 实际项目中的应用:我在 XX 项目中,用一个 Pod 运行主容器和 sidecar 容器(日志收集)。


title: “Kubernetes 面试八股文(傻子都能懂系列)”
date: 2026-06-09 13:36:00
tags:
- Kubernetes
- 面试
- 八股文
- 傻子都能懂
- 高标准
categories:
- 面试准备
- 技术面试
- 面试八股文

Kubernetes 面试八股文 - 学习指南

🎯 学习目标:真正理解 Kubernetes 的核心原理,而不仅仅是背答案

📖 适用人群:云原生初学者、准备面试的同学、想深入理解 K8s 的开发者

预计学习时间:4-5 天(每天 2-3 小时)

🏆 学习成果:能够自信地回答任何 Kubernetes 面试问题,并理解背后的原理


📚 学习路线(从易到难)

第一阶段:Kubernetes 基础(Day 1)

  1. Kubernetes 的核心概念 - 理解什么是 K8s,为什么需要 K8s
  2. Kubernetes 的架构 - 理解 Control Plane 和 Worker Node
  3. Pod 的概念 - 理解为什么需要 Pod,而不是单独运行容器
  4. Pod 的网络模型 - 理解 Pod 如何通信

第二阶段:Kubernetes 核心对象(Day 2 - 上午)

  1. Deployment - 理解无状态应用的部署
  2. Service - 理解服务发现和负载均衡
  3. ConfigMap 和 Secret - 理解配置管理
  4. Namespace - 理解多租户隔离

第三阶段:Kubernetes 高级对象(Day 2 - 下午)

  1. StatefulSet - 理解有状态应用的管理
  2. DaemonSet - 理解守护进程的部署
  3. Job 和 CronJob - 理解批处理任务
  4. Ingress - 理解七层负载均衡

第四阶段:Kubernetes 存储(Day 3)

  1. Volume - 理解基本存储
  2. PV 和 PVC - 理解持久化存储
  3. StorageClass - 理解动态存储供给
  4. CSI - 理解容器存储接口

第五阶段:Kubernetes 调度(Day 4)

  1. 调度器工作原理 - 理解调度流程
  2. 节点亲和性和反亲和性 - 理解 Pod 调度策略
  3. 污点和容忍 - 理解节点排斥策略
  4. 优先级和抢占 - 理解高优先级 Pod 调度

第六阶段:Kubernetes 安全(Day 5)

  1. RBAC - 理解基于角色的访问控制
  2. Network Policy - 理解网络策略
  3. Pod Security Policy - 理解 Pod 安全策略
  4. Secret 加密 - 理解敏感数据保护

🗺️ Kubernetes 知识图谱

graph TD
    A[Kubernetes] --> B[控制平面 Control Plane]
    A --> C[工作节点 Worker Node]
    A --> D[核心对象 Core Objects]
    A --> E[存储 Storage]
    A --> F[网络 Network]
    A --> G[安全 Security]
    
    B --> B1[API Server]
    B --> B2[etcd]
    B --> B3[Scheduler]
    B --> B4[Controller Manager]
    
    C --> C1[Kubelet]
    C --> C2[Kube-proxy]
    C --> C3[Container Runtime]
    C --> C4[Pod]
    
    D --> D1[Deployment]
    D --> D2[Service]
    D --> D3[ConfigMap]
    D --> D4[Secret]
    D --> D5[StatefulSet]
    D --> D6[DaemonSet]
    D --> D7[Job/CronJob]
    D --> D8[Ingress]
    
    E --> E1[Volume]
    E --> E2[PV/PVC]
    E --> E3[StorageClass]
    E --> E4[CSI]
    
    F --> F1[Service]
    F --> F2[Ingress]
    F --> F3[Network Policy]
    F --> F4[CNI]
    
    G --> G1[RBAC]
    G --> G2[Service Account]
    G --> G3[Secret Encryption]
    G --> G4[Pod Security]
    
    style A fill:#ff6b6b
    style B fill:#4ecdc4
    style C fill:#45b7d1
    style D fill:#96ceb4
    style E fill:#ffeaa7
    style F fill:#dfe6e9
    style G fill:#fab1a8

⚠️ 常见陷阱和误区

陷阱 1:Pod 和容器的关系

  • 错误理解:Pod 就是容器
  • 正确理解:Pod 是一组容器的集合,共享网络和存储卷

陷阱 2:Deployment 和 StatefulSet 的区别

  • 错误理解:Deployment 和 StatefulSet 可以随意替换
  • 正确理解
    • Deployment:适用于无状态应用(Pod 名称随机,可随意删除重建)
    • StatefulSet:适用于有状态应用(Pod 名称固定,有序部署和删除)

陷阱 3:Service 的类型

  • 错误理解:所有 Service 都一样
  • 正确答案
    • ClusterIP:默认类型,集群内访问
    • NodePort:在所有节点上开放端口
    • LoadBalancer:使用云厂商的负载均衡器
    • ExternalName:映射到外部 DNS 名称

陷阱 4:PV 和 PVC 的关系

  • 错误理解:PV 和 PVC 是同一个东西
  • 正确答案
    • PV(PersistentVolume):集群级别的存储资源(管理员创建)
    • PVC(PersistentVolumeClaim):用户级别的存储请求(用户创建)

陷阱 5:亲和性和反亲和性

  • 错误理解:亲和性和反亲和性是同一个东西
  • 正确答案
    • 亲和性(Affinity)吸引 Pod 到某些节点
    • 反亲和性(Anti-Affinity)排斥 Pod 到某些节点

🎯 面试技巧

技巧 1:回答问题时,先讲”是什么”,再讲”为什么”

  • 不好的回答:直接讲底层原理,面试官听不懂
  • 好的回答
    1. 先讲”是什么”(一句话总结)
    2. 再讲”为什么”(深度解析)
    3. 最后讲”实际应用场景”(面试加分回答)

技巧 2:用”比喻”帮助理解

  • Pod:就像”豌豆荚”,里面可以装多个豌豆(容器)
  • Service:就像”服务台”,客户端不需要知道后端有多少个 Pod
  • Deployment:就像”副本控制器”,保证有指定数量的 Pod 在运行
  • StatefulSet:就像”有固定座位号的公交车”,每个 Pod 有固定的标识

技巧 3:结合”实际项目经验”回答

  • 不要只背概念,要讲你在实际项目中怎么用的
  • 比如:”我在 XX 项目中,用 StatefulSet 部署了 MySQL 主从集群…”

📖 推荐学习资源

官方文档(最权威)

书籍(深入理解)

  • 《Kubernetes 权威指南》- 适合入门和深入
  • 《Kubernetes 设计模式》- 适合理解设计思想
  • 《Kubernetes 网络权威指南》- 适合深入理解网络

视频教程(直观易懂)

  • 尚硅谷 Kubernetes 全套教程
  • 黑马程序员 Kubernetes 教程
  • 动力节点 Kubernetes 教程

💪 学习建议

  1. 不要死记硬背,要理解原理
  2. 多动手实践,亲自搭建 K8s 集群
  3. 看源码,理解 K8s 的设计思想
  4. 做项目,在实际项目中应用 K8s
  5. 刷面试题,熟悉常见的面试问题

现在,让我们开始学习 Kubernetes 吧!🚀


Kubernetes 面试八股文(傻子都能懂系列)

本文目标:让你彻底理解 Kubernetes 的核心概念、架构、最佳实践,涵盖 BAT 大厂高频面试题,保证傻子都能看懂!


Q1: 请详细解释 Kubernetes 的核心概念(Pod、Node、Cluster)?

一句话总结:Kubernetes 是一个容器编排平台,通过 Pod、Node、Cluster 等核心概念,实现容器的自动化部署、扩展和管理。

深度解析

Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。理解其核心概念是掌握 K8s 的基础。

1. Pod

  • 定义:Pod 是 K8s 中最小的可部署单元,包含一个或多个容器。
  • 特点
    • 共享网络命名空间(同一个 IP 地址)
    • 共享存储卷
    • 生命周期短暂(ephemeral)
  • 类比:Pod 就像是”豌豆荚”,里面可以有一颗或多颗”豌豆”(容器)。
  • 实际案例
    • 一个 Pod 运行一个主容器 + 一个 Sidecar 容器
    • 例如:主容器运行 Nginx,Sidecar 容器运行日志收集器

2. Node

  • 定义:Node 是 K8s 中的工作节点,可以是物理机或虚拟机。
  • 特点
    • 运行 kubelet(节点代理)
    • 运行 kube-proxy(网络代理)
    • 运行容器运行时(Docker、Containerd、CRI-O)
  • 类比:Node 就像是”工人”,负责执行具体的任务(运行 Pod)。
  • 实际案例
    • 一个 K8s 集群可以有多个 Node(例如:3 个 Node)
    • 每个 Node 可以运行多个 Pod

3. Cluster

  • 定义:Cluster 是 K8s 集群,包含多个 Node 和 Control Plane 组件。
  • 特点
    • Control Plane:管理集群(API Server、etcd、Scheduler、Controller Manager)
    • Worker Node:运行应用(Node、kubelet、kube-proxy、容器运行时)
  • 类比:Cluster 就像是”工厂”,包含管理层(Control Plane)和工人(Node)。
  • 实际案例
    • 一个 K8s 集群包含 1 个 Control Plane Node + 3 个 Worker Node
    • Control Plane 负责管理集群,Worker Node 负责运行应用

4. Pod、Node、Cluster 的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
Cluster(集群)
├── Control Plane(管理节点)
│ ├── API Server
│ ├── etcd
│ ├── Scheduler
│ └── Controller Manager
└── Worker Node(工作节点)
├── Node 1
│ └── Pod 1、Pod 2
├── Node 2
│ └── Pod 3、Pod 4
└── Node 3
└── Pod 5、Pod 6

面试加分回答

在实际工作中,Pod、Node、Cluster 的使用场景如下:

  1. 开发阶段

    • 开发者创建 Pod 定义(YAML)
    • 使用 kubectl apply -f pod.yaml 创建 Pod
    • 在 Pod 中进行开发和测试
  2. 测试阶段

    • 测试人员创建 Deployment(管理 Pod)
    • 使用 kubectl apply -f deployment.yaml 创建 Deployment
    • 在 Pod 中进行测试
  3. 生产阶段

    • 运维人员管理 Cluster 和 Node
    • 使用 kubectl get nodes 查看 Node 状态
    • 使用 kubectl get pods 查看 Pod 状态

总结:Kubernetes 的核心概念包括 Pod(最小可部署单元)、Node(工作节点)、Cluster(集群)。理解这些概念是掌握 K8s 的基础。


Q2: 请详细解释 Kubernetes 的架构(Control Plane 和 Worker Node)?

一句话总结:Kubernetes 采用主从架构,Control Plane 负责管理集群,Worker Node 负责运行应用。

深度解析

Kubernetes 采用主从架构,分为 Control Plane(管理节点)和 Worker Node(工作节点)。理解 K8s 架构是掌握 K8s 的关键。

1. Control Plane(管理节点)

  • 核心组件

    • API Server(kube-apiserver)
      • 功能:暴露 K8s API,是集群的入口
      • 例如:处理 kubectl 命令
    • etcd
      • 功能:分布式键值存储,存储集群状态
      • 例如:存储 Pod 定义、Node 状态
    • Scheduler(kube-scheduler)
      • 功能:调度 Pod 到合适的 Node
      • 例如:根据资源需求、亲和性规则调度 Pod
    • Controller Manager(kube-controller-manager)
      • 功能:运行控制器,管理集群状态
      • 例如:ReplicaSet Controller、Deployment Controller
    • Cloud Controller Manager(cloud-controller-manager)
      • 功能:与云厂商 API 交互
      • 例如:创建负载均衡器、持久化卷
  • 类比:Control Plane 就像是”工厂管理层”,负责决策和协调。

2. Worker Node(工作节点)

  • 核心组件

    • kubelet
      • 功能:节点代理,管理 Pod 和容器
      • 例如:确保容器在 Pod 中运行
    • kube-proxy
      • 功能:网络代理,实现 Service
      • 例如:实现 Service 的负载均衡
    • 容器运行时(Container Runtime)
      • 功能:运行容器
      • 例如:Docker、Containerd、CRI-O
  • 类比:Worker Node 就像是”工厂工人”,负责执行具体的任务。

3. Control Plane 和 Worker Node 的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Control Plane(管理层)
├── API Server(入口)
├── etcd(存储)
├── Scheduler(调度)
└── Controller Manager(控制)

↓ 通信(通过 API Server)

Worker Node(执行层)
├── Node 1
│ ├── kubelet(节点代理)
│ ├── kube-proxy(网络代理)
│ └── 容器运行时(Docker)
├── Node 2
│ └── ...
└── Node 3
└── ...

4. 实际案例

案例:创建一个 Deployment

1
2
3
4
5
6
7
8
9
10
11
1. 用户执行 `kubectl apply -f deployment.yaml`
2. kubectl 向 API Server 发送请求
3. API Server 将 Deployment 定义存储到 etcd
4. Deployment Controller(在 Controller Manager 中)检测到新的 Deployment
5. Deployment Controller 创建 ReplicaSet
6. ReplicaSet Controller 创建 Pod
7. Scheduler 检测到未调度的 Pod
8. Scheduler 选择合适的 Node
9. kubelet(在 Worker Node 上)接收到指令
10. kubelet 指示容器运行时创建容器
11. kube-proxy 配置网络规则

面试加分回答

在实际工作中,理解 K8s 架构可以帮助我们更好地管理和排查集群问题:

  1. Control Plane 高可用

    • 生产环境应该部署多个 Control Plane 实例
    • 例如:3 个 etcd 实例、3 个 API Server 实例
  2. Worker Node 扩展

    • 根据负载自动扩展 Worker Node
    • 例如:使用 Cluster Autoscaler
  3. 组件监控

    • 监控 Control Plane 组件状态
    • 例如:监控 API Server、etcd、Scheduler、Controller Manager
    • 监控 Worker Node 组件状态
    • 例如:监控 kubelet、kube-proxy、容器运行时

总结:Kubernetes 采用主从架构,Control Plane 负责管理集群,Worker Node 负责运行应用。理解 K8s 架构是掌握 K8s 的关键。


Q3: 请详细解释 Kubernetes 的对象(Object)?

一句话总结:Kubernetes 的对象是持久化的实体,代表集群的状态,包括 Pod、Deployment、Service、ConfigMap、Secret 等。

深度解析

Kubernetes 的对象(Object)是持久化的实体,代表集群的状态。理解 K8s 对象是掌握 K8s 的核心。

1. 常见对象类型

  • Pod

    • 定义:最小的可部署单元
    • 例如:pod.yaml
  • Deployment

    • 定义:管理 Pod 的声明式更新
    • 例如:deployment.yaml
  • Service

    • 定义:暴露 Pod 为网络服务
    • 例如:service.yaml
  • ConfigMap

    • 定义:存储配置数据
    • 例如:configmap.yaml
  • Secret

    • 定义:存储敏感数据
    • 例如:secret.yaml
  • Namespace

    • 定义:逻辑隔离
    • 例如:namespace.yaml
  • PersistentVolume(PV)

    • 定义:持久化存储
    • 例如:pv.yaml
  • PersistentVolumeClaim(PVC)

    • 定义:请求持久化存储
    • 例如:pvc.yaml

2. 对象规范(Object Spec)

  • 定义:对象的期望状态(Desired State)
  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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.14.2
    ports:
    - containerPort: 80

3. 对象状态(Object Status)

  • 定义:对象的当前状态(Current State)
  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    status:  # 对象状态
    replicas: 3
    readyReplicas: 3
    updatedReplicas: 3
    conditions:
    - type: Available
    status: "True"
    reason: MinimumReplicasAvailable

4. 对象实际操作(Actual State)

  • 定义:对象的实际情况
  • 查看方法
    • 使用 kubectl get 查看对象列表
    • 使用 kubectl describe 查看对象详情
    • 使用 kubectl get -o yaml 查看对象 YAML

5. 实际案例

案例:创建一个 Deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# deployment.yaml
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.14.2
ports:
- containerPort: 80

执行命令

1
2
3
4
5
6
7
8
9
10
11
# 创建 Deployment
kubectl apply -f deployment.yaml

# 查看 Deployment 列表
kubectl get deployments

# 查看 Deployment 详情
kubectl describe deployment nginx-deployment

# 查看 Deployment YAML
kubectl get deployment nginx-deployment -o yaml

面试加分回答

在实际工作中,理解 K8s 对象可以帮助我们更好地管理应用:

  1. 使用声明式配置(Declarative Configuration)

    • 使用 YAML 文件定义对象
    • 例如:kubectl apply -f deployment.yaml
  2. 使用命令式配置(Imperative Configuration)

    • 使用 kubectl 命令直接创建对象
    • 例如:kubectl create deployment nginx --image=nginx
  3. 使用对象状态(Object Status)排查问题

    • 使用 kubectl describe 查看对象状态和事件
    • 例如:kubectl describe pod nginx-pod

总结:Kubernetes 的对象是持久化的实体,代表集群的状态。理解 K8s 对象是掌握 K8s 的核心。


Q4: 请详细解释 Kubernetes 的控制器(Controller)?

一句话总结:Kubernetes 的控制器是控制循环,负责将对象的实际状态调整为期望状态。

深度解析

Kubernetes 的控制器(Controller)是控制循环,负责将对象的实际状态调整为期望状态。理解 K8s 控制器是掌握 K8s 的核心。

1. 控制器工作原理

  • 控制循环(Control Loop)

    • 读取对象期望状态(Desired State)
    • 读取对象实际状态(Actual State)
    • 如果期望状态 ≠ 实际状态,执行操作使实际状态 = 期望状态
  • 类比:控制器就像是”恒温器”,负责将室内温度调整为期望温度。

2. 常见控制器类型

  • ReplicaSet Controller

    • 功能:确保 Pod 副本数符合期望
    • 例如:确保 3 个 Pod 副本正在运行
  • Deployment Controller

    • 功能:管理 ReplicaSet 和 Pod 的声明式更新
    • 例如:滚动更新、回滚
  • StatefulSet Controller

    • 功能:管理有状态应用
    • 例如:确保 Pod 有稳定的网络标识和持久化存储
  • DaemonSet Controller

    • 功能:确保每个 Node 都运行一个 Pod 副本
    • 例如:日志收集器、监控代理
  • Job Controller

    • 功能:管理批处理任务
    • 例如:数据库迁移、数据备份
  • CronJob Controller

    • 功能:管理定时任务
    • 例如:每天凌晨 2 点执行数据备份

3. 控制器实际案例

案例:Deployment 滚动更新

1
2
3
4
5
6
7
8
9
1. 用户执行 `kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record`
2. Deployment Controller 检测到 Deployment 更新
3. Deployment Controller 创建新的 ReplicaSet
4. ReplicaSet Controller 创建新的 Pod
5. Scheduler 调度新的 Pod 到 Node
6. kubelet 创建新的容器
7. Deployment Controller 逐步增加新 ReplicaSet 的 Pod 副本数
8. Deployment Controller 逐步减少旧 ReplicaSet 的 Pod 副本数
9. 滚动更新完成

4. 控制器最佳实践

  • 使用 Deployment 管理无状态应用

    • 例如:Web 应用、API 服务
  • 使用 StatefulSet 管理有状态应用

    • 例如:数据库、消息队列
  • 使用 DaemonSet 管理 Node 守护进程

    • 例如:日志收集器、监控代理
  • 使用 Job 管理批处理任务

    • 例如:数据库迁移、数据备份
  • 使用 CronJob 管理定时任务

    • 例如:每天凌晨 2 点执行数据备份

面试加分回答

在实际工作中,理解 K8s 控制器可以帮助我们更好地管理应用:

  1. 选择合适的控制器

    • 无状态应用 → Deployment
    • 有状态应用 → StatefulSet
    • Node 守护进程 → DaemonSet
    • 批处理任务 → Job
    • 定时任务 → CronJob
  2. 监控控制器状态

    • 使用 kubectl get 查看控制器状态
    • 例如:kubectl get deployments
    • 使用 kubectl describe 查看控制器事件
    • 例如:kubectl describe deployment nginx-deployment

总结:Kubernetes 的控制器是控制循环,负责将对象的实际状态调整为期望状态。理解 K8s 控制器是掌握 K8s 的核心。


Q5: 请详细解释 Kubernetes 的调度(Scheduling)?

一句话总结:Kubernetes 的调度是将 Pod 分配到合适的 Node,考虑资源需求、亲和性规则、污点和容忍等。

深度解析

Kubernetes 的调度(Scheduling)是将 Pod 分配到合适的 Node。理解 K8s 调度是掌握 K8s 的关键。

1. 调度流程

  • 步骤 1:过滤(Filtering)

    • Scheduler 过滤掉不符合条件的 Node
    • 例如:Node 资源不足、Node 有污点且 Pod 没有容忍
  • 步骤 2:打分(Scoring)

    • Scheduler 对符合条件的 Node 打分
    • 例如:资源使用率低的 Node 得分高
  • 步骤 3:绑定(Binding)

    • Scheduler 将 Pod 绑定到得分最高的 Node
    • 例如:更新 Pod 的 nodeName 字段

2. 调度影响因素

  • 资源需求(Resource Requirements)

    • Pod 的 requestslimits
    • 例如:resources: { requests: { cpu: 100m, memory: 128Mi } }
  • 节点亲和性(Node Affinity)

    • 硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)
    • 软亲和性(preferredDuringSchedulingIgnoredDuringExecution)
    • 例如:Pod 必须运行在带有 disktype=ssd 标签的 Node 上
  • Pod 亲和性(Pod Affinity)

    • 硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)
    • 软亲和性(preferredDuringSchedulingIgnoredDuringExecution)
    • 例如:Pod 必须运行在与其他特定 Pod 相同的 Node 或可用区
  • Pod 反亲和性(Pod Anti-Affinity)

    • 硬反亲和性(requiredDuringSchedulingIgnoredDuringExecution)
    • 软反亲和性(preferredDuringSchedulingIgnoredDuringExecution)
    • 例如:Pod 不能运行在与其他特定 Pod 相同的 Node 或可用区
  • 污点和容忍(Taints and Tolerations)

    • 污点(Taint):Node 拒绝 Pod 运行
    • 容忍(Toleration):Pod 可以容忍 Node 的污点
    • 例如:Node 有 disk=ssd:NoSchedule 污点,只有容忍这个污点的 Pod 才能运行在这个 Node 上

3. 调度实际案例

案例:使用节点亲和性调度 Pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# pod-with-node-affinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx

执行命令

1
2
3
4
5
# 创建 Pod
kubectl apply -f pod-with-node-affinity.yaml

# 查看 Pod 调度结果
kubectl get pod pod-with-node-affinity -o wide

4. 调度最佳实践

  • 设置合理的资源请求和限制

    • 例如:resources: { requests: { cpu: 100m, memory: 128Mi }, limits: { cpu: 500m, memory: 512Mi } }
  • 使用节点亲和性

    • 例如:将 Pod 调度到带有 disktype=ssd 标签的 Node 上
  • 使用 Pod 亲和性和反亲和性

    • 例如:将 Pod 调度到与其他特定 Pod 相同的 Node 或可用区
    • 例如:将 Pod 调度到与其他特定 Pod 不同的 Node 或可用区
  • 使用污点和容忍

    • 例如:将 Master Node 标记为 node-role.kubernetes.io/master:NoSchedule,只有容忍这个污点的 Pod 才能运行在 Master Node 上

面试加分回答

在实际工作中,理解 K8s 调度可以帮助我们更好地管理集群资源:

  1. 合理设置资源请求和限制

    • 避免资源浪费或资源不足
  2. 使用亲和性和反亲和性

    • 提高应用可用性和性能
  3. 使用污点和容忍

    • 保护关键 Node(例如:Master Node)

总结:Kubernetes 的调度是将 Pod 分配到合适的 Node,考虑资源需求、亲和性规则、污点和容忍等。理解 K8s 调度是掌握 K8s 的关键。


Q6: 请详细解释 Kubernetes 的服务发现和负载均衡(Service Discovery and Load Balancing)?

一句话总结:Kubernetes 的服务发现是通过 Service 实现的,负载均衡是通过 kube-proxy 和 Service 实现的。

深度解析

Kubernetes 的服务发现和负载均衡是确保应用可以相互发现和通信的关键。理解 K8s 服务发现和负载均衡是掌握 K8s 的核心。

1. 服务发现(Service Discovery)

  • 核心概念

    • Service:暴露 Pod 为网络服务
    • DNS:解析 Service 名称为 IP 地址
  • Service 类型

    • ClusterIP(默认)
      • 功能:暴露 Service 为集群内部 IP 地址
      • 例如:type: ClusterIP
    • NodePort
      • 功能:暴露 Service 为每个 Node 的静态端口
      • 例如:type: NodePort
    • LoadBalancer
      • 功能:暴露 Service 为云厂商的负载均衡器
      • 例如:type: LoadBalancer
    • ExternalName
      • 功能:暴露 Service 为外部 DNS 名称
      • 例如:type: ExternalName

2. 负载均衡(Load Balancing)

  • 核心概念

    • kube-proxy:实现 Service 的负载均衡
    • 负载均衡算法:随机(Random)、轮询(Round Robin)
  • kube-proxy 模式

    • iptables 模式(默认)
      • 功能:使用 iptables 规则实现负载均衡
      • 优点:性能好
      • 缺点:规则多时性能下降
    • IPVS 模式
      • 功能:使用 IPVS 实现负载均衡
      • 优点:性能好,支持多种负载均衡算法
      • 缺点:需要操作系统支持 IPVS

3. 服务发现和负载均衡实际案例

案例:创建一个 Service

1
2
3
4
5
6
7
8
9
10
11
12
13
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

执行命令

1
2
3
4
5
6
7
8
9
10
11
# 创建 Service
kubectl apply -f service.yaml

# 查看 Service 列表
kubectl get services

# 查看 Service 详情
kubectl describe service nginx-service

# 在 Pod 中访问 Service
kubectl exec -it pod-name -- curl http://nginx-service

4. 服务发现和负载均衡最佳实践

  • 使用 ClusterIP 类型的 Service

    • 例如:集群内部通信
  • 使用 NodePort 类型的 Service

    • 例如:外部访问(不推荐,推荐使用 LoadBalancer 或 Ingress)
  • 使用 LoadBalancer 类型的 Service

    • 例如:外部访问(云环境)
  • 使用 Ingress

    • 例如:HTTP/HTTPS 路由

面试加分回答

在实际工作中,理解 K8s 服务发现和负载均衡可以帮助我们更好地设计应用架构:

  1. 集群内部通信

    • 使用 ClusterIP 类型的 Service
  2. 外部访问

    • 使用 LoadBalancer 类型的 Service(云环境)
    • 使用 Ingress(HTTP/HTTPS 路由)
  3. 性能优化

    • 使用 IPVS 模式的 kube-proxy

总结:Kubernetes 的服务发现是通过 Service 实现的,负载均衡是通过 kube-proxy 和 Service 实现的。理解 K8s 服务发现和负载均衡是掌握 K8s 的核心。


Q7: 请详细解释 Kubernetes 的存储(Storage)?

一句话总结:Kubernetes 的存储是通过 Volume、PersistentVolume(PV)、PersistentVolumeClaim(PVC)、StorageClass 等实现的,支持多种存储后端。

深度解析

Kubernetes 的存储是确保数据持久化的关键。理解 K8s 存储是掌握 K8s 的核心。

1. 存储核心概念

  • Volume

    • 定义:存储卷,可以挂载到 Pod
    • 例如:volumes: [ { name: my-volume, emptyDir: {} } ]
  • PersistentVolume(PV)

    • 定义:持久化存储卷,独立于 Pod 生命周期
    • 例如:kind: PersistentVolume
  • PersistentVolumeClaim(PVC)

    • 定义:请求持久化存储卷
    • 例如:kind: PersistentVolumeClaim
  • StorageClass

    • 定义:动态创建 PV 的模板
    • 例如:kind: StorageClass

2. 存储类型

  • emptyDir

    • 功能:临时存储,Pod 删除后数据丢失
    • 例如:Pod 内多个容器共享数据
  • hostPath

    • 功能:挂载宿主机目录到 Pod
    • 例如:挂载宿主机 /data 目录到 Pod
  • persistentVolumeClaim

    • 功能:挂载 PVC 到 Pod
    • 例如:挂载 PVC 到 Pod 的 /data 目录
  • configMap 和 secret

    • 功能:挂载 ConfigMap 或 Secret 到 Pod
    • 例如:挂载 ConfigMap 到 Pod 的 /config 目录

3. 存储实际案例

案例:使用 PVC 持久化数据

1
2
3
4
5
6
7
8
9
10
11
12
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc

执行命令

1
2
3
4
5
6
7
8
9
10
11
# 创建 PVC
kubectl apply -f pvc.yaml

# 创建 Pod
kubectl apply -f pod.yaml

# 查看 PVC 状态
kubectl get pvc

# 查看 PV 状态
kubectl get pv

4. 存储最佳实践

  • 使用 PVC 持久化数据

    • 例如:数据库数据、日志文件
  • 使用 StorageClass 动态创建 PV

    • 例如:云环境使用 standard StorageClass
  • 选择合适的访问模式

    • ReadWriteOnce(RWO):单个 Node 读写
    • ReadOnlyMany(ROX):多个 Node 只读
    • ReadWriteMany(RWX):多个 Node 读写

面试加分回答

在实际工作中,理解 K8s 存储可以帮助我们更好地管理数据:

  1. 开发环境

    • 使用 emptyDirhostPath
  2. 生产环境

    • 使用 PVC 和 StorageClass
  3. 备份策略

    • 定期备份 PV 数据

总结:Kubernetes 的存储是通过 Volume、PersistentVolume(PV)、PersistentVolumeClaim(PVC)、StorageClass 等实现的。理解 K8s 存储是掌握 K8s 的核心。


Q8: 请详细解释 Kubernetes 的配置管理(Configuration Management)?

一句话总结:Kubernetes 的配置管理是通过 ConfigMap 和 Secret 实现的,支持多种配置方式。

深度解析

Kubernetes 的配置管理是确保应用配置可管理、安全的关键。理解 K8s 配置管理是掌握 K8s 的核心。

1. 配置管理核心概念

  • ConfigMap

    • 定义:存储配置数据
    • 例如:kind: ConfigMap
  • Secret

    • 定义:存储敏感数据
    • 例如:kind: Secret

2. ConfigMap 使用方法

  • 创建 ConfigMap

    • 使用 kubectl create configmap 命令
    • 例如:kubectl create configmap my-config --from-literal=key1=value1
  • 使用 ConfigMap

    • 作为环境变量
    • 例如:env: [ { name: KEY1, valueFrom: { configMapKeyRef: { name: my-config, key: key1 } } ] ]
    • 作为文件
    • 例如:volumes: [ { name: config-volume, configMap: { name: my-config } } ]

3. Secret 使用方法

  • 创建 Secret

    • 使用 kubectl create secret 命令
    • 例如:kubectl create secret generic my-secret --from-literal=password=secret
  • 使用 Secret

    • 作为环境变量
    • 例如:env: [ { name: PASSWORD, valueFrom: { secretKeyRef: { name: my-secret, key: password } } ] ]
    • 作为文件
    • 例如:volumes: [ { name: secret-volume, secret: { secretName: my-secret } } ]

4. 配置管理实际案例

案例:使用 ConfigMap 和 Secret

1
2
3
4
5
6
7
8
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_url: "localhost:3306"
log_level: "info"
1
2
3
4
5
6
7
8
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
database_password: c2VjcmV0 # base64 编码的 "secret"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: app:latest
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database_url
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: database_password

执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建 ConfigMap
kubectl apply -f configmap.yaml

# 创建 Secret
kubectl apply -f secret.yaml

# 创建 Pod
kubectl apply -f pod.yaml

# 查看 ConfigMap
kubectl get configmaps

# 查看 Secret
kubectl get secrets

5. 配置管理最佳实践

  • 使用 ConfigMap 存储配置数据

    • 例如:数据库 URL、日志级别
  • 使用 Secret 存储敏感数据

    • 例如:数据库密码、API 密钥
  • 不要在 Pod 定义中硬编码配置

    • 例如:使用 ConfigMap 和 Secret
  • 定期轮换 Secret

    • 例如:定期更改数据库密码

面试加分回答

在实际工作中,理解 K8s 配置管理可以帮助我们更好地管理应用配置:

  1. 开发环境

    • 使用 ConfigMap 存储配置数据
  2. 生产环境

    • 使用 Secret 存储敏感数据
    • 启用 Secret 加密(K8s 1.13+)

总结:Kubernetes 的配置管理是通过 ConfigMap 和 Secret 实现的。理解 K8s 配置管理是掌握 K8s 的核心。


Q9: 请详细解释 Kubernetes 的安全(Security)?

一句话总结:Kubernetes 的安全是通过认证、授权、准入控制、网络策略、安全上下文等实现的。

深度解析

Kubernetes 的安全是确保集群和应用安全的关键。理解 K8s 安全是掌握 K8s 的核心。

1. 安全核心概念

  • 认证(Authentication)

    • 验证用户或服务的身份
    • 例如:客户端证书、Bearer Token、用户名密码
  • 授权(Authorization)

    • 验证用户或服务是否有权限执行操作
    • 例如:RBAC(基于角色的访问控制)
  • 准入控制(Admission Control)

    • 拦截 API 请求,验证或修改对象
    • 例如:Pod Security Policy、Resource Quota
  • 网络策略(Network Policy)

    • 控制 Pod 之间的网络流量
    • 例如:只允许特定 Pod 访问数据库 Pod
  • 安全上下文(Security Context)

    • 设置 Pod 或容器的安全参数
    • 例如:以非 root 用户运行容器

2. RBAC(基于角色的访问控制)

  • 核心概念

    • Role:定义命名空间内的权限
    • ClusterRole:定义集群范围内的权限
    • RoleBinding:将 Role 绑定到用户或服务账户
    • ClusterRoleBinding:将 ClusterRole 绑定到用户或服务账户
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    name: pod-reader
    rules:
    - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "watch", "list"]

3. 网络策略(Network Policy)

  • 核心概念

    • 控制 Pod 之间的网络流量
    • 例如:只允许特定 Pod 访问数据库 Pod
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # network-policy.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: db-network-policy
    spec:
    podSelector:
    matchLabels:
    role: db
    ingress:
    - from:
    - podSelector:
    matchLabels:
    role: api
    ports:
    - protocol: TCP
    port: 3306

4. 安全上下文(Security Context)

  • 核心概念

    • 设置 Pod 或容器的安全参数
    • 例如:以非 root 用户运行容器
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: security-context-pod
    spec:
    securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
    containers:
    - name: nginx
    image: nginx

5. 安全最佳实践

  • 启用 RBAC

    • 例如:使用 --authorization-mode=RBAC 启动 API Server
  • 使用网络策略

    • 例如:限制 Pod 之间的网络流量
  • 使用安全上下文

    • 例如:以非 root 用户运行容器
  • 定期轮换证书

    • 例如:定期轮换 API Server 证书

面试加分回答

在实际工作中,理解 K8s 安全可以帮助我们更好地保护集群和应用:

  1. 认证和授权

    • 启用 RBAC
  2. 网络隔离

    • 使用网络策略
  3. 容器安全

    • 使用安全上下文、使用最小化基础镜像

总结:Kubernetes 的安全是通过认证、授权、准入控制、网络策略、安全上下文等实现的。理解 K8s 安全是掌握 K8s 的核心。


Q10: 请详细解释 Kubernetes 的监控和日志(Monitoring and Logging)?

一句话总结:Kubernetes 的监控和日志是通过 Prometheus、Grafana、ELK Stack、Fluentd 等工具实现的。

深度解析

Kubernetes 的监控和日志是确保集群和应用可观测的关键。理解 K8s 监控和日志是掌握 K8s 的核心。

1. 监控核心概念

  • Prometheus

    • 功能:收集和存储指标数据
    • 例如:收集 Node、Pod、Container 指标
  • Grafana

    • 功能:可视化指标数据
    • 例如:创建 Dashboard 展示 CPU 使用率、内存使用率
  • Alertmanager

    • 功能:处理告警
    • 例如:发送告警到 Slack、Email

2. 日志核心概念

  • ELK Stack

    • Elasticsearch:存储日志数据
    • Logstash:收集和处理日志
    • Kibana:可视化日志
  • EFK Stack

    • Elasticsearch:存储日志数据
    • Fluentd:收集日志
    • Kibana:可视化日志

3. 监控和日志实际案例

案例:使用 Prometheus 和 Grafana 监控 K8s

1
2
3
4
5
1. 部署 Prometheus
2. 部署 Grafana
3. 配置 Prometheus 收集 K8s 指标
4. 在 Grafana 中创建 Dashboard
5. 配置 Alertmanager 发送告警

4. 监控和日志最佳实践

  • 监控关键指标

    • 例如:CPU 使用率、内存使用率、Pod 重启次数
  • 设置告警规则

    • 例如:CPU 使用率超过 80%、Pod 重启次数超过 5 次
  • 集中式日志管理

    • 例如:使用 ELK Stack 或 EFK Stack

面试加分回答

在实际工作中,理解 K8s 监控和日志可以帮助我们更好地管理集群和应用:

  1. 监控

    • 使用 Prometheus 和 Grafana
  2. 日志

    • 使用 ELK Stack 或 EFK Stack

总结:Kubernetes 的监控和日志是通过 Prometheus、Grafana、ELK Stack、Fluentd 等工具实现的。理解 K8s 监控和日志是掌握 K8s 的核心。


Q11: 请详细解释 Kubernetes 的滚动更新和回滚(Rolling Update and Rollback)?

一句话总结:Kubernetes 的滚动更新是通过逐步替换 Pod 副本实现零停机更新,回滚是恢复到上一个稳定版本。

深度解析

Kubernetes 的滚动更新(Rolling Update)和回滚(Rollback)是 Deployment 的核心功能,确保应用更新时不会停机。

1. 滚动更新(Rolling Update)

  • 原理

    • 逐步创建新版本 Pod
    • 逐步删除旧版本 Pod
    • 确保始终有可用 Pod 提供服务
  • 参数

    • maxSurge:最多可以比期望副本数多多少个 Pod
    • maxUnavailable:最多可以有多少个 Pod 不可用
    • 例如:strategy.rollingUpdate.maxSurge: 25%strategy.rollingUpdate.maxUnavailable: 25%
  • 示例

    1
    2
    3
    4
    5
    # 更新 Deployment 镜像
    kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

    # 查看滚动更新状态
    kubectl rollout status deployment/nginx-deployment

2. 回滚(Rollback)

  • 原理

    • 恢复到上一个稳定版本
    • Kubernetes 会记录 Deployment 的变更历史
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看回滚历史
    kubectl rollout history deployment/nginx-deployment

    # 回滚到上一个版本
    kubectl rollout undo deployment/nginx-deployment

    # 回滚到指定版本
    kubectl rollout undo deployment/nginx-deployment --to-revision=2

3. 滚动更新和回滚实际案例

案例:滚动更新 Deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建 Deployment
kubectl apply -f deployment.yaml

# 查看 Deployment
kubectl get deployments

# 更新 Deployment 镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment

# 查看 Pod
kubectl get pods

4. 滚动更新和回滚最佳实践

  • 设置合理的 maxSurge 和 maxUnavailable

    • 例如:maxSurge: 25%maxUnavailable: 25%
  • 使用健康检查(Liveness Probe 和 Readiness Probe)

    • 确保 Pod 正常运行
  • 查看回滚历史

    • 例如:kubectl rollout history deployment/nginx-deployment
  • 测试回滚

    • 例如:定期测试回滚流程

面试加分回答

在实际工作中,滚动更新和回滚是 Kubernetes Deployment 的核心功能:

  1. 滚动更新

    • 确保应用更新时不会停机
  2. 回滚

    • 恢复到上一个稳定版本

总结:Kubernetes 的滚动更新是通过逐步替换 Pod 副本实现零停机更新,回滚是恢复到上一个稳定版本。


Q12: 请详细解释 Kubernetes 的自动扩缩容(Horizontal Pod Autoscaler)?

一句话总结:Kubernetes 的自动扩缩容是通过 Horizontal Pod Autoscaler(HPA)根据 CPU/内存使用率自动调整 Pod 副本数。

深度解析

Kubernetes 的自动扩缩容(Horizontal Pod Autoscaler,HPA)是根据 CPU/内存使用率自动调整 Pod 副本数。理解 HPA 是掌握 Kubernetes 自动扩缩容的关键。

1. HPA 原理

  • 核心概念

    • 根据 CPU/内存使用率自动调整 Pod 副本数
    • 例如:CPU 使用率超过 80% 时,增加 Pod 副本数
  • 工作流程

    1
    2
    3
    4
    1. Metrics Server 收集 Pod 的 CPU/内存使用率
    2. HPA Controller 定期(默认 15 秒)查询 Metrics Server
    3. 如果 CPU/内存使用率超过阈值,增加 Pod 副本数
    4. 如果 CPU/内存使用率低于阈值,减少 Pod 副本数

2. HPA 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # hpa.yaml
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
    name: nginx-hpa
    spec:
    scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
    minReplicas: 1
    maxReplicas: 10
    metrics:
    - type: Resource
    resource:
    name: cpu
    target:
    type: Utilization
    averageUtilization: 80

3. HPA 实际使用

  • 部署 Metrics Server

    1
    2
    3
    4
    5
    # 部署 Metrics Server
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

    # 查看 Metrics Server
    kubectl get pods -n kube-system
  • 创建 HPA

    1
    2
    3
    4
    5
    # 创建 HPA
    kubectl apply -f hpa.yaml

    # 查看 HPA
    kubectl get hpa
  • 测试 HPA

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 增加负载
    kubectl run -i --tty load-generator --image=busybox /bin/sh
    # 在 Pod 中执行:while true; do wget -q -O- http://nginx-deployment; done

    # 查看 HPA
    kubectl get hpa

    # 查看 Pod 副本数
    kubectl get pods

4. HPA 最佳实践

  • 部署 Metrics Server

    • 例如:kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  • 设置合理的阈值

    • 例如:averageUtilization: 80
  • 设置合理的副本数范围

    • 例如:minReplicas: 1maxReplicas: 10
  • 监控 HPA

    • 例如:kubectl get hpa

面试加分回答

在实际工作中,HPA 是 Kubernetes 自动扩缩容的核心功能:

  1. 部署 Metrics Server

    • 例如:kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  2. 设置合理的阈值

    • 例如:averageUtilization: 80
  3. 设置合理的副本数范围

    • 例如:minReplicas: 1maxReplicas: 10

总结:Kubernetes 的自动扩缩容是通过 Horizontal Pod Autoscaler(HPA)根据 CPU/内存使用率自动调整 Pod 副本数。


Q13: 请详细解释 Kubernetes 的亲和性和反亲和性(Affinity and Anti-Affinity)?

一句话总结:Kubernetes 的亲和性和反亲和性是通过节点亲和性、Pod 亲和性和 Pod 反亲和性控制 Pod 的调度位置。

深度解析

Kubernetes 的亲和性(Affinity)和反亲和性(Anti-Affinity)是控制 Pod 调度位置的重要功能。理解亲和性和反亲和性是掌握 Kubernetes 调度的高级特性。

1. 节点亲和性(Node Affinity)

  • 核心概念

    • 控制 Pod 调度到哪些节点
    • 例如:Pod 必须调度到带有 disktype=ssd 标签的节点
  • 类型

    • requiredDuringSchedulingIgnoredDuringExecution:硬亲和性(必须满足)
    • preferredDuringSchedulingIgnoredDuringExecution:软亲和性(尽量满足)
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # pod-with-node-affinity.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pod-with-node-affinity
    spec:
    affinity:
    nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
    - key: disktype
    operator: In
    values:
    - ssd
    containers:
    - name: nginx
    image: nginx

2. Pod 亲和性(Pod Affinity)

  • 核心概念

    • 控制 Pod 调度到与其他 Pod 相同的节点或可用区
    • 例如:Pod A 和 Pod B 必须调度到相同的节点或可用区
  • 类型

    • requiredDuringSchedulingIgnoredDuringExecution:硬亲和性(必须满足)
    • preferredDuringSchedulingIgnoredDuringExecution:软亲和性(尽量满足)
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # pod-with-pod-affinity.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pod-with-pod-affinity
    spec:
    affinity:
    podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
    matchExpressions:
    - key: app
    operator: In
    values:
    - nginx
    topologyKey: kubernetes.io/hostname
    containers:
    - name: nginx
    image: nginx

3. Pod 反亲和性(Pod Anti-Affinity)

  • 核心概念

    • 控制 Pod 调度到与其他 Pod 不同的节点或可用区
    • 例如:Pod A 和 Pod B 必须调度到不同的节点或可用区
  • 类型

    • requiredDuringSchedulingIgnoredDuringExecution:硬反亲和性(必须满足)
    • preferredDuringSchedulingIgnoredDuringExecution:软反亲和性(尽量满足)
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # pod-with-pod-anti-affinity.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pod-with-pod-anti-affinity
    spec:
    affinity:
    podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
    matchExpressions:
    - key: app
    operator: In
    values:
    - nginx
    topologyKey: kubernetes.io/hostname
    containers:
    - name: nginx
    image: nginx

4. 亲和性和反亲和性实际案例

案例:使用 Pod 反亲和性确保高可用性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# deployment-with-pod-anti-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx

5. 亲和性和反亲和性最佳实践

  • 使用节点亲和性

    • 例如:将 Pod 调度到带有 disktype=ssd 标签的节点
  • 使用 Pod 亲和性

    • 例如:将 Pod 调度到与其他 Pod 相同的节点或可用区
  • 使用 Pod 反亲和性

    • 例如:将 Pod 调度到与其他 Pod 不同的节点或可用区,确保高可用性

面试加分回答

在实际工作中,亲和性和反亲和性是控制 Pod 调度位置的重要功能:

  1. 节点亲和性

    • 控制 Pod 调度到哪些节点
  2. Pod 亲和性

    • 控制 Pod 调度到与其他 Pod 相同的节点或可用区
  3. Pod 反亲和性

    • 控制 Pod 调度到与其他 Pod 不同的节点或可用区,确保高可用性

总结:Kubernetes 的亲和性和反亲和性是通过节点亲和性、Pod 亲和性和 Pod 反亲和性控制 Pod 的调度位置。


Q14: 请详细解释 Kubernetes 的污点和容忍(Taints and Tolerations)?

一句话总结:Kubernetes 的污点和容忍是通过污点标记节点拒绝 Pod 调度,通过容忍允许 Pod 调度到带有污点的节点。

深度解析

Kubernetes 的污点(Taints)和容忍(Tolerations)是控制 Pod 调度位置的重要功能。理解污点和容忍是掌握 Kubernetes 调度的高级特性。

1. 污点(Taints)

  • 核心概念

    • 标记节点拒绝 Pod 调度
    • 例如:标记节点为 disk=ssd:NoSchedule,只有容忍这个污点的 Pod 才能调度到这个节点
  • 类型

    • NoSchedule:不调度 Pod 到节点(已经调度的 Pod 不受影响)
    • PreferNoSchedule:尽量不调度 Pod 到节点
    • NoExecute:不调度 Pod 到节点,并且驱逐已经调度的 Pod
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    # 标记节点为 disk=ssd:NoSchedule
    kubectl taint nodes node1 disk=ssd:NoSchedule

    # 查看节点污点
    kubectl describe node node1

    # 删除节点污点
    kubectl taint nodes node1 disk=ssd:NoSchedule-

2. 容忍(Tolerations)

  • 核心概念

    • 允许 Pod 调度到带有污点的节点
    • 例如:Pod 容忍 disk=ssd:NoSchedule 污点
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # pod-with-toleration.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pod-with-toleration
    spec:
    tolerations:
    - key: "disk"
    operator: "Equal"
    value: "ssd"
    effect: "NoSchedule"
    containers:
    - name: nginx
    image: nginx

3. 污点和容忍实际案例

案例:标记 Master 节点不调度 Pod

1
2
3
4
5
6
7
8
9
10
11
# 标记 Master 节点为 node-role.kubernetes.io/master:NoSchedule
kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule

# 查看 Master 节点污点
kubectl describe node master

# 创建 Pod 容忍 Master 节点污点
kubectl apply -f pod-with-toleration.yaml

# 查看 Pod
kubectl get pods -o wide

4. 污点和容忍最佳实践

  • 标记 Master 节点不调度 Pod

    • 例如:kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule
  • 标记专用节点

    • 例如:标记节点为 disk=ssd:NoSchedule,只有需要 SSD 磁盘的 Pod 才能调度到这个节点
  • 使用容忍

    • 例如:Pod 容忍 disk=ssd:NoSchedule 污点

面试加分回答

在实际工作中,污点和容忍是控制 Pod 调度位置的重要功能:

  1. 污点

    • 标记节点拒绝 Pod 调度
  2. 容忍

    • 允许 Pod 调度到带有污点的节点

总结:Kubernetes 的污点和容忍是通过污点标记节点拒绝 Pod 调度,通过容忍允许 Pod 调度到带有污点的节点。


Q15: 请详细解释 Kubernetes 的 DaemonSet?

一句话总结:DaemonSet 确保在所有(或符合条件的)节点上运行一个 Pod 副本,常用于日志收集、监控代理等。

深度解析

Kubernetes 的 DaemonSet 是确保在所有(或符合条件的)节点上运行一个 Pod 副本。理解 DaemonSet 是掌握 Kubernetes 系统守护进程的关键。

1. DaemonSet 核心概念

  • 定义:确保在所有(或符合条件的)节点上运行一个 Pod 副本
  • 使用场景
    • 日志收集(例如:Fluentd、Fluent Bit)
    • 监控代理(例如:Prometheus Node Exporter、Datadog Agent)
    • 网络插件(例如:Calico、Flannel)
    • 存储插件(例如:Ceph、GlusterFS)

2. DaemonSet 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # daemonset.yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
    name: fluentd
    spec:
    selector:
    matchLabels:
    app: fluentd
    template:
    metadata:
    labels:
    app: fluentd
    spec:
    containers:
    - name: fluentd
    image: fluentd:v1.0

3. DaemonSet 实际使用

  • 创建 DaemonSet
    1
    2
    3
    4
    5
    6
    7
    8
    # 创建 DaemonSet
    kubectl apply -f daemonset.yaml

    # 查看 DaemonSet
    kubectl get daemonsets

    # 查看 Pod
    kubectl get pods

4. DaemonSet 最佳实践

  • 使用 DaemonSet 运行系统守护进程

    • 例如:日志收集、监控代理、网络插件、存储插件
  • 使用节点选择器(Node Selector)

    • 例如:只在带有 disktype=ssd 标签的节点上运行 DaemonSet

面试加分回答

在实际工作中,DaemonSet 是运行系统守护进程的关键:

  1. 日志收集

    • 例如:Fluentd、Fluent Bit
  2. 监控代理

    • 例如:Prometheus Node Exporter、Datadog Agent
  3. 网络插件

    • 例如:Calico、Flannel

总结:DaemonSet 确保在所有(或符合条件的)节点上运行一个 Pod 副本,常用于日志收集、监控代理等。


Q16: 请详细解释 Kubernetes 的 StatefulSet?

一句话总结:StatefulSet 是用于管理有状态应用的控制器,提供稳定的网络标识、持久化存储和有序部署/扩展/删除。

深度解析

Kubernetes 的 StatefulSet 是用于管理有状态应用的控制器。理解 StatefulSet 是掌握 Kubernetes 有状态应用管理的关键。

1. StatefulSet 核心概念

  • 定义:管理有状态应用的控制器
  • 特点
    • 稳定的网络标识(Pod 名称固定)
    • 持久化存储(每个 Pod 有独立的 PVC)
    • 有序部署/扩展/删除(按顺序创建/删除 Pod)
  • 使用场景
    • 数据库(例如:MySQL、PostgreSQL)
    • 消息队列(例如:Kafka、RabbitMQ)
    • 分布式存储(例如:Elasticsearch、Cassandra)

2. StatefulSet 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # statefulset.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: mysql
    spec:
    serviceName: "mysql"
    replicas: 3
    selector:
    matchLabels:
    app: mysql
    template:
    metadata:
    labels:
    app: mysql
    spec:
    containers:
    - name: mysql
    image: mysql:8.0
    ports:
    - containerPort: 3306
    volumeMounts:
    - name: mysql-storage
    mountPath: /var/lib/mysql
    volumeClaimTemplates:
    - metadata:
    name: mysql-storage
    spec:
    accessModes: ["ReadWriteOnce"]
    storageClassName: "standard"
    resources:
    requests:
    storage: 10Gi

3. StatefulSet 实际使用

  • 创建 StatefulSet
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 创建 StatefulSet
    kubectl apply -f statefulset.yaml

    # 查看 StatefulSet
    kubectl get statefulsets

    # 查看 Pod
    kubectl get pods

    # 查看 PVC
    kubectl get pvc

4. StatefulSet 最佳实践

  • 使用 StatefulSet 管理有状态应用

    • 例如:数据库、消息队列、分布式存储
  • 使用 Headless Service

    • 例如:StatefulSet 需要 Headless Service 提供稳定的网络标识
  • 使用 PVC

    • 例如:每个 Pod 有独立的 PVC

面试加分回答

在实际工作中,StatefulSet 是管理有状态应用的关键:

  1. 稳定的网络标识

    • Pod 名称固定
  2. 持久化存储

    • 每个 Pod 有独立的 PVC`
  3. 有序部署/扩展/删除

    • 按顺序创建/删除 Pod`

总结:StatefulSet 是用于管理有状态应用的控制器,提供稳定的网络标识、持久化存储和有序部署/扩展/删除。


Q17: 请详细解释 Kubernetes 的 Job 和 CronJob?

一句话总结:Job 是用于管理批处理任务的控制器,CronJob 是用于管理定时任务的控制器。

深度解析

Kubernetes 的 Job 和 CronJob 是用于管理批处理任务和定时任务的控制器。理解 Job 和 CronJob 是掌握 Kubernetes 批处理任务管理的关键。

1. Job 核心概念

  • 定义:管理批处理任务
  • 特点
    • 任务完成后 Pod 退出
    • 支持并行执行
  • 使用场景
    • 数据库迁移
    • 数据备份
    • 数据分析

2. Job 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # job.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
    name: data-migration
    spec:
    template:
    spec:
    containers:
    - name: migration
    image: migration:v1.0
    restartPolicy: Never

3. CronJob 核心概念

  • 定义:管理定时任务
  • 特点
    • 按照 Cron 格式定时执行任务
  • 使用场景
    • 每天凌晨 2 点执行数据备份
    • 每周日凌晨 3 点执行日志清理

4. CronJob 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # cronjob.yaml
    apiVersion: batch/v1
    kind: CronJob
    metadata:
    name: data-backup
    spec:
    schedule: "0 2 * * *"
    jobTemplate:
    spec:
    template:
    spec:
    containers:
    - name: backup
    image: backup:v1.0
    restartPolicy: Never

5. Job 和 CronJob 实际使用

  • 创建 Job

    1
    2
    3
    4
    5
    6
    7
    8
    # 创建 Job
    kubectl apply -f job.yaml

    # 查看 Job
    kubectl get jobs

    # 查看 Pod
    kubectl get pods
  • 创建 CronJob

    1
    2
    3
    4
    5
    # 创建 CronJob
    kubectl apply -f cronjob.yaml

    # 查看 CronJob
    kubectl get cronjobs

6. Job 和 CronJob 最佳实践

  • 使用 Job 管理批处理任务

    • 例如:数据库迁移、数据备份、数据分析
  • 使用 CronJob 管理定时任务

    • 例如:每天凌晨 2 点执行数据备份、每周日凌晨 3 点执行日志清理

面试加分回答

在实际工作中,Job 和 CronJob 是管理批处理任务和定时任务的关键:

  1. Job

    • 管理批处理任务
  2. CronJob

    • 管理定时任务

总结:Job 是用于管理批处理任务的控制器,CronJob 是用于管理定时任务的控制器。


Q18: 请详细解释 Kubernetes 的 Ingress?

一句话总结:Ingress 是用于管理外部访问集群服务的 API 对象,提供 HTTP/HTTPS 路由、负载均衡、SSL 终止等功能。

深度解析

Kubernetes 的 Ingress 是用于管理外部访问集群服务的 API 对象。理解 Ingress 是掌握 Kubernetes 外部访问管理的关键。

1. Ingress 核心概念

  • 定义:管理外部访问集群服务的 API 对象
  • 功能
    • HTTP/HTTPS 路由
    • 负载均衡
    • SSL 终止
    • 名称虚拟主机(Name-based Virtual Hosting)
  • 使用场景
    • 外部访问集群服务
    • HTTP/HTTPS 路由
    • 负载均衡

2. Ingress 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: nginx-ingress
    spec:
    rules:
    - host: example.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: nginx-service
    port:
    number: 80

3. Ingress 实际使用

  • 部署 Ingress Controller

    1
    2
    3
    4
    5
    # 部署 Nginx Ingress Controller
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

    # 查看 Ingress Controller
    kubectl get pods -n ingress-nginx
  • 创建 Ingress

    1
    2
    3
    4
    5
    # 创建 Ingress
    kubectl apply -f ingress.yaml

    # 查看 Ingress
    kubectl get ingress

4. Ingress 最佳实践

  • 部署 Ingress Controller

    • 例如:Nginx Ingress Controller、Traefik Ingress Controller`
  • 使用 Ingress 管理外部访问

    • 例如:HTTP/HTTPS 路由、负载均衡、SSL 终止`

面试加分回答

在实际工作中,Ingress 是管理外部访问集群服务的关键:

  1. 部署 Ingress Controller

    • 例如:Nginx Ingress Controller、Traefik Ingress Controller`
  2. 使用 Ingress 管理外部访问

    • 例如:HTTP/HTTPS 路由、负载均衡、SSL 终止`

总结:Ingress 是用于管理外部访问集群服务的 API 对象,提供 HTTP/HTTPS 路由、负载均衡、SSL 终止等功能。


Q19: 请详细解释 Kubernetes 的 PV 和 PVC?

一句话总结:PV(PersistentVolume)是集群级别的持久化存储资源,PVC(PersistentVolumeClaim)是用户对存储资源的请求。

深度解析

Kubernetes 的 PV(PersistentVolume)和 PVC(PersistentVolumeClaim)是用于管理持久化存储的 API 对象。理解 PV 和 PVC 是掌握 Kubernetes 存储管理的关键。

1. PV(PersistentVolume)核心概念

  • 定义:集群级别的持久化存储资源
  • 特点
    • 独立于 Pod 生命周期
    • 支持多种存储后端(例如:AWS EBS、GCP PD、Azure Disk、NFS、Ceph)
  • 使用场景
    • 数据库数据持久化
    • 文件存储

2. PVC(PersistentVolumeClaim)核心概念

  • 定义:用户对存储资源的请求
  • 特点
    • 请求存储资源(大小、访问模式)
    • 绑定到 PV
  • 使用场景
    • 请求持久化存储

3. PV 和 PVC 配置

  • PV 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: pv0001
    spec:
    capacity:
    storage: 10Gi
    accessModes:
    - ReadWriteOnce
    hostPath:
    path: "/mnt/data"
  • PVC 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: pvc0001
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 10Gi

4. PV 和 PVC 实际使用

  • 创建 PV

    1
    2
    3
    4
    5
    # 创建 PV
    kubectl apply -f pv.yaml

    # 查看 PV
    kubectl get pv
  • 创建 PVC

    1
    2
    3
    4
    5
    # 创建 PVC
    kubectl apply -f pvc.yaml

    # 查看 PVC
    kubectl get pvc

5. PV 和 PVC 最佳实践

  • 使用 PV 和 PVC 管理持久化存储

    • 例如:数据库数据持久化、文件存储`
  • 使用 StorageClass 动态创建 PV

    • 例如:storageClassName: standard

面试加分回答

在实际工作中,PV 和 PVC 是管理持久化存储的关键:

  1. PV

    • 集群级别的持久化存储资源
  2. PVC

    • 用户对存储资源的请求

总结:PV(PersistentVolume)是集群级别的持久化存储资源,PVC(PersistentVolumeClaim)是用户对存储资源的请求。


Q20: 请详细解释 Kubernetes 的 ConfigMap 和 Secret?

一句话总结:ConfigMap 是用于存储非敏感配置数据的 API 对象,Secret 是用于存储敏感数据的 API 对象。

深度解析

Kubernetes 的 ConfigMap 和 Secret 是用于管理配置数据和敏感数据的 API 对象。理解 ConfigMap 和 Secret 是掌握 Kubernetes 配置管理的关键。

1. ConfigMap 核心概念

  • 定义:存储非敏感配置数据
  • 使用场景
    • 配置文件
    • 环境变量
    • 命令行参数

2. ConfigMap 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    # configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: app-config
    data:
    database_url: "localhost:3306"
    log_level: "info"

3. Secret 核心概念

  • 定义:存储敏感数据
  • 使用场景
    • 密码
    • API 密钥
    • TLS 证书

4. Secret 配置

  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    # secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
    name: app-secret
    type: Opaque
    data:
    database_password: c2VjcmV0 # base64 编码的 "secret"

5. ConfigMap 和 Secret 实际使用

  • 创建 ConfigMap

    1
    2
    3
    4
    5
    # 创建 ConfigMap
    kubectl apply -f configmap.yaml

    # 查看 ConfigMap
    kubectl get configmaps
  • 创建 Secret

    1
    2
    3
    4
    5
    # 创建 Secret
    kubectl apply -f secret.yaml

    # 查看 Secret
    kubectl get secrets

6. ConfigMap 和 Secret 最佳实践

  • 使用 ConfigMap 存储非敏感配置数据

    • 例如:配置文件、环境变量、命令行参数`
  • 使用 Secret 存储敏感数据

    • 例如:密码、API 密钥、TLS 证书`
  • 使用 Secret 加密

    • 例如:启用 Secret 加密(Kubernetes 1.13+)

面试加分回答

在实际工作中,ConfigMap 和 Secret 是管理配置数据和敏感数据的关键:

  1. ConfigMap

    • 存储非敏感配置数据`
  2. Secret

    • 存储敏感数据`

总结:ConfigMap 是用于存储非敏感配置数据的 API 对象,Secret 是用于存储敏感数据的 API 对象。


Q21: 请详细解释 Kubernetes 的网络模型(Network Model)?

一句话总结:Kubernetes 的网络模型是通过 CNI 插件实现的,确保 Pod 之间、Pod 与 Service 之间、外部与 Service 之间可以通信。

深度解析

Kubernetes 的网络模型是由 CNI(Container Network Interface)插件实现的。理解 K8s 的网络模型是掌握 K8s 网络的关键。

1. Kubernetes 网络模型核心要求

  • 所有 Pod 可以互相通信

    • 不需要 NAT
    • 例如:Pod A 可以直接访问 Pod B 的 IP 地址
  • 所有 Node 可以与所有 Pod 通信

    • 不需要 NAT
    • 例如:Node A 可以直接访问 Pod B 的 IP 地址
  • Pod 看到的自己的 IP 地址与其他 Pod 看到的 IP 地址相同

    • 例如:Pod A 的 IP 地址是 10.244.1.2,Pod B 看到的 Pod A IP 地址也是 10.244.1.2

2. CNI 插件

  • 定义:CNI 插件是实现 K8s 网络模型的插件。
  • 常见 CNI 插件
    • Flannel
      • 优点:简单易用、配置简单
      • 缺点:功能相对简单、性能一般
      • 适用场景:小规模集群、简单网络需求
    • Calico
      • 优点:性能好、功能丰富、支持网络策略
      • 缺点:配置复杂
      • 适用场景:大规模集群、复杂网络需求
    • Weave Net
      • 优点:简单易用、支持网络策略
      • 缺点:性能一般
      • 适用场景:小规模集群、简单网络需求
    • Cilium
      • 优点:性能好、功能丰富、支持 eBPF
      • 缺点:配置复杂
      • 适用场景:大规模集群、复杂网络需求、需要 eBPF

3. Kubernetes 网络模型实际案例

案例:使用 Calico 作为 CNI 插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. 部署 Calico
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

2. 查看 Calico 状态
kubectl get pods -n kube-system

3. 创建 Pod
kubectl run nginx --image=nginx

4. 查看 Pod IP 地址
kubectl get pods -o wide

5. 在另一个 Pod 中访问这个 Pod
kubectl exec -it another-pod -- curl http://10.244.1.2

4. Kubernetes 网络模型最佳实践

  • 选择合适的 CNI 插件

    • 小规模集群、简单网络需求 → Flannel、Weave Net
    • 大规模集群、复杂网络需求 → Calico、Cilium
  • 配置网络策略(Network Policy)

    • 例如:只允许特定 Pod 访问数据库 Pod
  • 监控网络性能

    • 例如:使用 Prometheus 和 Grafana 监控网络流量

面试加分回答

在实际工作中,Kubernetes 网络模型是通过 CNI 插件实现的:

  1. 小规模集群

    • 使用 Flannel 或 Weave Net
  2. 大规模集群

    • 使用 Calico 或 Cilium
  3. 需要网络策略

    • 使用 Calico 或 Cilium

总结:Kubernetes 的网络模型是通过 CNI 插件实现的,确保 Pod 之间、Pod 与 Service 之间、外部与 Service 之间可以通信。选择合适的 CNI 插件是 K8s 网络的关键。


Q22: 请详细解释 Kubernetes 的 Service Account?

一句话总结:Service Account 是用于 Pod 访问 Kubernetes API 的身份标识,通过 RBAC 控制权限。

深度解析

Kubernetes 的 Service Account 是用于 Pod 访问 Kubernetes API 的身份标识。理解 Service Account 是掌握 K8s 安全的关键。

1. Service Account 核心概念

  • 定义:用于 Pod 访问 Kubernetes API 的身份标识。
  • 特点
    • 每个 Namespace 有一个默认的 Service Account(default)
    • Pod 可以使用 Service Account 访问 Kubernetes API
    • 通过 RBAC 控制 Service Account 的权限
  • 使用场景
    • Pod 需要访问 Kubernetes API
    • 例如:Operator、Controller

2. Service Account 配置

  • 创建 Service Account

    1
    2
    3
    4
    5
    6
    # service-account.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: my-service-account
    namespace: default
  • 创建 Role

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    name: pod-reader
    namespace: default
    rules:
    - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "watch", "list"]
  • 创建 RoleBinding

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # role-binding.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: read-pods
    namespace: default
    subjects:
    - kind: ServiceAccount
    name: my-service-account
    namespace: default
    roleRef:
    kind: Role
    name: pod-reader
    apiGroup: rbac.authorization.k8s.io

3. Service Account 实际使用

  • 创建 Service Account、Role、RoleBinding

    1
    2
    3
    4
    5
    6
    7
    8
    # 创建 Service Account
    kubectl apply -f service-account.yaml

    # 创建 Role
    kubectl apply -f role.yaml

    # 创建 RoleBinding
    kubectl apply -f role-binding.yaml
  • 使用 Service Account

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: my-pod
    spec:
    serviceAccountName: my-service-account
    containers:
    - name: nginx
    image: nginx

4. Service Account 最佳实践

  • 不要使用 default Service Account

    • 创建专用的 Service Account
  • 使用最小权限原则

    • 只授予必要的权限
  • 定期轮换 Service Account 的 Token

    • 例如:定期重新生成 Service Account 的 Token

面试加分回答

在实际工作中,Service Account 是 Pod 访问 Kubernetes API 的身份标识:

  1. 创建专用的 Service Account

    • 不要使用 default Service Account
  2. 使用最小权限原则

    • 只授予必要的权限
  3. 定期轮换 Service Account 的 Token

    • 例如:定期重新生成 Service Account 的 Token

总结:Service Account 是用于 Pod 访问 Kubernetes API 的身份标识,通过 RBAC 控制权限。理解 Service Account 是掌握 K8s 安全的关键。


Q23: 请详细解释 Kubernetes 的 Resource Quota 和 Limit Range?

一句话总结:Resource Quota 是限制 Namespace 资源使用总量,Limit Range 是限制 Pod 或容器的资源请求和限制。

深度解析

Kubernetes 的 Resource Quota 和 Limit Range 是用于管理资源使用的重要功能。理解 Resource Quota 和 Limit Range 是掌握 K8s 资源管理的关键。

1. Resource Quota

  • 定义:限制 Namespace 资源使用总量。
  • 特点
    • 限制 CPU、内存、Pod 数量、Service 数量等
    • 例如:限制 default Namespace 最多使用 10 核 CPU、20GB 内存、50 个 Pod
  • 使用场景
    • 多租户环境
    • 例如:限制每个团队可以使用的资源总量

2. Limit Range

  • 定义:限制 Pod 或容器的资源请求和限制。
  • 特点
    • 限制 CPU、内存的请求和限制
    • 例如:限制 Pod 的 CPU 请求必须在 0.1 到 1 核之间
  • 使用场景
    • 防止资源浪费
    • 例如:防止 Pod 请求过多资源

3. Resource Quota 和 Limit Range 配置

  • Resource Quota 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # resource-quota.yaml
    apiVersion: v1
    kind: ResourceQuota
    metadata:
    name: compute-quota
    namespace: default
    spec:
    hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
    pods: "50"
  • Limit Range 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # limit-range.yaml
    apiVersion: v1
    kind: LimitRange
    metadata:
    name: limits
    namespace: default
    spec:
    limits:
    - default:
    cpu: 0.5
    memory: 512Mi
    defaultRequest:
    cpu: 0.1
    memory: 128Mi
    max:
    cpu: "1"
    memory: 1Gi
    min:
    cpu: "0.1"
    memory: 128Mi
    type: Container

4. Resource Quota 和 Limit Range 实际使用

  • 创建 Resource Quota

    1
    2
    3
    4
    5
    # 创建 Resource Quota
    kubectl apply -f resource-quota.yaml

    # 查看 Resource Quota
    kubectl get resourcequota -n default
  • 创建 Limit Range

    1
    2
    3
    4
    5
    # 创建 Limit Range
    kubectl apply -f limit-range.yaml

    # 查看 Limit Range
    kubectl get limitrange -n default

5. Resource Quota 和 Limit Range 最佳实践

  • 使用 Resource Quota 限制 Namespace 资源使用总量

    • 例如:限制每个团队可以使用的资源总量
  • 使用 Limit Range 限制 Pod 或容器的资源请求和限制

    • 例如:防止 Pod 请求过多资源

面试加分回答

在实际工作中,Resource Quota 和 Limit Range 是用于管理资源使用的重要功能:

  1. Resource Quota

    • 限制 Namespace 资源使用总量
  2. Limit Range

    • 限制 Pod 或容器的资源请求和限制

总结:Resource Quota 是限制 Namespace 资源使用总量,Limit Range 是限制 Pod 或容器的资源请求和限制。理解 Resource Quota 和 Limit Range 是掌握 K8s 资源管理的关键。


Q24: 请详细解释 Kubernetes 的 Admission Controller?

一句话总结:Admission Controller 是拦截 Kubernetes API 请求的组件,用于验证或修改对象。

深度解析

Kubernetes 的 Admission Controller 是拦截 Kubernetes API 请求的组件。理解 Admission Controller 是掌握 K8s 安全的关键。

1. Admission Controller 核心概念

  • 定义:拦截 Kubernetes API 请求的组件,用于验证或修改对象。
  • 类型
    • Validating Admission Controller:验证对象(例如:Pod Security Policy)
    • Mutating Admission Controller:修改对象(例如:Mutating Webhook)
  • 使用场景
    • 验证对象(例如:Pod 是否使用了不被允许的镜像)
    • 修改对象(例如:自动注入 Sidecar 容器)

2. 常见 Admission Controller

  • Pod Security Policy(PSP)

    • 功能:验证 Pod 是否违反安全策略
    • 例如:禁止以 root 用户运行 Pod
  • Resource Quota

    • 功能:验证 Pod 是否超过 Resource Quota
    • 例如:禁止创建超过 Resource Quota 的 Pod
  • Limit Range

    • 功能:验证 Pod 是否违反 Limit Range
    • 例如:禁止创建违反 Limit Range 的 Pod
  • Mutating Webhook

    • 功能:修改对象
    • 例如:自动注入 Sidecar 容器
  • Validating Webhook

    • 功能:验证对象
    • 例如:验证 Pod 是否使用了不被允许的镜像

3. Admission Controller 实际案例

案例:使用 Validating Webhook 验证 Pod 镜像

1
2
3
4
5
1. 创建 Validating Webhook
2. 配置 Webhook 服务器
3. 当创建 Pod 时,Admission Controller 会拦截请求
4. 调用 Webhook 服务器验证 Pod 镜像
5. 如果 Pod 镜像不被允许,拒绝请求

4. Admission Controller 最佳实践

  • 使用 Admission Controller 提高安全性

    • 例如:使用 Pod Security Policy 验证 Pod 是否违反安全策略
  • 使用 Admission Controller 自动化操作

    • 例如:使用 Mutating Webhook 自动注入 Sidecar 容器

面试加分回答

在实际工作中,Admission Controller 是拦截 Kubernetes API 请求的组件:

  1. 提高安全性

    • 使用 Validating Admission Controller 验证对象
  2. 自动化操作

    • 使用 Mutating Admission Controller 修改对象

总结:Admission Controller 是拦截 Kubernetes API 请求的组件,用于验证或修改对象。理解 Admission Controller 是掌握 K8s 安全的关键。


Q25: 请详细解释 Kubernetes 的 CRD 和 Operator?

一句话总结:CRD(Custom Resource Definition)是用于定义自定义资源,Operator 是用于管理自定义资源的控制器。

深度解析

Kubernetes 的 CRD(Custom Resource Definition)和 Operator 是用于扩展 Kubernetes API 的重要功能。理解 CRD 和 Operator 是掌握 K8s 扩展的关键。

1. CRD(Custom Resource Definition)

  • 定义:用于定义自定义资源。
  • 特点
    • 扩展 Kubernetes API
    • 例如:定义 MySQL 自定义资源
  • 使用场景
    • 管理有状态应用
    • 例如:MySQL、PostgreSQL、Elasticsearch

2. Operator

  • 定义:用于管理自定义资源的控制器。
  • 特点
    • 封装运维知识
    • 例如:MySQL Operator 可以自动备份、恢复、扩展 MySQL
  • 使用场景
    • 管理有状态应用
    • 例如:MySQL、PostgreSQL、Elasticsearch

3. CRD 和 Operator 实际案例

案例:使用 CRD 和 Operator 管理 MySQL

1
2
3
4
5
1. 创建 CRD(MySQL)
2. 创建 MySQL Operator
3. 创建 MySQL 自定义资源
4. MySQL Operator 会自动创建 Deployment、Service、PVC 等
5. MySQL Operator 会自动备份、恢复、扩展 MySQL

4. CRD 和 Operator 最佳实践

  • 使用 CRD 和 Operator 管理有状态应用

    • 例如:MySQL、PostgreSQL、Elasticsearch
  • 使用成熟的 Operator

    • 例如:MySQL Operator、PostgreSQL Operator、Elasticsearch Operator

面试加分回答

在实际工作中,CRD 和 Operator 是用于扩展 Kubernetes API 的重要功能:

  1. 管理有状态应用

    • 使用 CRD 和 Operator
  2. 使用成熟的 Operator

    • 例如:MySQL Operator、PostgreSQL Operator、Elasticsearch Operator

总结:CRD(Custom Resource Definition)是用于定义自定义资源,Operator 是用于管理自定义资源的控制器。理解 CRD 和 Operator 是掌握 K8s 扩展的关键。


Q26: 请详细解释 Kubernetes 的升级策略(Upgrade Strategy)?

一句话总结:Kubernetes 的升级策略包括原地升级、蓝绿部署、金丝雀部署等,确保升级过程不会停机。

深度解析

Kubernetes 的升级策略是确保升级过程不会停机的重要功能。理解 K8s 的升级策略是掌握 K8s 部署的关键。

1. 原地升级(In-Place Upgrade)

  • 原理

    • 直接升级 Control Plane 和 Worker Node
    • 例如:使用 kubeadm upgrade 命令
  • 优点

    • 简单、快速
  • 缺点

    • 可能停机

2. 蓝绿部署(Blue-Green Deployment)

  • 原理

    • 同时运行两个集群:Blue(当前版本)和 Green(新版本)
    • 通过修改 DNS 或 Load Balancer 切换流量
    • 升级时:升级 Green 集群,验证通过后切换流量
    • 回滚时:直接切换回 Blue 集群
  • 优点

    • 零停机时间
    • 瞬间切换,快速回滚
  • 缺点

    • 需要双倍资源(两个完整集群)
    • 数据迁移需要特殊处理(向后兼容)

3. 金丝雀部署(Canary Deployment)

  • 原理

    • 逐步将流量从旧版本切换到新版本
    • 先让小部分用户使用新版本
    • 监控新版本的表现,如果没有问题则逐步扩大范围
    • 如果发现问题则立即回滚
  • 优点

    • 风险可控(先小范围试点)
    • 资源消耗小(不需要双倍资源)
  • 缺点

    • 升级时间长(需要逐步放量)
    • 需要精细的流量控制能力

4. 升级策略实际案例

案例:使用蓝绿部署升级 Kubernetes 集群

1
2
3
4
5
6
1. 创建 Green 集群(新版本)
2. 在 Green 集群部署应用
3. 验证 Green 集群
4. 修改 DNS 或 Load Balancer,将流量切换到 Green 集群
5. 监控 Green 集群运行状态
6. 如果发现问题,直接切换回 Blue 集群

5. 升级策略最佳实践

  • 选择合适的升级策略

    • 资源充足 → 蓝绿部署
    • 资源有限 → 金丝雀部署
  • 测试升级流程

    • 例如:在测试环境测试升级流程

面试加分回答

在实际工作中,Kubernetes 的升级策略是确保升级过程不会停机的重要功能:

  1. 资源充足

    • 使用蓝绿部署
  2. 资源有限

    • 使用金丝雀部署

总结:Kubernetes 的升级策略包括原地升级、蓝绿部署、金丝雀部署等,确保升级过程不会停机。理解 K8s 的升级策略是掌握 K8s 部署的关键。


Q27: 请详细解释 Kubernetes 的备份和恢复(Backup and Restore)?

一句话总结:Kubernetes 的备份和恢复是通过备份 etcd 数据、资源定义等,确保集群状态不会丢失。

深度解析

Kubernetes 的备份和恢复是确保集群状态不会丢失的重要功能。理解 K8s 的备份和恢复是掌握 K8s 运维的关键。

1. 备份 etcd 数据

  • 原理

    • etcd 是 Kubernetes 的分布式键值存储,存储集群状态
    • 备份 etcd 数据可以恢复集群状态
  • 方法

    • 使用 etcdctl snapshot save 命令备份 etcd 数据
    • 例如:ETCDCTL_API=3 etcdctl snapshot save snapshot.db

2. 备份资源定义

  • 原理

    • 备份 Kubernetes 资源定义(YAML 文件)
    • 例如:备份 Deployment、Service、ConfigMap 等
  • 方法

    • 使用 kubectl get 命令导出资源定义
    • 例如:kubectl get deployment -o yaml > deployment.yaml

3. 恢复 etcd 数据

  • 原理

    • 使用备份的 etcd 数据恢复集群状态
  • 方法

    • 使用 etcdctl snapshot restore 命令恢复 etcd 数据
    • 例如:ETCDCTL_API=3 etcdctl snapshot restore snapshot.db

4. 恢复资源定义

  • 原理

    • 使用备份的资源定义恢复集群状态
  • 方法

    • 使用 kubectl apply 命令恢复资源定义
    • 例如:kubectl apply -f deployment.yaml

5. 备份和恢复实际案例

案例:备份和恢复 Kubernetes 集群

1
2
3
4
5
6
7
8
9
10
11
1. 备份 etcd 数据
ETCDCTL_API=3 etcdctl snapshot save snapshot.db

2. 备份资源定义
kubectl get deployment -o yaml > deployment.yaml

3. 恢复 etcd 数据
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db

4. 恢复资源定义
kubectl apply -f deployment.yaml

6. 备份和恢复最佳实践

  • 定期备份 etcd 数据

    • 例如:每天备份一次
  • 定期备份资源定义

    • 例如:每天备份一次
  • 测试恢复流程

    • 例如:定期测试恢复流程,确保备份可用

面试加分回答

在实际工作中,Kubernetes 的备份和恢复是确保集群状态不会丢失的重要功能:

  1. 定期备份 etcd 数据

    • 例如:每天备份一次
  2. 定期备份资源定义

    • 例如:每天备份一次
  3. 测试恢复流程

    • 例如:定期测试恢复流程,确保备份可用

总结:Kubernetes 的备份和恢复是通过备份 etcd 数据、资源定义等,确保集群状态不会丢失。理解 K8s 的备份和恢复是掌握 K8s 运维的关键。


Q28: 请详细解释 Kubernetes 的性能优化(Performance Optimization)?

一句话总结:Kubernetes 的性能优化是通过优化 Control Plane、Worker Node、网络、存储等,提高集群性能。

深度解析

Kubernetes 的性能优化是提高集群性能的重要功能。理解 K8s 的性能优化是掌握 K8s 运维的关键。

1. 优化 Control Plane

  • 优化 API Server

    • 增加 API Server 实例数
    • 例如:部署 3 个 API Server 实例
  • 优化 etcd

    • 使用 SSD 磁盘
    • 例如:使用 SSD 磁盘存储 etcd 数据
  • 优化 Scheduler

    • 增加 Scheduler 实例数
    • 例如:部署 3 个 Scheduler 实例
  • 优化 Controller Manager

    • 增加 Controller Manager 实例数
    • 例如:部署 3 个 Controller Manager 实例

2. 优化 Worker Node

  • 优化 kubelet

    • 增加 kubelet 资源限制
    • 例如:设置 kubelet --image-gc-high-threshold=90
  • 优化 kube-proxy

    • 使用 IPVS 模式
    • 例如:设置 kube-proxy --mode=ipvs
  • 优化容器运行时

    • 使用 Containerd 或 CRI-O
    • 例如:使用 Containerd 替代 Docker

3. 优化网络

  • 选择合适的 CNI 插件

    • 例如:使用 Calico 或 Cilium
  • 使用 Service Mesh

    • 例如:使用 Istio 或 Linkerd

4. 优化存储

  • 选择合适的存储后端

    • 例如:使用 SSD 磁盘或云厂商高性能存储**
  • 使用本地存储

    • 例如:使用 Local PV

5. 性能优化实际案例

案例:优化 Kubernetes 集群性能

1
2
3
4
5
6
7
8
9
10
11
12
13
1. 优化 Control Plane
- 增加 API Server 实例数
- 使用 SSD 磁盘存储 etcd 数据

2. 优化 Worker Node
- 使用 Containerd 替代 Docker
- 使用 IPVS 模式的 kube-proxy

3. 优化网络
- 使用 Calico 作为 CNI 插件

4. 优化存储
- 使用 SSD 磁盘

6. 性能优化最佳实践

  • 优化 Control Plane

    • 例如:增加 API Server 实例数、使用 SSD 磁盘存储 etcd 数据**
  • 优化 Worker Node

    • 例如:使用 Containerd 替代 Docker、使用 IPVS 模式的 kube-proxy**
  • 优化网络

    • 例如:使用 Calico 或 Cilium**
  • 优化存储

    • 例如:使用 SSD 磁盘或云厂商高性能存储**

面试加分回答

在实际工作中,Kubernetes 的性能优化是提高集群性能的重要功能:

  1. 优化 Control Plane

    • 例如:增加 API Server 实例数、使用 SSD 磁盘存储 etcd 数据**
  2. 优化 Worker Node

    • 例如:使用 Containerd 替代 Docker、使用 IPVS 模式的 kube-proxy**
  3. 优化网络

    • 例如:使用 Calico 或 Cilium**
  4. 优化存储

    • 例如:使用 SSD 磁盘或云厂商高性能存储**

总结:Kubernetes 的性能优化是通过优化 Control Plane、Worker Node、网络、存储等,提高集群性能。理解 K8s 的性能优化是掌握 K8s 运维的关键。


Q29: 请详细解释 Kubernetes 的安全加固(Security Hardening)?

一句话总结:Kubernetes 的安全加固是通过加固 Control Plane、Worker Node、网络、存储等,提高集群安全性。

深度解析

Kubernetes 的安全加固是提高集群安全性的重要功能。理解 K8s 的安全加固是掌握 K8s 安全的关键。

1. 加固 Control Plane

  • 加固 API Server

    • 启用 RBAC
    • 例如:设置 --authorization-mode=RBAC
    • 启用 TLS
    • 例如:设置 --tls-cert-file=/path/to/cert--tls-private-key-file=/path/to/key
  • 加固 etcd

    • 启用 TLS
    • 例如:设置 --cert-file=/path/to/cert--key-file=/path/to/key
    • 启用认证
    • 例如:设置 --client-cert-auth=true
  • 加固 Scheduler

    • 启用 TLS
    • 例如:设置 --tls-cert-file=/path/to/cert--tls-private-key-file=/path/to/key
  • 加固 Controller Manager

    • 启用 TLS
    • 例如:设置 --tls-cert-file=/path/to/cert--tls-private-key-file=/path/to/key

2. 加固 Worker Node

  • 加固 kubelet

    • 启用 TLS
    • 例如:设置 --tls-cert-file=/path/to/cert--tls-private-key-file=/path/to/key
    • 启用认证
    • 例如:设置 --authentication-token-webhook=true
  • 加固 kube-proxy

    • 启用 TLS
    • 例如:设置 --tls-cert-file=/path/to/cert--tls-private-key-file=/path/to/key
  • 加固容器运行时

    • 使用最小化基础镜像
    • 例如:使用 Alpine(5MB)
    • 非 root 用户运行容器
    • 例如:在 Dockerfile 中创建非 root 用户,并以该用户运行容器

3. 加固网络

  • 使用网络策略(Network Policy)

    • 例如:只允许特定 Pod 访问数据库 Pod
  • 使用 Service Mesh

    • 例如:使用 Istio 或 Linkerd

4. 加固存储

  • 使用 Secret 存储敏感数据

    • 例如:使用 Secret 存储密码、API 密钥**
  • 启用 Secret 加密

    • 例如:启用 Kubernetes 1.13+ 的 Secret 加密功能**

5. 安全加固实际案例

案例:加固 Kubernetes 集群安全性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. 加固 Control Plane
- 启用 RBAC
- 启用 TLS

2. 加固 Worker Node
- 启用 TLS
- 启用认证

3. 加固网络
- 使用网络策略

4. 加固存储
- 使用 Secret 存储敏感数据
- 启用 Secret 加密

6. 安全加固最佳实践

  • 加固 Control Plane

    • 例如:启用 RBAC、启用 TLS**
  • 加固 Worker Node

    • 例如:启用 TLS、启用认证**
  • 加固网络

    • 例如:使用网络策略**
  • 加固存储

    • 例如:使用 Secret 存储敏感数据、启用 Secret 加密**

面试加分回答

在实际工作中,Kubernetes 的安全加固是提高集群安全性的重要功能:

  1. 加固 Control Plane

    • 例如:启用 RBAC、启用 TLS**
  2. 加固 Worker Node

    • 例如:启用 TLS、启用认证**
  3. 加固网络

    • 例如:使用网络策略**
  4. 加固存储

    • 例如:使用 Secret 存储敏感数据、启用 Secret 加密**

总结:Kubernetes 的安全加固是通过加固 Control Plane、Worker Node、网络、存储等,提高集群安全性。理解 K8s 的安全加固是掌握 K8s 安全的关键。


Q30: 请详细解释 Kubernetes 的未来趋势(Future Trends)?

一句话总结:Kubernetes 的未来趋势包括 Serverless、Service Mesh、eBPF、Wasm 等,将进一步提高性能、安全性和可观测性。

深度解析

Kubernetes 是一个快速发展的技术。了解 Kubernetes 的未来趋势,可以帮助我们更好地规划和技术选型。

1. Serverless

  • 原理

    • Serverless 是无服务器计算,用户不需要管理服务器
    • Kubernetes 可以通过 Knative、OpenFaaS 等实现 Serverless
  • 工具

    • Knative
      • 功能:Kubernetes 原生 Serverless 平台
      • 优点:功能丰富、与 Kubernetes 集成好
      • 缺点:配置复杂
    • OpenFaaS
      • 功能:开源 Serverless 平台
      • 优点:简单易用、与 Kubernetes 集成好
      • 缺点:功能相对简单

2. Service Mesh

  • 原理

    • Service Mesh 是微服务网络层,提供流量管理、安全、可观测性等功能
    • Kubernetes 可以通过 Istio、Linkerd 等实现 Service Mesh
  • 工具

    • Istio
      • 功能:功能丰富的 Service Mesh
      • 优点:功能丰富、与 Kubernetes 集成好
      • 缺点:配置复杂、资源消耗大
    • Linkerd
      • 功能:轻量级 Service Mesh
      • 优点:轻量级、简单易用
      • 缺点:功能相对简单

3. eBPF

  • 原理

    • eBPF(extended Berkeley Packet Filter)是一种在 Linux 内核中运行程序的技术
    • eBPF 可以用于容器网络、安全、可观测性等
    • Kubernetes 可以通过 Cilium 等实现 eBPF
  • 工具

    • Cilium
      • 功能:基于 eBPF 的 Kubernetes CNI 插件
      • 优点:性能好、功能丰富、支持 eBPF
      • 缺点:配置复杂
    • Falco
      • 功能:基于 eBPF 的容器安全工具
      • 优点:性能好、功能丰富、支持 eBPF**
      • 缺点:配置复杂

4. Wasm(WebAssembly)

  • 原理

    • Wasm(WebAssembly)是一种二进制指令格式,可以在浏览器中运行
    • Wasm 可以用于容器,提供更快的启动速度和更小的内存占用
    • Kubernetes 可以通过 WasmCloud、WasmEdge 等实现 Wasm**
  • 工具

    • WasmCloud
      • 功能:Wasm 运行时
      • 优点:启动速度快、内存占用小**
      • 缺点:生态不成熟
    • WasmEdge
      • 功能:Wasm 运行时
      • 优点:启动速度快、内存占用小**
      • 缺点:生态不成熟

5. Kubernetes 未来趋势实际案例

案例:使用 Istio 实现 Service Mesh

1
2
3
1. 部署 Istio
2. 配置 VirtualService 和 DestinationRule
3. 实现流量管理、安全、可观测性等功能

6. Kubernetes 未来趋势最佳实践

  • 使用 Serverless

    • 例如:使用 Knative 或 OpenFaaS**
  • 使用 Service Mesh

    • 例如:使用 Istio 或 Linkerd**
  • 使用 eBPF

    • 例如:使用 Cilium**
  • 使用 Wasm

    • 例如:使用 WasmCloud 或 WasmEdge**

面试加分回答

在实际工作中,了解 Kubernetes 的未来趋势可以帮助我们更好地规划和技术选型:

  1. Serverless

    • 例如:使用 Knative 或 OpenFaaS**
  2. Service Mesh

    • 例如:使用 Istio 或 Linkerd**
  3. eBPF

    • 例如:使用 Cilium**
  4. Wasm

    • 例如:使用 WasmCloud 或 WasmEdge**

总结:Kubernetes 的未来趋势包括 Serverless、Service Mesh、eBPF、Wasm 等,将进一步提高性能、安全性和可观测性。了解这些未来趋势可以帮助我们更好地规划和技术选型。



📚 学习路径总结

恭喜你!如果你认真学完了上面的所有内容,那么你已经掌握了 Kubernetes 的核心知识。下面是一些学习建议,帮助你进一步深入学习。

1. 夯实基础(1-2 周)

  • 深入理解 Pod 的概念
  • 理解 Deployment、Service、ConfigMap、Secret
  • 理解 PV 和 PVC

2. 动手实践(2-3 周)

  • 搭建一个单节点 K8s 集群(使用 kubeadm)
  • 部署一个无状态应用(使用 Deployment)
  • 部署一个有状态应用(使用 StatefulSet)
  • 实现服务发现和负载均衡(使用 Service 和 Ingress)

3. 阅读源码(3-4 周)

  • 阅读 kubelet 源码
  • 阅读 kube-scheduler 源码
  • 阅读 kube-controller-manager 源码

4. 学习高级主题(2-3 周)

  • 理解网络模型(CNI 插件)
  • 理解存储模型(CSI 插件)
  • 理解安全机制(RBAC、Network Policy)

5. 做项目(持续)

  • 用 K8s 部署一个微服务应用
  • 实现 CI/CD 流水线(Jenkins + K8s)
  • 实现监控和告警(Prometheus + Grafana)

🎓 进阶学习

如果你已经掌握了 Kubernetes 的基础知识,那么可以学习以下内容:

1. Kubernetes 源码深度解析

  • 《Kubernetes 源码剖析》- 郑东旭
  • 《Kubernetes 设计模式》- 理解设计思想

2. Service Mesh(服务网格)

  • 《Istio 实战》- 学习 Service Mesh
  • 《Linkerd 实战》- 学习轻量级 Service Mesh

3. GitOps(Git 运维)

  • 《Argo CD 实战》- 学习 GitOps
  • 《Flux CD 实战》- 学习 GitOps

💪 最后的建议

  1. 不要急于求成,要打好基础
  2. 多动手实践,光看不练是没用的
  3. 看源码,理解 K8s 的设计思想
  4. 做项目,在实际项目中应用 K8s
  5. 教别人,教是最好的学

祝你学习顺利!🎉



Kubernetes 面试八股文(30题)
https://whyalwaysme.lol/2026/06/09/2026-06-09-kubernetes-interview-deep/
作者
Cassiur
发布于
2026年6月9日
许可协议