Kubernetes 面试八股文(30题)
📖 学习指南
🎯 学习目标:通过本文,你将系统掌握 Kubernetes 的核心知识,能够自信地应对任何相关面试问题。
适合人群
- 🔰 初学者:想系统学习 Kubernetes 的开发者
- 🚀 有经验者:想深入理解 Kubernetes 原理的高级开发者
- 💼 面试准备者:想刷 Kubernetes 面试题的求职者
学习建议
- 先理解概念,再深入原理:先搞懂”是什么”,再搞懂”为什么”
- 结合实战场景:不要死记硬背,要理解实际应用场景
- 动手实践:在自己电脑上安装环境,执行本文的示例代码
- 反复复习:面试前一周,每天复习 10 个问题
学习时间估算
- ⏱️ 快速复习(只看一句话总结):2 小时
- 📚 系统学习(看深度解析):1-2 天
- 💪 深入理解(研究源码):1 周+
🗺️ 知识图谱
mindmap
root((Kubernetes))
基础概念
核心概念1
核心概念2
核心概念3
高级特性
特性1
特性2
实战应用
应用场景1
应用场景2
性能优化
优化技巧1
优化技巧2
⚠️ 常见陷阱与误区
陷阱 1:概念理解错误
❌ 错误示例:
1 | |
✅ 正确做法:
- 正确理解概念
- 避免常见误区
陷阱 2:忽略边界条件
❌ 错误做法:
- 不考虑特殊情况
- 忽略异常处理
✅ 正确做法:
- 总是考虑边界条件
- 添加异常处理
💡 面试技巧
技巧 1:结构化回答
不要只回答”是什么”,要按照以下结构回答:
- 一句话总结(概念)
- 深度解析(原理、实现、优缺点)
- 面试加分回答(实际项目经验、源码理解、行业最佳实践)
技巧 2:结合实战场景
不要只背概念,要结合实际项目经验回答。
技巧 3:引导到你会的方向
如果遇到不会的问题,不要慌,可以引导到你会的方向。
🎯 实战演练(真实面试场景)
场景 1:请你设计一个系统?
回答思路:
- 需求分析:明确系统需求
- 技术选型:选择合适的技术栈
- 架构设计:设计系统架构
- 性能优化:考虑性能瓶颈和优化方案
🚀 学习路径总结
第一阶段:基础概念(1-2 天)
- 理解核心概念
- 掌握基本操作
- 完成入门教程
第二阶段:高级特性(2-3 天)
- 掌握高级特性
- 理解实现原理
- 完成进阶教程
第三阶段:实战应用(1 周+)
- 搭建实际项目
- 解决实战问题
- 阅读源码(可选)
第四阶段:面试准备(1 周)
- 刷完本文的所有问题
- 复习相关知识点
- 准备项目经验
- 模拟面试
📚 扩展学习资源
官方资源
书籍推荐
- 《Kubernetes 实战》
- 《Kubernetes 权威指南》
博客推荐
💻 代码示例:理解 Control Plane 组件
查看 Control Plane 组件(静态 Pod):
1 | |
查看 Worker Node 组件:
1 | |
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:不知道 etcd 的作用
1 | |
🎯 面试场景模拟
面试官:”请讲讲 Kubernetes 的架构?”
你的回答:
- Control Plane(控制平面):
API Server:暴露 K8s APIetcd:保存集群状态Scheduler:调度 PodController Manager:运行控制器
- Worker Node(工作节点):
Kubelet:管理 PodKube-proxy:维护网络规则Container Runtime:容器运行时
- 比喻:Control Plane 就像”公司总部”,Worker Node 就像”分公司”。
- 实际项目中的应用:我在 XX 项目中,Control Plane 用了 3 台高可用机器,Worker Node 用了 10 台机器。
💻 代码示例:理解 Pod
创建 Pod 的 YAML 文件:
1 | |
创建 Pod 的命令:
1 | |
Pod 的网络模型:
1 | |
同一个 Pod 内的容器:
- 共享网络命名空间(可以有相同的 IP 和端口)
- 共享存储卷
- 可以通过
localhost通信
⚠️ 常见错误
错误 1:认为 Pod 就是容器
1 | |
错误 2:不知道 Pod 的网络模型
1 | |
🎯 面试场景模拟
面试官:”请讲讲什么是 Pod?”
你的回答:
- 一句话总结:Pod 是 K8s 的最小调度单元,包含一个或多个容器,共享网络和存储。
- 举个例子:就像”豌豆荚”,里面可以装多个豌豆(容器)。
- 好处:共享网络(容器间可以通过 localhost 通信)、共享存储(容器间可以共享文件)。
- 实际项目中的应用:我在 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)
- Kubernetes 的核心概念 - 理解什么是 K8s,为什么需要 K8s
- Kubernetes 的架构 - 理解 Control Plane 和 Worker Node
- Pod 的概念 - 理解为什么需要 Pod,而不是单独运行容器
- Pod 的网络模型 - 理解 Pod 如何通信
第二阶段:Kubernetes 核心对象(Day 2 - 上午)
- Deployment - 理解无状态应用的部署
- Service - 理解服务发现和负载均衡
- ConfigMap 和 Secret - 理解配置管理
- Namespace - 理解多租户隔离
第三阶段:Kubernetes 高级对象(Day 2 - 下午)
- StatefulSet - 理解有状态应用的管理
- DaemonSet - 理解守护进程的部署
- Job 和 CronJob - 理解批处理任务
- Ingress - 理解七层负载均衡
第四阶段:Kubernetes 存储(Day 3)
- Volume - 理解基本存储
- PV 和 PVC - 理解持久化存储
- StorageClass - 理解动态存储供给
- CSI - 理解容器存储接口
第五阶段:Kubernetes 调度(Day 4)
- 调度器工作原理 - 理解调度流程
- 节点亲和性和反亲和性 - 理解 Pod 调度策略
- 污点和容忍 - 理解节点排斥策略
- 优先级和抢占 - 理解高优先级 Pod 调度
第六阶段:Kubernetes 安全(Day 5)
- RBAC - 理解基于角色的访问控制
- Network Policy - 理解网络策略
- Pod Security Policy - 理解 Pod 安全策略
- 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:回答问题时,先讲”是什么”,再讲”为什么”
- ❌ 不好的回答:直接讲底层原理,面试官听不懂
- ✅ 好的回答:
- 先讲”是什么”(一句话总结)
- 再讲”为什么”(深度解析)
- 最后讲”实际应用场景”(面试加分回答)
技巧 2:用”比喻”帮助理解
- Pod:就像”豌豆荚”,里面可以装多个豌豆(容器)
- Service:就像”服务台”,客户端不需要知道后端有多少个 Pod
- Deployment:就像”副本控制器”,保证有指定数量的 Pod 在运行
- StatefulSet:就像”有固定座位号的公交车”,每个 Pod 有固定的标识
技巧 3:结合”实际项目经验”回答
- 不要只背概念,要讲你在实际项目中怎么用的
- 比如:”我在 XX 项目中,用 StatefulSet 部署了 MySQL 主从集群…”
📖 推荐学习资源
官方文档(最权威)
书籍(深入理解)
- 《Kubernetes 权威指南》- 适合入门和深入
- 《Kubernetes 设计模式》- 适合理解设计思想
- 《Kubernetes 网络权威指南》- 适合深入理解网络
视频教程(直观易懂)
- 尚硅谷 Kubernetes 全套教程
- 黑马程序员 Kubernetes 教程
- 动力节点 Kubernetes 教程
💪 学习建议
- 不要死记硬背,要理解原理
- 多动手实践,亲自搭建 K8s 集群
- 看源码,理解 K8s 的设计思想
- 做项目,在实际项目中应用 K8s
- 刷面试题,熟悉常见的面试问题
现在,让我们开始学习 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 | |
面试加分回答:
在实际工作中,Pod、Node、Cluster 的使用场景如下:
开发阶段:
- 开发者创建 Pod 定义(YAML)
- 使用
kubectl apply -f pod.yaml创建 Pod - 在 Pod 中进行开发和测试
测试阶段:
- 测试人员创建 Deployment(管理 Pod)
- 使用
kubectl apply -f deployment.yaml创建 Deployment - 在 Pod 中进行测试
生产阶段:
- 运维人员管理 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 交互
- 例如:创建负载均衡器、持久化卷
- API Server(kube-apiserver):
类比:Control Plane 就像是”工厂管理层”,负责决策和协调。
2. Worker Node(工作节点):
核心组件:
- kubelet:
- 功能:节点代理,管理 Pod 和容器
- 例如:确保容器在 Pod 中运行
- kube-proxy:
- 功能:网络代理,实现 Service
- 例如:实现 Service 的负载均衡
- 容器运行时(Container Runtime):
- 功能:运行容器
- 例如:Docker、Containerd、CRI-O
- kubelet:
类比:Worker Node 就像是”工厂工人”,负责执行具体的任务。
3. Control Plane 和 Worker Node 的关系:
1 | |
4. 实际案例:
案例:创建一个 Deployment
1 | |
面试加分回答:
在实际工作中,理解 K8s 架构可以帮助我们更好地管理和排查集群问题:
Control Plane 高可用:
- 生产环境应该部署多个 Control Plane 实例
- 例如:3 个 etcd 实例、3 个 API Server 实例
Worker Node 扩展:
- 根据负载自动扩展 Worker Node
- 例如:使用 Cluster Autoscaler
组件监控:
- 监控 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
19apiVersion: 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
8status: # 对象状态
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 | |
执行命令:
1 | |
面试加分回答:
在实际工作中,理解 K8s 对象可以帮助我们更好地管理应用:
使用声明式配置(Declarative Configuration):
- 使用 YAML 文件定义对象
- 例如:
kubectl apply -f deployment.yaml
使用命令式配置(Imperative Configuration):
- 使用
kubectl命令直接创建对象 - 例如:
kubectl create deployment nginx --image=nginx
- 使用
使用对象状态(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 | |
4. 控制器最佳实践:
使用 Deployment 管理无状态应用:
- 例如:Web 应用、API 服务
使用 StatefulSet 管理有状态应用:
- 例如:数据库、消息队列
使用 DaemonSet 管理 Node 守护进程:
- 例如:日志收集器、监控代理
使用 Job 管理批处理任务:
- 例如:数据库迁移、数据备份
使用 CronJob 管理定时任务:
- 例如:每天凌晨 2 点执行数据备份
面试加分回答:
在实际工作中,理解 K8s 控制器可以帮助我们更好地管理应用:
选择合适的控制器:
- 无状态应用 → Deployment
- 有状态应用 → StatefulSet
- Node 守护进程 → DaemonSet
- 批处理任务 → Job
- 定时任务 → CronJob
监控控制器状态:
- 使用
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 的
requests和limits - 例如:
resources: { requests: { cpu: 100m, memory: 128Mi } }
- Pod 的
节点亲和性(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 | |
执行命令:
1 | |
4. 调度最佳实践:
设置合理的资源请求和限制:
- 例如:
resources: { requests: { cpu: 100m, memory: 128Mi }, limits: { cpu: 500m, memory: 512Mi } }
- 例如:
使用节点亲和性:
- 例如:将 Pod 调度到带有
disktype=ssd标签的 Node 上
- 例如:将 Pod 调度到带有
使用 Pod 亲和性和反亲和性:
- 例如:将 Pod 调度到与其他特定 Pod 相同的 Node 或可用区
- 例如:将 Pod 调度到与其他特定 Pod 不同的 Node 或可用区
使用污点和容忍:
- 例如:将 Master Node 标记为
node-role.kubernetes.io/master:NoSchedule,只有容忍这个污点的 Pod 才能运行在 Master Node 上
- 例如:将 Master Node 标记为
面试加分回答:
在实际工作中,理解 K8s 调度可以帮助我们更好地管理集群资源:
合理设置资源请求和限制:
- 避免资源浪费或资源不足
使用亲和性和反亲和性:
- 提高应用可用性和性能
使用污点和容忍:
- 保护关键 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
- ClusterIP(默认):
2. 负载均衡(Load Balancing):
核心概念:
- kube-proxy:实现 Service 的负载均衡
- 负载均衡算法:随机(Random)、轮询(Round Robin)
kube-proxy 模式:
- iptables 模式(默认):
- 功能:使用 iptables 规则实现负载均衡
- 优点:性能好
- 缺点:规则多时性能下降
- IPVS 模式:
- 功能:使用 IPVS 实现负载均衡
- 优点:性能好,支持多种负载均衡算法
- 缺点:需要操作系统支持 IPVS
- iptables 模式(默认):
3. 服务发现和负载均衡实际案例:
案例:创建一个 Service
1 | |
执行命令:
1 | |
4. 服务发现和负载均衡最佳实践:
使用 ClusterIP 类型的 Service:
- 例如:集群内部通信
使用 NodePort 类型的 Service:
- 例如:外部访问(不推荐,推荐使用 LoadBalancer 或 Ingress)
使用 LoadBalancer 类型的 Service:
- 例如:外部访问(云环境)
使用 Ingress:
- 例如:HTTP/HTTPS 路由
面试加分回答:
在实际工作中,理解 K8s 服务发现和负载均衡可以帮助我们更好地设计应用架构:
集群内部通信:
- 使用 ClusterIP 类型的 Service
外部访问:
- 使用 LoadBalancer 类型的 Service(云环境)
- 使用 Ingress(HTTP/HTTPS 路由)
性能优化:
- 使用 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 | |
1 | |
执行命令:
1 | |
4. 存储最佳实践:
使用 PVC 持久化数据:
- 例如:数据库数据、日志文件
使用 StorageClass 动态创建 PV:
- 例如:云环境使用
standardStorageClass
- 例如:云环境使用
选择合适的访问模式:
ReadWriteOnce(RWO):单个 Node 读写ReadOnlyMany(ROX):多个 Node 只读ReadWriteMany(RWX):多个 Node 读写
面试加分回答:
在实际工作中,理解 K8s 存储可以帮助我们更好地管理数据:
开发环境:
- 使用
emptyDir或hostPath
- 使用
生产环境:
- 使用 PVC 和 StorageClass
备份策略:
- 定期备份 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 | |
1 | |
1 | |
执行命令:
1 | |
5. 配置管理最佳实践:
使用 ConfigMap 存储配置数据:
- 例如:数据库 URL、日志级别
使用 Secret 存储敏感数据:
- 例如:数据库密码、API 密钥
不要在 Pod 定义中硬编码配置:
- 例如:使用 ConfigMap 和 Secret
定期轮换 Secret:
- 例如:定期更改数据库密码
面试加分回答:
在实际工作中,理解 K8s 配置管理可以帮助我们更好地管理应用配置:
开发环境:
- 使用 ConfigMap 存储配置数据
生产环境:
- 使用 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 安全可以帮助我们更好地保护集群和应用:
认证和授权:
- 启用 RBAC
网络隔离:
- 使用网络策略
容器安全:
- 使用安全上下文、使用最小化基础镜像
总结: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 | |
4. 监控和日志最佳实践:
监控关键指标:
- 例如:CPU 使用率、内存使用率、Pod 重启次数
设置告警规则:
- 例如:CPU 使用率超过 80%、Pod 重启次数超过 5 次
集中式日志管理:
- 例如:使用 ELK Stack 或 EFK Stack
面试加分回答:
在实际工作中,理解 K8s 监控和日志可以帮助我们更好地管理集群和应用:
监控:
- 使用 Prometheus 和 Grafana
日志:
- 使用 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:最多可以比期望副本数多多少个 PodmaxUnavailable:最多可以有多少个 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 | |
4. 滚动更新和回滚最佳实践:
设置合理的 maxSurge 和 maxUnavailable:
- 例如:
maxSurge: 25%、maxUnavailable: 25%
- 例如:
使用健康检查(Liveness Probe 和 Readiness Probe):
- 确保 Pod 正常运行
查看回滚历史:
- 例如:
kubectl rollout history deployment/nginx-deployment
- 例如:
测试回滚:
- 例如:定期测试回滚流程
面试加分回答:
在实际工作中,滚动更新和回滚是 Kubernetes Deployment 的核心功能:
滚动更新:
- 确保应用更新时不会停机
回滚:
- 恢复到上一个稳定版本
总结: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
41. 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: 1、maxReplicas: 10
- 例如:
监控 HPA:
- 例如:
kubectl get hpa
- 例如:
面试加分回答:
在实际工作中,HPA 是 Kubernetes 自动扩缩容的核心功能:
部署 Metrics Server:
- 例如:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- 例如:
设置合理的阈值:
- 例如:
averageUtilization: 80
- 例如:
设置合理的副本数范围:
- 例如:
minReplicas: 1、maxReplicas: 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 | |
5. 亲和性和反亲和性最佳实践:
使用节点亲和性:
- 例如:将 Pod 调度到带有
disktype=ssd标签的节点
- 例如:将 Pod 调度到带有
使用 Pod 亲和性:
- 例如:将 Pod 调度到与其他 Pod 相同的节点或可用区
使用 Pod 反亲和性:
- 例如:将 Pod 调度到与其他 Pod 不同的节点或可用区,确保高可用性
面试加分回答:
在实际工作中,亲和性和反亲和性是控制 Pod 调度位置的重要功能:
节点亲和性:
- 控制 Pod 调度到哪些节点
Pod 亲和性:
- 控制 Pod 调度到与其他 Pod 相同的节点或可用区
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 | |
4. 污点和容忍最佳实践:
标记 Master 节点不调度 Pod:
- 例如:
kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule
- 例如:
标记专用节点:
- 例如:标记节点为
disk=ssd:NoSchedule,只有需要 SSD 磁盘的 Pod 才能调度到这个节点
- 例如:标记节点为
使用容忍:
- 例如:Pod 容忍
disk=ssd:NoSchedule污点
- 例如:Pod 容忍
面试加分回答:
在实际工作中,污点和容忍是控制 Pod 调度位置的重要功能:
污点:
- 标记节点拒绝 Pod 调度
容忍:
- 允许 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 是运行系统守护进程的关键:
日志收集:
- 例如:Fluentd、Fluent Bit
监控代理:
- 例如:Prometheus Node Exporter、Datadog Agent
网络插件:
- 例如: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 是管理有状态应用的关键:
稳定的网络标识:
- Pod 名称固定
持久化存储:
- 每个 Pod 有独立的 PVC`
有序部署/扩展/删除:
- 按顺序创建/删除 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 是管理批处理任务和定时任务的关键:
Job:
- 管理批处理任务
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 是管理外部访问集群服务的关键:
部署 Ingress Controller:
- 例如:Nginx Ingress Controller、Traefik Ingress Controller`
使用 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 是管理持久化存储的关键:
PV:
- 集群级别的持久化存储资源
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 是管理配置数据和敏感数据的关键:
ConfigMap:
- 存储非敏感配置数据`
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
- Flannel:
3. Kubernetes 网络模型实际案例:
案例:使用 Calico 作为 CNI 插件
1 | |
4. Kubernetes 网络模型最佳实践:
选择合适的 CNI 插件:
- 小规模集群、简单网络需求 → Flannel、Weave Net
- 大规模集群、复杂网络需求 → Calico、Cilium
配置网络策略(Network Policy):
- 例如:只允许特定 Pod 访问数据库 Pod
监控网络性能:
- 例如:使用 Prometheus 和 Grafana 监控网络流量
面试加分回答:
在实际工作中,Kubernetes 网络模型是通过 CNI 插件实现的:
小规模集群:
- 使用 Flannel 或 Weave Net
大规模集群:
- 使用 Calico 或 Cilium
需要网络策略:
- 使用 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 的身份标识:
创建专用的 Service Account:
- 不要使用 default Service Account
使用最小权限原则:
- 只授予必要的权限
定期轮换 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 是用于管理资源使用的重要功能:
Resource Quota:
- 限制 Namespace 资源使用总量
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 | |
4. Admission Controller 最佳实践:
使用 Admission Controller 提高安全性:
- 例如:使用 Pod Security Policy 验证 Pod 是否违反安全策略
使用 Admission Controller 自动化操作:
- 例如:使用 Mutating Webhook 自动注入 Sidecar 容器
面试加分回答:
在实际工作中,Admission Controller 是拦截 Kubernetes API 请求的组件:
提高安全性:
- 使用 Validating Admission Controller 验证对象
自动化操作:
- 使用 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 | |
4. CRD 和 Operator 最佳实践:
使用 CRD 和 Operator 管理有状态应用:
- 例如:MySQL、PostgreSQL、Elasticsearch
使用成熟的 Operator:
- 例如:MySQL Operator、PostgreSQL Operator、Elasticsearch Operator
面试加分回答:
在实际工作中,CRD 和 Operator 是用于扩展 Kubernetes API 的重要功能:
管理有状态应用:
- 使用 CRD 和 Operator
使用成熟的 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 | |
5. 升级策略最佳实践:
选择合适的升级策略:
- 资源充足 → 蓝绿部署
- 资源有限 → 金丝雀部署
测试升级流程:
- 例如:在测试环境测试升级流程
面试加分回答:
在实际工作中,Kubernetes 的升级策略是确保升级过程不会停机的重要功能:
资源充足:
- 使用蓝绿部署
资源有限:
- 使用金丝雀部署
总结: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 | |
6. 备份和恢复最佳实践:
定期备份 etcd 数据:
- 例如:每天备份一次
定期备份资源定义:
- 例如:每天备份一次
测试恢复流程:
- 例如:定期测试恢复流程,确保备份可用
面试加分回答:
在实际工作中,Kubernetes 的备份和恢复是确保集群状态不会丢失的重要功能:
定期备份 etcd 数据:
- 例如:每天备份一次
定期备份资源定义:
- 例如:每天备份一次
测试恢复流程:
- 例如:定期测试恢复流程,确保备份可用
总结: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 | |
6. 性能优化最佳实践:
优化 Control Plane:
- 例如:增加 API Server 实例数、使用 SSD 磁盘存储 etcd 数据**
优化 Worker Node:
- 例如:使用 Containerd 替代 Docker、使用 IPVS 模式的 kube-proxy**
优化网络:
- 例如:使用 Calico 或 Cilium**
优化存储:
- 例如:使用 SSD 磁盘或云厂商高性能存储**
面试加分回答:
在实际工作中,Kubernetes 的性能优化是提高集群性能的重要功能:
优化 Control Plane:
- 例如:增加 API Server 实例数、使用 SSD 磁盘存储 etcd 数据**
优化 Worker Node:
- 例如:使用 Containerd 替代 Docker、使用 IPVS 模式的 kube-proxy**
优化网络:
- 例如:使用 Calico 或 Cilium**
优化存储:
- 例如:使用 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 | |
6. 安全加固最佳实践:
加固 Control Plane:
- 例如:启用 RBAC、启用 TLS**
加固 Worker Node:
- 例如:启用 TLS、启用认证**
加固网络:
- 例如:使用网络策略**
加固存储:
- 例如:使用 Secret 存储敏感数据、启用 Secret 加密**
面试加分回答:
在实际工作中,Kubernetes 的安全加固是提高集群安全性的重要功能:
加固 Control Plane:
- 例如:启用 RBAC、启用 TLS**
加固 Worker Node:
- 例如:启用 TLS、启用认证**
加固网络:
- 例如:使用网络策略**
加固存储:
- 例如:使用 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 集成好
- 缺点:功能相对简单
- Knative:
2. Service Mesh:
原理:
- Service Mesh 是微服务网络层,提供流量管理、安全、可观测性等功能
- Kubernetes 可以通过 Istio、Linkerd 等实现 Service Mesh
工具:
- Istio:
- 功能:功能丰富的 Service Mesh
- 优点:功能丰富、与 Kubernetes 集成好
- 缺点:配置复杂、资源消耗大
- Linkerd:
- 功能:轻量级 Service Mesh
- 优点:轻量级、简单易用
- 缺点:功能相对简单
- Istio:
3. eBPF:
原理:
- eBPF(extended Berkeley Packet Filter)是一种在 Linux 内核中运行程序的技术
- eBPF 可以用于容器网络、安全、可观测性等
- Kubernetes 可以通过 Cilium 等实现 eBPF
工具:
- Cilium:
- 功能:基于 eBPF 的 Kubernetes CNI 插件
- 优点:性能好、功能丰富、支持 eBPF
- 缺点:配置复杂
- Falco:
- 功能:基于 eBPF 的容器安全工具
- 优点:性能好、功能丰富、支持 eBPF**
- 缺点:配置复杂
- Cilium:
4. Wasm(WebAssembly):
原理:
- Wasm(WebAssembly)是一种二进制指令格式,可以在浏览器中运行
- Wasm 可以用于容器,提供更快的启动速度和更小的内存占用
- Kubernetes 可以通过 WasmCloud、WasmEdge 等实现 Wasm**
工具:
- WasmCloud:
- 功能:Wasm 运行时
- 优点:启动速度快、内存占用小**
- 缺点:生态不成熟
- WasmEdge:
- 功能:Wasm 运行时
- 优点:启动速度快、内存占用小**
- 缺点:生态不成熟
- WasmCloud:
5. Kubernetes 未来趋势实际案例:
案例:使用 Istio 实现 Service Mesh
1 | |
6. Kubernetes 未来趋势最佳实践:
使用 Serverless:
- 例如:使用 Knative 或 OpenFaaS**
使用 Service Mesh:
- 例如:使用 Istio 或 Linkerd**
使用 eBPF:
- 例如:使用 Cilium**
使用 Wasm:
- 例如:使用 WasmCloud 或 WasmEdge**
面试加分回答:
在实际工作中,了解 Kubernetes 的未来趋势可以帮助我们更好地规划和技术选型:
Serverless:
- 例如:使用 Knative 或 OpenFaaS**
Service Mesh:
- 例如:使用 Istio 或 Linkerd**
eBPF:
- 例如:使用 Cilium**
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
💪 最后的建议
- 不要急于求成,要打好基础
- 多动手实践,光看不练是没用的
- 看源码,理解 K8s 的设计思想
- 做项目,在实际项目中应用 K8s
- 教别人,教是最好的学
祝你学习顺利!🎉