[{"data":1,"prerenderedAt":8338},["ShallowReactive",2],{"search-docs":3,"doc-\u002Finterview\u002Fk8s":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":342,"body":888,"description":343,"extension":8333,"meta":8334,"navigation":1813,"path":341,"seo":8335,"stem":8336,"__hash__":8337},"docs\u002Finterview\u002Fk8s.md",{"type":889,"value":890,"toc":8245},"minimark",[891,894,897,902,907,914,919,941,943,947,952,1062,1064,1068,1073,1078,1092,1097,1105,1107,1111,1116,1121,1139,1177,1179,1183,1188,1193,1232,1234,1238,1243,1313,1315,1319,1324,1328,1360,1369,1371,1375,1380,1435,1475,1477,1481,1486,1491,1505,1510,1521,1523,1527,1590,1592,1596,1600,1631,1685,1687,1691,1746,1868,1870,1874,1879,1885,1890,1904,1906,1910,1970,1975,1989,2055,2057,2061,2132,2134,2138,2143,2148,2162,2276,2278,2282,2323,2453,2455,2459,2527,2639,2641,2645,2650,2655,2685,2690,2741,2743,2747,2806,2945,2947,2951,2956,2960,2971,3058,3063,3065,3069,3074,3079,3105,3110,3124,3126,3130,3134,3182,3329,3331,3335,3340,3506,3508,3512,3518,3561,3563,3567,3626,3628,3632,3674,3676,3680,3685,3858,3860,3864,3868,3873,3920,3922,3926,3975,4124,4126,4130,4170,4254,4256,4260,4270,4302,4360,4365,4385,4387,4391,4396,4493,4499,4501,4505,4510,4669,4701,4703,4707,4754,4756,4760,4764,4769,4789,4794,4808,4810,4814,4868,4870,4874,4879,5102,5104,5108,5113,5169,5394,5396,5400,5405,5410,5421,5488,5490,5494,5499,5636,5638,5642,5646,5907,5909,5913,5918,6015,6020,6065,6067,6071,6135,6137,6141,6146,6152,6157,6189,6191,6195,6200,6249,6254,6392,6394,6398,6403,6407,6421,6507,6509,6513,6518,6523,6543,6625,6627,6631,6636,6641,6661,6795,6797,6801,6807,6809,6813,6817,6822,6827,6838,6842,6853,6855,6859,6864,7085,7087,7091,7096,7101,7112,7117,7136,7138,7142,7147,7152,7166,7171,7183,7185,7189,7194,7245,7247,7251,7255,7259,7284,7289,7335,7337,7341,7345,7397,7401,7415,7417,7421,7455,7457,7461,7529,7531,7535,7607,7611,7622,7624,7628,7633,7641,7646,7673,7678,7697,7699,7703,7708,7722,7727,7804,7806,7810,7815,7826,7831,7845,7902,7904,7908,7989,7991,7995,8087,8089,8093,8096,8145,8148,8193,8196,8241],[892,893,343],"p",{},[895,896],"hr",{},[898,899,901],"h2",{"id":900},"一基础概念","一、基础概念",[903,904,906],"h3",{"id":905},"q1-kubernetes-是什么","Q1: Kubernetes 是什么？",[892,908,909,913],{},[910,911,912],"strong",{},"Kubernetes 是一个开源的容器编排平台","，用于自动化部署、扩展和管理容器化应用。",[892,915,916],{},[910,917,918],{},"核心能力：",[920,921,922,926,929,932,935,938],"ul",{},[923,924,925],"li",{},"自动化部署与回滚",[923,927,928],{},"服务发现与负载均衡",[923,930,931],{},"自我修复（容器重启、替换）",[923,933,934],{},"水平扩缩容",[923,936,937],{},"配置管理与密钥管理",[923,939,940],{},"存储编排",[895,942],{},[903,944,946],{"id":945},"q2-kubernetes-的整体架构是怎样的","Q2: Kubernetes 的整体架构是怎样的？",[892,948,949],{},[910,950,951],{},"K8s 采用 Master-Worker 架构：",[953,954,955,972],"table",{},[956,957,958],"thead",{},[959,960,961,966,969],"tr",{},[962,963,965],"th",{"align":964},"left","组件",[962,967,968],{"align":964},"位置",[962,970,971],{"align":964},"说明",[973,974,975,989,1001,1013,1025,1038,1050],"tbody",{},[959,976,977,983,986],{},[978,979,980],"td",{"align":964},[910,981,982],{},"kube-apiserver",[978,984,985],{"align":964},"Control Plane",[978,987,988],{"align":964},"集群的 API 入口，所有操作都通过它",[959,990,991,996,998],{},[978,992,993],{"align":964},[910,994,995],{},"etcd",[978,997,985],{"align":964},[978,999,1000],{"align":964},"分布式 KV 存储，保存集群所有状态",[959,1002,1003,1008,1010],{},[978,1004,1005],{"align":964},[910,1006,1007],{},"kube-scheduler",[978,1009,985],{"align":964},[978,1011,1012],{"align":964},"负责 Pod 调度",[959,1014,1015,1020,1022],{},[978,1016,1017],{"align":964},[910,1018,1019],{},"kube-controller-manager",[978,1021,985],{"align":964},[978,1023,1024],{"align":964},"运行各种控制器",[959,1026,1027,1032,1035],{},[978,1028,1029],{"align":964},[910,1030,1031],{},"kubelet",[978,1033,1034],{"align":964},"Worker Node",[978,1036,1037],{"align":964},"管理节点上的 Pod",[959,1039,1040,1045,1047],{},[978,1041,1042],{"align":964},[910,1043,1044],{},"kube-proxy",[978,1046,1034],{"align":964},[978,1048,1049],{"align":964},"负责 Service 的网络代理",[959,1051,1052,1057,1059],{},[978,1053,1054],{"align":964},[910,1055,1056],{},"Container Runtime",[978,1058,1034],{"align":964},[978,1060,1061],{"align":964},"运行容器（如 containerd）",[895,1063],{},[903,1065,1067],{"id":1066},"q3-etcd-在-k8s-中的作用是什么","Q3: etcd 在 K8s 中的作用是什么？",[892,1069,1070],{},[910,1071,1072],{},"etcd 是 Kubernetes 的\"大脑\"，存储集群的所有状态数据。",[892,1074,1075],{},[910,1076,1077],{},"特点：",[920,1079,1080,1083,1086,1089],{},[923,1081,1082],{},"分布式键值存储",[923,1084,1085],{},"使用 Raft 协议保证一致性",[923,1087,1088],{},"存储 Pod、Service、ConfigMap 等所有资源信息",[923,1090,1091],{},"只有 API Server 直接与 etcd 交互",[892,1093,1094],{},[910,1095,1096],{},"重要性：",[920,1098,1099,1102],{},[923,1100,1101],{},"etcd 数据丢失 = 集群完全失效",[923,1103,1104],{},"生产环境必须做好 etcd 的备份和高可用",[895,1106],{},[903,1108,1110],{"id":1109},"q4-kube-apiserver-的作用","Q4: kube-apiserver 的作用？",[892,1112,1113],{},[910,1114,1115],{},"API Server 是 Kubernetes 控制平面的核心组件。",[892,1117,1118],{},[910,1119,1120],{},"主要职责：",[1122,1123,1124,1127,1130,1133,1136],"ol",{},[923,1125,1126],{},"提供 RESTful API 接口",[923,1128,1129],{},"认证、授权和准入控制",[923,1131,1132],{},"集群网关，所有组件通信的枢纽",[923,1134,1135],{},"唯一直接操作 etcd 的组件",[923,1137,1138],{},"提供 watch 机制，支持事件通知",[1140,1141,1145],"pre",{"className":1142,"code":1143,"language":1144,"meta":11,"style":11},"language-bash shiki shiki-themes github-light github-light github-dark","# 所有 kubectl 命令都通过 API Server\nkubectl get pods\n# 等同于调用 GET \u002Fapi\u002Fv1\u002Fnamespaces\u002Fdefault\u002Fpods\n","bash",[1146,1147,1148,1157,1171],"code",{"__ignoreMap":11},[1149,1150,1153],"span",{"class":1151,"line":1152},"line",1,[1149,1154,1156],{"class":1155},"sCsY4","# 所有 kubectl 命令都通过 API Server\n",[1149,1158,1160,1164,1168],{"class":1151,"line":1159},2,[1149,1161,1163],{"class":1162},"snPdu","kubectl",[1149,1165,1167],{"class":1166},"sIIMD"," get",[1149,1169,1170],{"class":1166}," pods\n",[1149,1172,1174],{"class":1151,"line":1173},3,[1149,1175,1176],{"class":1155},"# 等同于调用 GET \u002Fapi\u002Fv1\u002Fnamespaces\u002Fdefault\u002Fpods\n",[895,1178],{},[903,1180,1182],{"id":1181},"q5-kube-scheduler-如何进行调度","Q5: kube-scheduler 如何进行调度？",[892,1184,1185],{},[910,1186,1187],{},"Scheduler 负责将 Pod 分配到合适的 Node 上。",[892,1189,1190],{},[910,1191,1192],{},"调度流程：",[1122,1194,1195,1212,1226],{},[923,1196,1197,1200,1201],{},[910,1198,1199],{},"过滤（Filtering）","：筛选满足条件的节点\n",[920,1202,1203,1206,1209],{},[923,1204,1205],{},"资源是否充足（CPU、内存）",[923,1207,1208],{},"节点是否有污点（Taints）",[923,1210,1211],{},"亲和性规则是否满足",[923,1213,1214,1217,1218],{},[910,1215,1216],{},"打分（Scoring）","：对候选节点打分\n",[920,1219,1220,1223],{},[923,1221,1222],{},"资源利用率均衡",[923,1224,1225],{},"节点亲和性优先级",[923,1227,1228,1231],{},[910,1229,1230],{},"选择","：选择得分最高的节点",[895,1233],{},[903,1235,1237],{"id":1236},"q6-kube-controller-manager-包含哪些控制器","Q6: kube-controller-manager 包含哪些控制器？",[892,1239,1240],{},[910,1241,1242],{},"Controller Manager 运行多个控制器，维护集群期望状态。",[953,1244,1245,1255],{},[956,1246,1247],{},[959,1248,1249,1252],{},[962,1250,1251],{"align":964},"控制器",[962,1253,1254],{"align":964},"作用",[973,1256,1257,1265,1273,1281,1289,1297,1305],{},[959,1258,1259,1262],{},[978,1260,1261],{"align":964},"Node Controller",[978,1263,1264],{"align":964},"监控节点状态，处理节点故障",[959,1266,1267,1270],{},[978,1268,1269],{"align":964},"Replication Controller",[978,1271,1272],{"align":964},"维护 Pod 副本数",[959,1274,1275,1278],{},[978,1276,1277],{"align":964},"Deployment Controller",[978,1279,1280],{"align":964},"管理 Deployment 资源",[959,1282,1283,1286],{},[978,1284,1285],{"align":964},"StatefulSet Controller",[978,1287,1288],{"align":964},"管理有状态应用",[959,1290,1291,1294],{},[978,1292,1293],{"align":964},"Endpoints Controller",[978,1295,1296],{"align":964},"填充 Endpoints 对象",[959,1298,1299,1302],{},[978,1300,1301],{"align":964},"Service Account Controller",[978,1303,1304],{"align":964},"创建默认 ServiceAccount",[959,1306,1307,1310],{},[978,1308,1309],{"align":964},"Namespace Controller",[978,1311,1312],{"align":964},"管理命名空间生命周期",[895,1314],{},[903,1316,1318],{"id":1317},"q7-kubelet-的作用是什么","Q7: kubelet 的作用是什么？",[892,1320,1321],{},[910,1322,1323],{},"kubelet 是每个 Node 上的代理进程，负责管理 Pod 的生命周期。",[892,1325,1326],{},[910,1327,1120],{},[1122,1329,1330,1336,1342,1348,1354],{},[923,1331,1332,1335],{},[910,1333,1334],{},"Pod 管理","：接收 PodSpec，确保容器正常运行",[923,1337,1338,1341],{},[910,1339,1340],{},"健康检查","：执行 Liveness 和 Readiness 探针",[923,1343,1344,1347],{},[910,1345,1346],{},"状态上报","：定期向 API Server 汇报节点和 Pod 状态",[923,1349,1350,1353],{},[910,1351,1352],{},"资源监控","：收集节点资源使用情况",[923,1355,1356,1359],{},[910,1357,1358],{},"容器日志","：管理容器日志",[1140,1361,1367],{"className":1362,"code":1364,"language":1365,"meta":1366},[1363],"language-text","flowchart LR\n    K[\"kubelet\"] --> C[\"CRI\"] --> CD[\"containerd\"] --> Ctr[\"容器\"]\n","text","mermaid",[1146,1368,1364],{"__ignoreMap":11},[895,1370],{},[903,1372,1374],{"id":1373},"q8-kube-proxy-的工作模式有哪些","Q8: kube-proxy 的工作模式有哪些？",[892,1376,1377],{},[910,1378,1379],{},"kube-proxy 实现 Service 的负载均衡。",[953,1381,1382,1394],{},[956,1383,1384],{},[959,1385,1386,1389,1391],{},[962,1387,1388],{"align":964},"模式",[962,1390,971],{"align":964},[962,1392,1393],{"align":964},"优缺点",[973,1395,1396,1409,1422],{},[959,1397,1398,1403,1406],{},[978,1399,1400],{"align":964},[910,1401,1402],{},"userspace",[978,1404,1405],{"align":964},"用户空间代理",[978,1407,1408],{"align":964},"性能差，已弃用",[959,1410,1411,1416,1419],{},[978,1412,1413],{"align":964},[910,1414,1415],{},"iptables",[978,1417,1418],{"align":964},"使用 iptables 规则转发",[978,1420,1421],{"align":964},"默认模式，规则多时性能下降",[959,1423,1424,1429,1432],{},[978,1425,1426],{"align":964},[910,1427,1428],{},"IPVS",[978,1430,1431],{"align":964},"使用 Linux IPVS",[978,1433,1434],{"align":964},"高性能，支持更多负载均衡算法",[1140,1436,1438],{"className":1142,"code":1437,"language":1144,"meta":11,"style":11},"# 查看 kube-proxy 模式\nkubectl logs -n kube-system -l k8s-app=kube-proxy | grep \"Using\"\n",[1146,1439,1440,1445],{"__ignoreMap":11},[1149,1441,1442],{"class":1151,"line":1152},[1149,1443,1444],{"class":1155},"# 查看 kube-proxy 模式\n",[1149,1446,1447,1449,1452,1456,1459,1462,1465,1469,1472],{"class":1151,"line":1159},[1149,1448,1163],{"class":1162},[1149,1450,1451],{"class":1166}," logs",[1149,1453,1455],{"class":1454},"sBjJW"," -n",[1149,1457,1458],{"class":1166}," kube-system",[1149,1460,1461],{"class":1454}," -l",[1149,1463,1464],{"class":1166}," k8s-app=kube-proxy",[1149,1466,1468],{"class":1467},"s8jYJ"," |",[1149,1470,1471],{"class":1162}," grep",[1149,1473,1474],{"class":1166}," \"Using\"\n",[895,1476],{},[903,1478,1480],{"id":1479},"q9-pod-是什么为什么是最小调度单位","Q9: Pod 是什么？为什么是最小调度单位？",[892,1482,1483],{},[910,1484,1485],{},"Pod 是 K8s 中最小的调度和部署单元。",[892,1487,1488],{},[910,1489,1490],{},"Pod 特点：",[920,1492,1493,1496,1499,1502],{},[923,1494,1495],{},"一个 Pod 可包含一个或多个容器",[923,1497,1498],{},"Pod 内容器共享网络和存储",[923,1500,1501],{},"Pod 内容器通过 localhost 通信",[923,1503,1504],{},"Pod 是原子调度单位",[892,1506,1507],{},[910,1508,1509],{},"为什么不直接调度容器？",[1122,1511,1512,1515,1518],{},[923,1513,1514],{},"某些应用需要多容器紧密协作（如 sidecar 模式）",[923,1516,1517],{},"Pod 提供了容器组的抽象",[923,1519,1520],{},"简化网络和存储的共享",[895,1522],{},[903,1524,1526],{"id":1525},"q10-pod-的生命周期有哪些阶段","Q10: Pod 的生命周期有哪些阶段？",[953,1528,1529,1538],{},[956,1530,1531],{},[959,1532,1533,1536],{},[962,1534,1535],{"align":964},"阶段",[962,1537,971],{"align":964},[973,1539,1540,1550,1560,1570,1580],{},[959,1541,1542,1547],{},[978,1543,1544],{"align":964},[910,1545,1546],{},"Pending",[978,1548,1549],{"align":964},"Pod 已创建，等待调度或容器镜像下载",[959,1551,1552,1557],{},[978,1553,1554],{"align":964},[910,1555,1556],{},"Running",[978,1558,1559],{"align":964},"Pod 已调度到节点，至少一个容器运行中",[959,1561,1562,1567],{},[978,1563,1564],{"align":964},[910,1565,1566],{},"Succeeded",[978,1568,1569],{"align":964},"所有容器成功终止，不会重启",[959,1571,1572,1577],{},[978,1573,1574],{"align":964},[910,1575,1576],{},"Failed",[978,1578,1579],{"align":964},"所有容器终止，至少一个容器失败",[959,1581,1582,1587],{},[978,1583,1584],{"align":964},[910,1585,1586],{},"Unknown",[978,1588,1589],{"align":964},"无法获取 Pod 状态（通常是通信问题）",[895,1591],{},[898,1593,1595],{"id":1594},"二核心资源","二、核心资源",[903,1597,1599],{"id":1598},"q11-pod-的重启策略有哪些","Q11: Pod 的重启策略有哪些？",[1140,1601,1605],{"className":1602,"code":1603,"language":1604,"meta":11,"style":11},"language-yaml shiki shiki-themes github-light github-light github-dark","spec:\n  restartPolicy: Always  # 可选：Always、OnFailure、Never\n","yaml",[1146,1606,1607,1617],{"__ignoreMap":11},[1149,1608,1609,1613],{"class":1151,"line":1152},[1149,1610,1612],{"class":1611},"sovSZ","spec",[1149,1614,1616],{"class":1615},"sxrX7",":\n",[1149,1618,1619,1622,1625,1628],{"class":1151,"line":1159},[1149,1620,1621],{"class":1611},"  restartPolicy",[1149,1623,1624],{"class":1615},": ",[1149,1626,1627],{"class":1166},"Always",[1149,1629,1630],{"class":1155},"  # 可选：Always、OnFailure、Never\n",[953,1632,1633,1645],{},[956,1634,1635],{},[959,1636,1637,1640,1642],{},[962,1638,1639],{"align":964},"策略",[962,1641,971],{"align":964},[962,1643,1644],{"align":964},"适用场景",[973,1646,1647,1659,1672],{},[959,1648,1649,1653,1656],{},[978,1650,1651],{"align":964},[910,1652,1627],{},[978,1654,1655],{"align":964},"容器退出时总是重启",[978,1657,1658],{"align":964},"长期运行的服务",[959,1660,1661,1666,1669],{},[978,1662,1663],{"align":964},[910,1664,1665],{},"OnFailure",[978,1667,1668],{"align":964},"只在失败时重启",[978,1670,1671],{"align":964},"Job、CronJob",[959,1673,1674,1679,1682],{},[978,1675,1676],{"align":964},[910,1677,1678],{},"Never",[978,1680,1681],{"align":964},"从不重启",[978,1683,1684],{"align":964},"一次性任务",[895,1686],{},[903,1688,1690],{"id":1689},"q12-liveness-和-readiness-探针的区别","Q12: Liveness 和 Readiness 探针的区别？",[953,1692,1693,1705],{},[956,1694,1695],{},[959,1696,1697,1700,1702],{},[962,1698,1699],{"align":964},"探针",[962,1701,1254],{"align":964},[962,1703,1704],{"align":964},"失败后果",[973,1706,1707,1720,1733],{},[959,1708,1709,1714,1717],{},[978,1710,1711],{"align":964},[910,1712,1713],{},"Liveness",[978,1715,1716],{"align":964},"检测容器是否存活",[978,1718,1719],{"align":964},"重启容器",[959,1721,1722,1727,1730],{},[978,1723,1724],{"align":964},[910,1725,1726],{},"Readiness",[978,1728,1729],{"align":964},"检测容器是否就绪",[978,1731,1732],{"align":964},"从 Service 中移除",[959,1734,1735,1740,1743],{},[978,1736,1737],{"align":964},[910,1738,1739],{},"Startup",[978,1741,1742],{"align":964},"检测应用是否启动",[978,1744,1745],{"align":964},"延迟其他探针",[1140,1747,1749],{"className":1602,"code":1748,"language":1604,"meta":11,"style":11},"livenessProbe:\n  httpGet:\n    path: \u002Fhealthz\n    port: 8080\n  initialDelaySeconds: 15\n  periodSeconds: 10\n\nreadinessProbe:\n  httpGet:\n    path: \u002Fready\n    port: 8080\n  initialDelaySeconds: 5\n  periodSeconds: 5\n",[1146,1750,1751,1758,1765,1775,1786,1797,1808,1815,1823,1830,1840,1849,1859],{"__ignoreMap":11},[1149,1752,1753,1756],{"class":1151,"line":1152},[1149,1754,1755],{"class":1611},"livenessProbe",[1149,1757,1616],{"class":1615},[1149,1759,1760,1763],{"class":1151,"line":1159},[1149,1761,1762],{"class":1611},"  httpGet",[1149,1764,1616],{"class":1615},[1149,1766,1767,1770,1772],{"class":1151,"line":1173},[1149,1768,1769],{"class":1611},"    path",[1149,1771,1624],{"class":1615},[1149,1773,1774],{"class":1166},"\u002Fhealthz\n",[1149,1776,1778,1781,1783],{"class":1151,"line":1777},4,[1149,1779,1780],{"class":1611},"    port",[1149,1782,1624],{"class":1615},[1149,1784,1785],{"class":1454},"8080\n",[1149,1787,1789,1792,1794],{"class":1151,"line":1788},5,[1149,1790,1791],{"class":1611},"  initialDelaySeconds",[1149,1793,1624],{"class":1615},[1149,1795,1796],{"class":1454},"15\n",[1149,1798,1800,1803,1805],{"class":1151,"line":1799},6,[1149,1801,1802],{"class":1611},"  periodSeconds",[1149,1804,1624],{"class":1615},[1149,1806,1807],{"class":1454},"10\n",[1149,1809,1811],{"class":1151,"line":1810},7,[1149,1812,1814],{"emptyLinePlaceholder":1813},true,"\n",[1149,1816,1818,1821],{"class":1151,"line":1817},8,[1149,1819,1820],{"class":1611},"readinessProbe",[1149,1822,1616],{"class":1615},[1149,1824,1826,1828],{"class":1151,"line":1825},9,[1149,1827,1762],{"class":1611},[1149,1829,1616],{"class":1615},[1149,1831,1833,1835,1837],{"class":1151,"line":1832},10,[1149,1834,1769],{"class":1611},[1149,1836,1624],{"class":1615},[1149,1838,1839],{"class":1166},"\u002Fready\n",[1149,1841,1843,1845,1847],{"class":1151,"line":1842},11,[1149,1844,1780],{"class":1611},[1149,1846,1624],{"class":1615},[1149,1848,1785],{"class":1454},[1149,1850,1852,1854,1856],{"class":1151,"line":1851},12,[1149,1853,1791],{"class":1611},[1149,1855,1624],{"class":1615},[1149,1857,1858],{"class":1454},"5\n",[1149,1860,1862,1864,1866],{"class":1151,"line":1861},13,[1149,1863,1802],{"class":1611},[1149,1865,1624],{"class":1615},[1149,1867,1858],{"class":1454},[895,1869],{},[903,1871,1873],{"id":1872},"q13-deployment-和-replicaset-的关系","Q13: Deployment 和 ReplicaSet 的关系？",[892,1875,1876],{},[910,1877,1878],{},"Deployment 管理 ReplicaSet，ReplicaSet 管理 Pod。",[1140,1880,1883],{"className":1881,"code":1882,"language":1365,"meta":1366},[1363],"flowchart LR\n    D[\"Deployment\"] --> RS1[\"ReplicaSet #40;v1#41;\"] --> P1[\"Pod, Pod, Pod\"]\n    D --> RS2[\"ReplicaSet #40;v2#41;\"] --> P2[\"Pod, Pod, Pod\u003Cbr\u002F>#40;滚动更新时#41;\"]\n",[1146,1884,1882],{"__ignoreMap":11},[892,1886,1887],{},[910,1888,1889],{},"Deployment 的能力：",[920,1891,1892,1895,1898,1901],{},[923,1893,1894],{},"声明式更新",[923,1896,1897],{},"滚动更新和回滚",[923,1899,1900],{},"版本历史管理",[923,1902,1903],{},"暂停和恢复部署",[895,1905],{},[903,1907,1909],{"id":1908},"q14-deployment-如何实现滚动更新","Q14: Deployment 如何实现滚动更新？",[1140,1911,1913],{"className":1602,"code":1912,"language":1604,"meta":11,"style":11},"spec:\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 25%        # 最多超出期望数量的比例\n      maxUnavailable: 25%   # 最多不可用的比例\n",[1146,1914,1915,1921,1928,1938,1945,1958],{"__ignoreMap":11},[1149,1916,1917,1919],{"class":1151,"line":1152},[1149,1918,1612],{"class":1611},[1149,1920,1616],{"class":1615},[1149,1922,1923,1926],{"class":1151,"line":1159},[1149,1924,1925],{"class":1611},"  strategy",[1149,1927,1616],{"class":1615},[1149,1929,1930,1933,1935],{"class":1151,"line":1173},[1149,1931,1932],{"class":1611},"    type",[1149,1934,1624],{"class":1615},[1149,1936,1937],{"class":1166},"RollingUpdate\n",[1149,1939,1940,1943],{"class":1151,"line":1777},[1149,1941,1942],{"class":1611},"    rollingUpdate",[1149,1944,1616],{"class":1615},[1149,1946,1947,1950,1952,1955],{"class":1151,"line":1788},[1149,1948,1949],{"class":1611},"      maxSurge",[1149,1951,1624],{"class":1615},[1149,1953,1954],{"class":1166},"25%",[1149,1956,1957],{"class":1155},"        # 最多超出期望数量的比例\n",[1149,1959,1960,1963,1965,1967],{"class":1151,"line":1799},[1149,1961,1962],{"class":1611},"      maxUnavailable",[1149,1964,1624],{"class":1615},[1149,1966,1954],{"class":1166},[1149,1968,1969],{"class":1155},"   # 最多不可用的比例\n",[892,1971,1972],{},[910,1973,1974],{},"滚动更新流程：",[1122,1976,1977,1980,1983,1986],{},[923,1978,1979],{},"创建新的 ReplicaSet",[923,1981,1982],{},"逐步增加新 RS 的 Pod 数量",[923,1984,1985],{},"同时减少旧 RS 的 Pod 数量",[923,1987,1988],{},"直到新 RS 达到期望数量",[1140,1990,1992],{"className":1142,"code":1991,"language":1144,"meta":11,"style":11},"# 查看滚动更新状态\nkubectl rollout status deployment\u002Fnginx\n\n# 回滚到上一版本\nkubectl rollout undo deployment\u002Fnginx\n\n# 回滚到指定版本\nkubectl rollout undo deployment\u002Fnginx --to-revision=2\n",[1146,1993,1994,1999,2012,2016,2021,2032,2036,2041],{"__ignoreMap":11},[1149,1995,1996],{"class":1151,"line":1152},[1149,1997,1998],{"class":1155},"# 查看滚动更新状态\n",[1149,2000,2001,2003,2006,2009],{"class":1151,"line":1159},[1149,2002,1163],{"class":1162},[1149,2004,2005],{"class":1166}," rollout",[1149,2007,2008],{"class":1166}," status",[1149,2010,2011],{"class":1166}," deployment\u002Fnginx\n",[1149,2013,2014],{"class":1151,"line":1173},[1149,2015,1814],{"emptyLinePlaceholder":1813},[1149,2017,2018],{"class":1151,"line":1777},[1149,2019,2020],{"class":1155},"# 回滚到上一版本\n",[1149,2022,2023,2025,2027,2030],{"class":1151,"line":1788},[1149,2024,1163],{"class":1162},[1149,2026,2005],{"class":1166},[1149,2028,2029],{"class":1166}," undo",[1149,2031,2011],{"class":1166},[1149,2033,2034],{"class":1151,"line":1799},[1149,2035,1814],{"emptyLinePlaceholder":1813},[1149,2037,2038],{"class":1151,"line":1810},[1149,2039,2040],{"class":1155},"# 回滚到指定版本\n",[1149,2042,2043,2045,2047,2049,2052],{"class":1151,"line":1817},[1149,2044,1163],{"class":1162},[1149,2046,2005],{"class":1166},[1149,2048,2029],{"class":1166},[1149,2050,2051],{"class":1166}," deployment\u002Fnginx",[1149,2053,2054],{"class":1454}," --to-revision=2\n",[895,2056],{},[903,2058,2060],{"id":2059},"q15-statefulset-和-deployment-的区别","Q15: StatefulSet 和 Deployment 的区别？",[953,2062,2063,2076],{},[956,2064,2065],{},[959,2066,2067,2070,2073],{},[962,2068,2069],{"align":964},"特性",[962,2071,2072],{"align":964},"Deployment",[962,2074,2075],{"align":964},"StatefulSet",[973,2077,2078,2089,2100,2111,2122],{},[959,2079,2080,2083,2086],{},[978,2081,2082],{"align":964},"Pod 名称",[978,2084,2085],{"align":964},"随机后缀",[978,2087,2088],{"align":964},"有序编号（-0, -1, -2）",[959,2090,2091,2094,2097],{},[978,2092,2093],{"align":964},"启动顺序",[978,2095,2096],{"align":964},"并行",[978,2098,2099],{"align":964},"顺序启动",[959,2101,2102,2105,2108],{},[978,2103,2104],{"align":964},"网络标识",[978,2106,2107],{"align":964},"无稳定标识",[978,2109,2110],{"align":964},"稳定的网络标识",[959,2112,2113,2116,2119],{},[978,2114,2115],{"align":964},"存储",[978,2117,2118],{"align":964},"共享 PVC",[978,2120,2121],{"align":964},"每个 Pod 独立 PVC",[959,2123,2124,2126,2129],{},[978,2125,1644],{"align":964},[978,2127,2128],{"align":964},"无状态服务",[978,2130,2131],{"align":964},"有状态服务（数据库、消息队列）",[895,2133],{},[903,2135,2137],{"id":2136},"q16-daemonset-的作用和使用场景","Q16: DaemonSet 的作用和使用场景？",[892,2139,2140],{},[910,2141,2142],{},"DaemonSet 确保每个节点（或符合条件的节点）运行一个 Pod 副本。",[892,2144,2145],{},[910,2146,2147],{},"使用场景：",[920,2149,2150,2153,2156,2159],{},[923,2151,2152],{},"日志收集（Fluentd、Filebeat）",[923,2154,2155],{},"监控代理（Node Exporter）",[923,2157,2158],{},"网络插件（Calico、Flannel）",[923,2160,2161],{},"存储守护进程",[1140,2163,2165],{"className":1602,"code":2164,"language":1604,"meta":11,"style":11},"apiVersion: apps\u002Fv1\nkind: DaemonSet\nmetadata:\n  name: fluentd\nspec:\n  selector:\n    matchLabels:\n      name: fluentd\n  template:\n    spec:\n      containers:\n      - name: fluentd\n        image: fluentd:v1.14\n",[1146,2166,2167,2177,2187,2194,2204,2210,2217,2224,2233,2240,2247,2254,2266],{"__ignoreMap":11},[1149,2168,2169,2172,2174],{"class":1151,"line":1152},[1149,2170,2171],{"class":1611},"apiVersion",[1149,2173,1624],{"class":1615},[1149,2175,2176],{"class":1166},"apps\u002Fv1\n",[1149,2178,2179,2182,2184],{"class":1151,"line":1159},[1149,2180,2181],{"class":1611},"kind",[1149,2183,1624],{"class":1615},[1149,2185,2186],{"class":1166},"DaemonSet\n",[1149,2188,2189,2192],{"class":1151,"line":1173},[1149,2190,2191],{"class":1611},"metadata",[1149,2193,1616],{"class":1615},[1149,2195,2196,2199,2201],{"class":1151,"line":1777},[1149,2197,2198],{"class":1611},"  name",[1149,2200,1624],{"class":1615},[1149,2202,2203],{"class":1166},"fluentd\n",[1149,2205,2206,2208],{"class":1151,"line":1788},[1149,2207,1612],{"class":1611},[1149,2209,1616],{"class":1615},[1149,2211,2212,2215],{"class":1151,"line":1799},[1149,2213,2214],{"class":1611},"  selector",[1149,2216,1616],{"class":1615},[1149,2218,2219,2222],{"class":1151,"line":1810},[1149,2220,2221],{"class":1611},"    matchLabels",[1149,2223,1616],{"class":1615},[1149,2225,2226,2229,2231],{"class":1151,"line":1817},[1149,2227,2228],{"class":1611},"      name",[1149,2230,1624],{"class":1615},[1149,2232,2203],{"class":1166},[1149,2234,2235,2238],{"class":1151,"line":1825},[1149,2236,2237],{"class":1611},"  template",[1149,2239,1616],{"class":1615},[1149,2241,2242,2245],{"class":1151,"line":1832},[1149,2243,2244],{"class":1611},"    spec",[1149,2246,1616],{"class":1615},[1149,2248,2249,2252],{"class":1151,"line":1842},[1149,2250,2251],{"class":1611},"      containers",[1149,2253,1616],{"class":1615},[1149,2255,2256,2259,2262,2264],{"class":1151,"line":1851},[1149,2257,2258],{"class":1615},"      - ",[1149,2260,2261],{"class":1611},"name",[1149,2263,1624],{"class":1615},[1149,2265,2203],{"class":1166},[1149,2267,2268,2271,2273],{"class":1151,"line":1861},[1149,2269,2270],{"class":1611},"        image",[1149,2272,1624],{"class":1615},[1149,2274,2275],{"class":1166},"fluentd:v1.14\n",[895,2277],{},[903,2279,2281],{"id":2280},"q17-job-和-cronjob-的区别","Q17: Job 和 CronJob 的区别？",[953,2283,2284,2296],{},[956,2285,2286],{},[959,2287,2288,2291,2293],{},[962,2289,2290],{"align":964},"资源",[962,2292,1254],{"align":964},[962,2294,2295],{"align":964},"使用场景",[973,2297,2298,2310],{},[959,2299,2300,2305,2307],{},[978,2301,2302],{"align":964},[910,2303,2304],{},"Job",[978,2306,1684],{"align":964},[978,2308,2309],{"align":964},"数据处理、迁移任务",[959,2311,2312,2317,2320],{},[978,2313,2314],{"align":964},[910,2315,2316],{},"CronJob",[978,2318,2319],{"align":964},"定时任务",[978,2321,2322],{"align":964},"定期备份、报表生成",[1140,2324,2326],{"className":1602,"code":2325,"language":1604,"meta":11,"style":11},"# CronJob 示例\napiVersion: batch\u002Fv1\nkind: CronJob\nmetadata:\n  name: backup-job\nspec:\n  schedule: \"0 2 * * *\"  # 每天凌晨 2 点\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n          - name: backup\n            image: backup:latest\n          restartPolicy: OnFailure\n",[1146,2327,2328,2333,2342,2351,2357,2366,2372,2385,2392,2398,2405,2412,2419,2431,2442],{"__ignoreMap":11},[1149,2329,2330],{"class":1151,"line":1152},[1149,2331,2332],{"class":1155},"# CronJob 示例\n",[1149,2334,2335,2337,2339],{"class":1151,"line":1159},[1149,2336,2171],{"class":1611},[1149,2338,1624],{"class":1615},[1149,2340,2341],{"class":1166},"batch\u002Fv1\n",[1149,2343,2344,2346,2348],{"class":1151,"line":1173},[1149,2345,2181],{"class":1611},[1149,2347,1624],{"class":1615},[1149,2349,2350],{"class":1166},"CronJob\n",[1149,2352,2353,2355],{"class":1151,"line":1777},[1149,2354,2191],{"class":1611},[1149,2356,1616],{"class":1615},[1149,2358,2359,2361,2363],{"class":1151,"line":1788},[1149,2360,2198],{"class":1611},[1149,2362,1624],{"class":1615},[1149,2364,2365],{"class":1166},"backup-job\n",[1149,2367,2368,2370],{"class":1151,"line":1799},[1149,2369,1612],{"class":1611},[1149,2371,1616],{"class":1615},[1149,2373,2374,2377,2379,2382],{"class":1151,"line":1810},[1149,2375,2376],{"class":1611},"  schedule",[1149,2378,1624],{"class":1615},[1149,2380,2381],{"class":1166},"\"0 2 * * *\"",[1149,2383,2384],{"class":1155},"  # 每天凌晨 2 点\n",[1149,2386,2387,2390],{"class":1151,"line":1817},[1149,2388,2389],{"class":1611},"  jobTemplate",[1149,2391,1616],{"class":1615},[1149,2393,2394,2396],{"class":1151,"line":1825},[1149,2395,2244],{"class":1611},[1149,2397,1616],{"class":1615},[1149,2399,2400,2403],{"class":1151,"line":1832},[1149,2401,2402],{"class":1611},"      template",[1149,2404,1616],{"class":1615},[1149,2406,2407,2410],{"class":1151,"line":1842},[1149,2408,2409],{"class":1611},"        spec",[1149,2411,1616],{"class":1615},[1149,2413,2414,2417],{"class":1151,"line":1851},[1149,2415,2416],{"class":1611},"          containers",[1149,2418,1616],{"class":1615},[1149,2420,2421,2424,2426,2428],{"class":1151,"line":1861},[1149,2422,2423],{"class":1615},"          - ",[1149,2425,2261],{"class":1611},[1149,2427,1624],{"class":1615},[1149,2429,2430],{"class":1166},"backup\n",[1149,2432,2434,2437,2439],{"class":1151,"line":2433},14,[1149,2435,2436],{"class":1611},"            image",[1149,2438,1624],{"class":1615},[1149,2440,2441],{"class":1166},"backup:latest\n",[1149,2443,2445,2448,2450],{"class":1151,"line":2444},15,[1149,2446,2447],{"class":1611},"          restartPolicy",[1149,2449,1624],{"class":1615},[1149,2451,2452],{"class":1166},"OnFailure\n",[895,2454],{},[903,2456,2458],{"id":2457},"q18-service-有哪些类型","Q18: Service 有哪些类型？",[953,2460,2461,2473],{},[956,2462,2463],{},[959,2464,2465,2468,2470],{},[962,2466,2467],{"align":964},"类型",[962,2469,971],{"align":964},[962,2471,2472],{"align":964},"访问方式",[973,2474,2475,2488,2501,2514],{},[959,2476,2477,2482,2485],{},[978,2478,2479],{"align":964},[910,2480,2481],{},"ClusterIP",[978,2483,2484],{"align":964},"集群内部访问",[978,2486,2487],{"align":964},"只能在集群内部访问",[959,2489,2490,2495,2498],{},[978,2491,2492],{"align":964},[910,2493,2494],{},"NodePort",[978,2496,2497],{"align":964},"节点端口暴露",[978,2499,2500],{"align":964},"NodeIP:NodePort",[959,2502,2503,2508,2511],{},[978,2504,2505],{"align":964},[910,2506,2507],{},"LoadBalancer",[978,2509,2510],{"align":964},"云负载均衡",[978,2512,2513],{"align":964},"外部 LB IP",[959,2515,2516,2521,2524],{},[978,2517,2518],{"align":964},[910,2519,2520],{},"ExternalName",[978,2522,2523],{"align":964},"DNS 映射",[978,2525,2526],{"align":964},"返回 CNAME 记录",[1140,2528,2530],{"className":1602,"code":2529,"language":1604,"meta":11,"style":11},"apiVersion: v1\nkind: Service\nmetadata:\n  name: my-service\nspec:\n  type: NodePort\n  selector:\n    app: my-app\n  ports:\n  - port: 80\n    targetPort: 8080\n    nodePort: 30080  # 30000-32767\n",[1146,2531,2532,2541,2550,2556,2565,2571,2581,2587,2597,2604,2617,2626],{"__ignoreMap":11},[1149,2533,2534,2536,2538],{"class":1151,"line":1152},[1149,2535,2171],{"class":1611},[1149,2537,1624],{"class":1615},[1149,2539,2540],{"class":1166},"v1\n",[1149,2542,2543,2545,2547],{"class":1151,"line":1159},[1149,2544,2181],{"class":1611},[1149,2546,1624],{"class":1615},[1149,2548,2549],{"class":1166},"Service\n",[1149,2551,2552,2554],{"class":1151,"line":1173},[1149,2553,2191],{"class":1611},[1149,2555,1616],{"class":1615},[1149,2557,2558,2560,2562],{"class":1151,"line":1777},[1149,2559,2198],{"class":1611},[1149,2561,1624],{"class":1615},[1149,2563,2564],{"class":1166},"my-service\n",[1149,2566,2567,2569],{"class":1151,"line":1788},[1149,2568,1612],{"class":1611},[1149,2570,1616],{"class":1615},[1149,2572,2573,2576,2578],{"class":1151,"line":1799},[1149,2574,2575],{"class":1611},"  type",[1149,2577,1624],{"class":1615},[1149,2579,2580],{"class":1166},"NodePort\n",[1149,2582,2583,2585],{"class":1151,"line":1810},[1149,2584,2214],{"class":1611},[1149,2586,1616],{"class":1615},[1149,2588,2589,2592,2594],{"class":1151,"line":1817},[1149,2590,2591],{"class":1611},"    app",[1149,2593,1624],{"class":1615},[1149,2595,2596],{"class":1166},"my-app\n",[1149,2598,2599,2602],{"class":1151,"line":1825},[1149,2600,2601],{"class":1611},"  ports",[1149,2603,1616],{"class":1615},[1149,2605,2606,2609,2612,2614],{"class":1151,"line":1832},[1149,2607,2608],{"class":1615},"  - ",[1149,2610,2611],{"class":1611},"port",[1149,2613,1624],{"class":1615},[1149,2615,2616],{"class":1454},"80\n",[1149,2618,2619,2622,2624],{"class":1151,"line":1842},[1149,2620,2621],{"class":1611},"    targetPort",[1149,2623,1624],{"class":1615},[1149,2625,1785],{"class":1454},[1149,2627,2628,2631,2633,2636],{"class":1151,"line":1851},[1149,2629,2630],{"class":1611},"    nodePort",[1149,2632,1624],{"class":1615},[1149,2634,2635],{"class":1454},"30080",[1149,2637,2638],{"class":1155},"  # 30000-32767\n",[895,2640],{},[903,2642,2644],{"id":2643},"q19-service-如何实现服务发现","Q19: Service 如何实现服务发现？",[892,2646,2647],{},[910,2648,2649],{},"K8s 提供两种服务发现机制：",[892,2651,2652],{},[910,2653,2654],{},"1. 环境变量",[1140,2656,2658],{"className":1142,"code":2657,"language":1144,"meta":11,"style":11},"# 自动注入的环境变量\nMY_SERVICE_SERVICE_HOST=10.96.0.1\nMY_SERVICE_SERVICE_PORT=80\n",[1146,2659,2660,2665,2676],{"__ignoreMap":11},[1149,2661,2662],{"class":1151,"line":1152},[1149,2663,2664],{"class":1155},"# 自动注入的环境变量\n",[1149,2666,2667,2670,2673],{"class":1151,"line":1159},[1149,2668,2669],{"class":1615},"MY_SERVICE_SERVICE_HOST",[1149,2671,2672],{"class":1467},"=",[1149,2674,2675],{"class":1166},"10.96.0.1\n",[1149,2677,2678,2681,2683],{"class":1151,"line":1173},[1149,2679,2680],{"class":1615},"MY_SERVICE_SERVICE_PORT",[1149,2682,2672],{"class":1467},[1149,2684,2616],{"class":1166},[892,2686,2687],{},[910,2688,2689],{},"2. DNS（推荐）",[1140,2691,2693],{"className":1142,"code":2692,"language":1144,"meta":11,"style":11},"# Service DNS 格式\n\u003Cservice-name>.\u003Cnamespace>.svc.cluster.local\n\n# 示例\ncurl http:\u002F\u002Fmy-service.default.svc.cluster.local\n",[1146,2694,2695,2700,2724,2728,2733],{"__ignoreMap":11},[1149,2696,2697],{"class":1151,"line":1152},[1149,2698,2699],{"class":1155},"# Service DNS 格式\n",[1149,2701,2702,2705,2708,2711,2714,2716,2719,2721],{"class":1151,"line":1159},[1149,2703,2704],{"class":1467},"\u003C",[1149,2706,2707],{"class":1615},"service-name",[1149,2709,2710],{"class":1467},">",[1149,2712,2713],{"class":1615},".",[1149,2715,2704],{"class":1467},[1149,2717,2718],{"class":1615},"namespace",[1149,2720,2710],{"class":1467},[1149,2722,2723],{"class":1615},".svc.cluster.local\n",[1149,2725,2726],{"class":1151,"line":1173},[1149,2727,1814],{"emptyLinePlaceholder":1813},[1149,2729,2730],{"class":1151,"line":1777},[1149,2731,2732],{"class":1155},"# 示例\n",[1149,2734,2735,2738],{"class":1151,"line":1788},[1149,2736,2737],{"class":1162},"curl",[1149,2739,2740],{"class":1166}," http:\u002F\u002Fmy-service.default.svc.cluster.local\n",[895,2742],{},[903,2744,2746],{"id":2745},"q20-ingress-和-service-的区别","Q20: Ingress 和 Service 的区别？",[953,2748,2749,2761],{},[956,2750,2751],{},[959,2752,2753,2755,2758],{},[962,2754,2069],{"align":964},[962,2756,2757],{"align":964},"Service",[962,2759,2760],{"align":964},"Ingress",[973,2762,2763,2774,2785,2796],{},[959,2764,2765,2768,2771],{},[978,2766,2767],{"align":964},"协议",[978,2769,2770],{"align":964},"TCP\u002FUDP",[978,2772,2773],{"align":964},"HTTP\u002FHTTPS",[959,2775,2776,2779,2782],{},[978,2777,2778],{"align":964},"功能",[978,2780,2781],{"align":964},"负载均衡",[978,2783,2784],{"align":964},"路由、TLS 终止、虚拟主机",[959,2786,2787,2790,2793],{},[978,2788,2789],{"align":964},"暴露方式",[978,2791,2792],{"align":964},"NodePort\u002FLB",[978,2794,2795],{"align":964},"7 层负载均衡",[959,2797,2798,2800,2803],{},[978,2799,2295],{"align":964},[978,2801,2802],{"align":964},"服务间通信",[978,2804,2805],{"align":964},"对外暴露 HTTP 服务",[1140,2807,2809],{"className":1602,"code":2808,"language":1604,"meta":11,"style":11},"apiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: my-ingress\nspec:\n  rules:\n  - host: api.example.com\n    http:\n      paths:\n      - path: \u002F\n        pathType: Prefix\n        backend:\n          service:\n            name: my-service\n            port:\n              number: 80\n",[1146,2810,2811,2820,2829,2835,2844,2850,2857,2869,2876,2883,2895,2905,2912,2919,2928,2935],{"__ignoreMap":11},[1149,2812,2813,2815,2817],{"class":1151,"line":1152},[1149,2814,2171],{"class":1611},[1149,2816,1624],{"class":1615},[1149,2818,2819],{"class":1166},"networking.k8s.io\u002Fv1\n",[1149,2821,2822,2824,2826],{"class":1151,"line":1159},[1149,2823,2181],{"class":1611},[1149,2825,1624],{"class":1615},[1149,2827,2828],{"class":1166},"Ingress\n",[1149,2830,2831,2833],{"class":1151,"line":1173},[1149,2832,2191],{"class":1611},[1149,2834,1616],{"class":1615},[1149,2836,2837,2839,2841],{"class":1151,"line":1777},[1149,2838,2198],{"class":1611},[1149,2840,1624],{"class":1615},[1149,2842,2843],{"class":1166},"my-ingress\n",[1149,2845,2846,2848],{"class":1151,"line":1788},[1149,2847,1612],{"class":1611},[1149,2849,1616],{"class":1615},[1149,2851,2852,2855],{"class":1151,"line":1799},[1149,2853,2854],{"class":1611},"  rules",[1149,2856,1616],{"class":1615},[1149,2858,2859,2861,2864,2866],{"class":1151,"line":1810},[1149,2860,2608],{"class":1615},[1149,2862,2863],{"class":1611},"host",[1149,2865,1624],{"class":1615},[1149,2867,2868],{"class":1166},"api.example.com\n",[1149,2870,2871,2874],{"class":1151,"line":1817},[1149,2872,2873],{"class":1611},"    http",[1149,2875,1616],{"class":1615},[1149,2877,2878,2881],{"class":1151,"line":1825},[1149,2879,2880],{"class":1611},"      paths",[1149,2882,1616],{"class":1615},[1149,2884,2885,2887,2890,2892],{"class":1151,"line":1832},[1149,2886,2258],{"class":1615},[1149,2888,2889],{"class":1611},"path",[1149,2891,1624],{"class":1615},[1149,2893,2894],{"class":1166},"\u002F\n",[1149,2896,2897,2900,2902],{"class":1151,"line":1842},[1149,2898,2899],{"class":1611},"        pathType",[1149,2901,1624],{"class":1615},[1149,2903,2904],{"class":1166},"Prefix\n",[1149,2906,2907,2910],{"class":1151,"line":1851},[1149,2908,2909],{"class":1611},"        backend",[1149,2911,1616],{"class":1615},[1149,2913,2914,2917],{"class":1151,"line":1861},[1149,2915,2916],{"class":1611},"          service",[1149,2918,1616],{"class":1615},[1149,2920,2921,2924,2926],{"class":1151,"line":2433},[1149,2922,2923],{"class":1611},"            name",[1149,2925,1624],{"class":1615},[1149,2927,2564],{"class":1166},[1149,2929,2930,2933],{"class":1151,"line":2444},[1149,2931,2932],{"class":1611},"            port",[1149,2934,1616],{"class":1615},[1149,2936,2938,2941,2943],{"class":1151,"line":2937},16,[1149,2939,2940],{"class":1611},"              number",[1149,2942,1624],{"class":1615},[1149,2944,2616],{"class":1454},[895,2946],{},[903,2948,2950],{"id":2949},"q21-headless-service-是什么","Q21: Headless Service 是什么？",[892,2952,2953],{},[910,2954,2955],{},"Headless Service 是没有 ClusterIP 的 Service（设置 clusterIP: None）。",[892,2957,2958],{},[910,2959,1077],{},[920,2961,2962,2965,2968],{},[923,2963,2964],{},"不分配 ClusterIP",[923,2966,2967],{},"DNS 直接返回 Pod IP 列表",[923,2969,2970],{},"用于有状态服务的直接访问",[1140,2972,2974],{"className":1602,"code":2973,"language":1604,"meta":11,"style":11},"apiVersion: v1\nkind: Service\nmetadata:\n  name: mysql-headless\nspec:\n  clusterIP: None  # Headless\n  selector:\n    app: mysql\n  ports:\n  - port: 3306\n",[1146,2975,2976,2984,2992,2998,3007,3013,3026,3032,3041,3047],{"__ignoreMap":11},[1149,2977,2978,2980,2982],{"class":1151,"line":1152},[1149,2979,2171],{"class":1611},[1149,2981,1624],{"class":1615},[1149,2983,2540],{"class":1166},[1149,2985,2986,2988,2990],{"class":1151,"line":1159},[1149,2987,2181],{"class":1611},[1149,2989,1624],{"class":1615},[1149,2991,2549],{"class":1166},[1149,2993,2994,2996],{"class":1151,"line":1173},[1149,2995,2191],{"class":1611},[1149,2997,1616],{"class":1615},[1149,2999,3000,3002,3004],{"class":1151,"line":1777},[1149,3001,2198],{"class":1611},[1149,3003,1624],{"class":1615},[1149,3005,3006],{"class":1166},"mysql-headless\n",[1149,3008,3009,3011],{"class":1151,"line":1788},[1149,3010,1612],{"class":1611},[1149,3012,1616],{"class":1615},[1149,3014,3015,3018,3020,3023],{"class":1151,"line":1799},[1149,3016,3017],{"class":1611},"  clusterIP",[1149,3019,1624],{"class":1615},[1149,3021,3022],{"class":1166},"None",[1149,3024,3025],{"class":1155},"  # Headless\n",[1149,3027,3028,3030],{"class":1151,"line":1810},[1149,3029,2214],{"class":1611},[1149,3031,1616],{"class":1615},[1149,3033,3034,3036,3038],{"class":1151,"line":1817},[1149,3035,2591],{"class":1611},[1149,3037,1624],{"class":1615},[1149,3039,3040],{"class":1166},"mysql\n",[1149,3042,3043,3045],{"class":1151,"line":1825},[1149,3044,2601],{"class":1611},[1149,3046,1616],{"class":1615},[1149,3048,3049,3051,3053,3055],{"class":1151,"line":1832},[1149,3050,2608],{"class":1615},[1149,3052,2611],{"class":1611},[1149,3054,1624],{"class":1615},[1149,3056,3057],{"class":1454},"3306\n",[892,3059,3060,3062],{},[910,3061,2147],{}," StatefulSet 中访问特定 Pod",[895,3064],{},[903,3066,3068],{"id":3067},"q22-namespace-的作用是什么","Q22: Namespace 的作用是什么？",[892,3070,3071],{},[910,3072,3073],{},"Namespace 用于逻辑隔离集群资源。",[892,3075,3076],{},[910,3077,3078],{},"默认 Namespace：",[920,3080,3081,3087,3093,3099],{},[923,3082,3083,3086],{},[1146,3084,3085],{},"default","：默认命名空间",[923,3088,3089,3092],{},[1146,3090,3091],{},"kube-system","：系统组件",[923,3094,3095,3098],{},[1146,3096,3097],{},"kube-public","：公开资源",[923,3100,3101,3104],{},[1146,3102,3103],{},"kube-node-lease","：节点心跳",[892,3106,3107],{},[910,3108,3109],{},"最佳实践：",[920,3111,3112,3115,3118,3121],{},[923,3113,3114],{},"按环境隔离（dev、staging、prod）",[923,3116,3117],{},"按团队隔离",[923,3119,3120],{},"配合 ResourceQuota 限制资源",[923,3122,3123],{},"配合 NetworkPolicy 网络隔离",[895,3125],{},[898,3127,3129],{"id":3128},"三配置与存储","三、配置与存储",[903,3131,3133],{"id":3132},"q23-configmap-和-secret-的区别","Q23: ConfigMap 和 Secret 的区别？",[953,3135,3136,3148],{},[956,3137,3138],{},[959,3139,3140,3142,3145],{},[962,3141,2069],{"align":964},[962,3143,3144],{"align":964},"ConfigMap",[962,3146,3147],{"align":964},"Secret",[973,3149,3150,3161,3171],{},[959,3151,3152,3155,3158],{},[978,3153,3154],{"align":964},"用途",[978,3156,3157],{"align":964},"非敏感配置",[978,3159,3160],{"align":964},"敏感数据",[959,3162,3163,3165,3168],{},[978,3164,2115],{"align":964},[978,3166,3167],{"align":964},"明文",[978,3169,3170],{"align":964},"Base64 编码",[959,3172,3173,3176,3179],{},[978,3174,3175],{"align":964},"典型内容",[978,3177,3178],{"align":964},"配置文件、环境变量",[978,3180,3181],{"align":964},"密码、证书、密钥",[1140,3183,3185],{"className":1602,"code":3184,"language":1604,"meta":11,"style":11},"# ConfigMap\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: app-config\ndata:\n  config.yaml: |\n    database:\n      host: mysql\n      port: 3306\n\n# Secret\napiVersion: v1\nkind: Secret\nmetadata:\n  name: db-secret\ntype: Opaque\ndata:\n  password: cGFzc3dvcmQxMjM=  # base64 encoded\n",[1146,3186,3187,3192,3200,3209,3215,3224,3231,3241,3246,3251,3256,3260,3265,3273,3282,3288,3297,3308,3315],{"__ignoreMap":11},[1149,3188,3189],{"class":1151,"line":1152},[1149,3190,3191],{"class":1155},"# ConfigMap\n",[1149,3193,3194,3196,3198],{"class":1151,"line":1159},[1149,3195,2171],{"class":1611},[1149,3197,1624],{"class":1615},[1149,3199,2540],{"class":1166},[1149,3201,3202,3204,3206],{"class":1151,"line":1173},[1149,3203,2181],{"class":1611},[1149,3205,1624],{"class":1615},[1149,3207,3208],{"class":1166},"ConfigMap\n",[1149,3210,3211,3213],{"class":1151,"line":1777},[1149,3212,2191],{"class":1611},[1149,3214,1616],{"class":1615},[1149,3216,3217,3219,3221],{"class":1151,"line":1788},[1149,3218,2198],{"class":1611},[1149,3220,1624],{"class":1615},[1149,3222,3223],{"class":1166},"app-config\n",[1149,3225,3226,3229],{"class":1151,"line":1799},[1149,3227,3228],{"class":1611},"data",[1149,3230,1616],{"class":1615},[1149,3232,3233,3236,3238],{"class":1151,"line":1810},[1149,3234,3235],{"class":1611},"  config.yaml",[1149,3237,1624],{"class":1615},[1149,3239,3240],{"class":1467},"|\n",[1149,3242,3243],{"class":1151,"line":1817},[1149,3244,3245],{"class":1166},"    database:\n",[1149,3247,3248],{"class":1151,"line":1825},[1149,3249,3250],{"class":1166},"      host: mysql\n",[1149,3252,3253],{"class":1151,"line":1832},[1149,3254,3255],{"class":1166},"      port: 3306\n",[1149,3257,3258],{"class":1151,"line":1842},[1149,3259,1814],{"emptyLinePlaceholder":1813},[1149,3261,3262],{"class":1151,"line":1851},[1149,3263,3264],{"class":1155},"# Secret\n",[1149,3266,3267,3269,3271],{"class":1151,"line":1861},[1149,3268,2171],{"class":1611},[1149,3270,1624],{"class":1615},[1149,3272,2540],{"class":1166},[1149,3274,3275,3277,3279],{"class":1151,"line":2433},[1149,3276,2181],{"class":1611},[1149,3278,1624],{"class":1615},[1149,3280,3281],{"class":1166},"Secret\n",[1149,3283,3284,3286],{"class":1151,"line":2444},[1149,3285,2191],{"class":1611},[1149,3287,1616],{"class":1615},[1149,3289,3290,3292,3294],{"class":1151,"line":2937},[1149,3291,2198],{"class":1611},[1149,3293,1624],{"class":1615},[1149,3295,3296],{"class":1166},"db-secret\n",[1149,3298,3300,3303,3305],{"class":1151,"line":3299},17,[1149,3301,3302],{"class":1611},"type",[1149,3304,1624],{"class":1615},[1149,3306,3307],{"class":1166},"Opaque\n",[1149,3309,3311,3313],{"class":1151,"line":3310},18,[1149,3312,3228],{"class":1611},[1149,3314,1616],{"class":1615},[1149,3316,3318,3321,3323,3326],{"class":1151,"line":3317},19,[1149,3319,3320],{"class":1611},"  password",[1149,3322,1624],{"class":1615},[1149,3324,3325],{"class":1166},"cGFzc3dvcmQxMjM=",[1149,3327,3328],{"class":1155},"  # base64 encoded\n",[895,3330],{},[903,3332,3334],{"id":3333},"q24-如何在-pod-中使用-configmap","Q24: 如何在 Pod 中使用 ConfigMap？",[892,3336,3337],{},[910,3338,3339],{},"三种使用方式：",[1140,3341,3343],{"className":1602,"code":3342,"language":1604,"meta":11,"style":11},"# 1. 环境变量\nenv:\n- name: DATABASE_HOST\n  valueFrom:\n    configMapKeyRef:\n      name: app-config\n      key: database_host\n\n# 2. 全部注入环境变量\nenvFrom:\n- configMapRef:\n    name: app-config\n\n# 3. 挂载为文件\nvolumes:\n- name: config-volume\n  configMap:\n    name: app-config\nvolumeMounts:\n- name: config-volume\n  mountPath: \u002Fetc\u002Fconfig\n",[1146,3344,3345,3350,3357,3369,3376,3383,3391,3401,3405,3410,3417,3426,3435,3439,3444,3451,3462,3469,3477,3484,3495],{"__ignoreMap":11},[1149,3346,3347],{"class":1151,"line":1152},[1149,3348,3349],{"class":1155},"# 1. 环境变量\n",[1149,3351,3352,3355],{"class":1151,"line":1159},[1149,3353,3354],{"class":1611},"env",[1149,3356,1616],{"class":1615},[1149,3358,3359,3362,3364,3366],{"class":1151,"line":1173},[1149,3360,3361],{"class":1615},"- ",[1149,3363,2261],{"class":1611},[1149,3365,1624],{"class":1615},[1149,3367,3368],{"class":1166},"DATABASE_HOST\n",[1149,3370,3371,3374],{"class":1151,"line":1777},[1149,3372,3373],{"class":1611},"  valueFrom",[1149,3375,1616],{"class":1615},[1149,3377,3378,3381],{"class":1151,"line":1788},[1149,3379,3380],{"class":1611},"    configMapKeyRef",[1149,3382,1616],{"class":1615},[1149,3384,3385,3387,3389],{"class":1151,"line":1799},[1149,3386,2228],{"class":1611},[1149,3388,1624],{"class":1615},[1149,3390,3223],{"class":1166},[1149,3392,3393,3396,3398],{"class":1151,"line":1810},[1149,3394,3395],{"class":1611},"      key",[1149,3397,1624],{"class":1615},[1149,3399,3400],{"class":1166},"database_host\n",[1149,3402,3403],{"class":1151,"line":1817},[1149,3404,1814],{"emptyLinePlaceholder":1813},[1149,3406,3407],{"class":1151,"line":1825},[1149,3408,3409],{"class":1155},"# 2. 全部注入环境变量\n",[1149,3411,3412,3415],{"class":1151,"line":1832},[1149,3413,3414],{"class":1611},"envFrom",[1149,3416,1616],{"class":1615},[1149,3418,3419,3421,3424],{"class":1151,"line":1842},[1149,3420,3361],{"class":1615},[1149,3422,3423],{"class":1611},"configMapRef",[1149,3425,1616],{"class":1615},[1149,3427,3428,3431,3433],{"class":1151,"line":1851},[1149,3429,3430],{"class":1611},"    name",[1149,3432,1624],{"class":1615},[1149,3434,3223],{"class":1166},[1149,3436,3437],{"class":1151,"line":1861},[1149,3438,1814],{"emptyLinePlaceholder":1813},[1149,3440,3441],{"class":1151,"line":2433},[1149,3442,3443],{"class":1155},"# 3. 挂载为文件\n",[1149,3445,3446,3449],{"class":1151,"line":2444},[1149,3447,3448],{"class":1611},"volumes",[1149,3450,1616],{"class":1615},[1149,3452,3453,3455,3457,3459],{"class":1151,"line":2937},[1149,3454,3361],{"class":1615},[1149,3456,2261],{"class":1611},[1149,3458,1624],{"class":1615},[1149,3460,3461],{"class":1166},"config-volume\n",[1149,3463,3464,3467],{"class":1151,"line":3299},[1149,3465,3466],{"class":1611},"  configMap",[1149,3468,1616],{"class":1615},[1149,3470,3471,3473,3475],{"class":1151,"line":3310},[1149,3472,3430],{"class":1611},[1149,3474,1624],{"class":1615},[1149,3476,3223],{"class":1166},[1149,3478,3479,3482],{"class":1151,"line":3317},[1149,3480,3481],{"class":1611},"volumeMounts",[1149,3483,1616],{"class":1615},[1149,3485,3487,3489,3491,3493],{"class":1151,"line":3486},20,[1149,3488,3361],{"class":1615},[1149,3490,2261],{"class":1611},[1149,3492,1624],{"class":1615},[1149,3494,3461],{"class":1166},[1149,3496,3498,3501,3503],{"class":1151,"line":3497},21,[1149,3499,3500],{"class":1611},"  mountPath",[1149,3502,1624],{"class":1615},[1149,3504,3505],{"class":1166},"\u002Fetc\u002Fconfig\n",[895,3507],{},[903,3509,3511],{"id":3510},"q25-pvpvcstorageclass-的关系","Q25: PV、PVC、StorageClass 的关系？",[1140,3513,3516],{"className":3514,"code":3515,"language":1365,"meta":1366},[1363],"flowchart TD\n    SC[\"StorageClass #40;动态供应策略#41;\"] --> PV[\"PersistentVolume #40;存储资源#41;\"]\n    PV -->|\"绑定\"| PVC[\"PersistentVolumeClaim #40;存储请求#41;\"]\n    PVC -->|\"挂载\"| Pod[\"Pod\"]\n",[1146,3517,3515],{"__ignoreMap":11},[953,3519,3520,3529],{},[956,3521,3522],{},[959,3523,3524,3527],{},[962,3525,3526],{"align":964},"概念",[962,3528,971],{"align":964},[973,3530,3531,3541,3551],{},[959,3532,3533,3538],{},[978,3534,3535],{"align":964},[910,3536,3537],{},"PV",[978,3539,3540],{"align":964},"集群级别的存储资源",[959,3542,3543,3548],{},[978,3544,3545],{"align":964},[910,3546,3547],{},"PVC",[978,3549,3550],{"align":964},"用户对存储的请求",[959,3552,3553,3558],{},[978,3554,3555],{"align":964},[910,3556,3557],{},"StorageClass",[978,3559,3560],{"align":964},"动态供应 PV 的模板",[895,3562],{},[903,3564,3566],{"id":3565},"q26-pv-的访问模式有哪些","Q26: PV 的访问模式有哪些？",[953,3568,3569,3580],{},[956,3570,3571],{},[959,3572,3573,3575,3578],{},[962,3574,1388],{"align":964},[962,3576,3577],{"align":964},"缩写",[962,3579,971],{"align":964},[973,3581,3582,3593,3604,3615],{},[959,3583,3584,3587,3590],{},[978,3585,3586],{"align":964},"ReadWriteOnce",[978,3588,3589],{"align":964},"RWO",[978,3591,3592],{"align":964},"单节点读写",[959,3594,3595,3598,3601],{},[978,3596,3597],{"align":964},"ReadOnlyMany",[978,3599,3600],{"align":964},"ROX",[978,3602,3603],{"align":964},"多节点只读",[959,3605,3606,3609,3612],{},[978,3607,3608],{"align":964},"ReadWriteMany",[978,3610,3611],{"align":964},"RWX",[978,3613,3614],{"align":964},"多节点读写",[959,3616,3617,3620,3623],{},[978,3618,3619],{"align":964},"ReadWriteOncePod",[978,3621,3622],{"align":964},"RWOP",[978,3624,3625],{"align":964},"单 Pod 读写（K8s 1.22+）",[895,3627],{},[903,3629,3631],{"id":3630},"q27-pv-的回收策略有哪些","Q27: PV 的回收策略有哪些？",[953,3633,3634,3642],{},[956,3635,3636],{},[959,3637,3638,3640],{},[962,3639,1639],{"align":964},[962,3641,971],{"align":964},[973,3643,3644,3654,3664],{},[959,3645,3646,3651],{},[978,3647,3648],{"align":964},[910,3649,3650],{},"Retain",[978,3652,3653],{"align":964},"保留数据，需手动处理",[959,3655,3656,3661],{},[978,3657,3658],{"align":964},[910,3659,3660],{},"Delete",[978,3662,3663],{"align":964},"删除 PV 和底层存储",[959,3665,3666,3671],{},[978,3667,3668],{"align":964},[910,3669,3670],{},"Recycle",[978,3672,3673],{"align":964},"清空数据（已弃用）",[895,3675],{},[903,3677,3679],{"id":3678},"q28-什么是动态存储供应","Q28: 什么是动态存储供应？",[892,3681,3682],{},[910,3683,3684],{},"动态供应：通过 StorageClass 自动创建 PV。",[1140,3686,3688],{"className":1602,"code":3687,"language":1604,"meta":11,"style":11},"# StorageClass\napiVersion: storage.k8s.io\u002Fv1\nkind: StorageClass\nmetadata:\n  name: fast-storage\nprovisioner: kubernetes.io\u002Faws-ebs\nparameters:\n  type: gp3\nreclaimPolicy: Delete\n\n# PVC（自动创建 PV）\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: my-pvc\nspec:\n  accessModes: [\"ReadWriteOnce\"]\n  storageClassName: fast-storage\n  resources:\n    requests:\n      storage: 10Gi\n",[1146,3689,3690,3695,3704,3713,3719,3728,3738,3745,3754,3764,3768,3773,3781,3790,3796,3805,3811,3825,3834,3841,3848],{"__ignoreMap":11},[1149,3691,3692],{"class":1151,"line":1152},[1149,3693,3694],{"class":1155},"# StorageClass\n",[1149,3696,3697,3699,3701],{"class":1151,"line":1159},[1149,3698,2171],{"class":1611},[1149,3700,1624],{"class":1615},[1149,3702,3703],{"class":1166},"storage.k8s.io\u002Fv1\n",[1149,3705,3706,3708,3710],{"class":1151,"line":1173},[1149,3707,2181],{"class":1611},[1149,3709,1624],{"class":1615},[1149,3711,3712],{"class":1166},"StorageClass\n",[1149,3714,3715,3717],{"class":1151,"line":1777},[1149,3716,2191],{"class":1611},[1149,3718,1616],{"class":1615},[1149,3720,3721,3723,3725],{"class":1151,"line":1788},[1149,3722,2198],{"class":1611},[1149,3724,1624],{"class":1615},[1149,3726,3727],{"class":1166},"fast-storage\n",[1149,3729,3730,3733,3735],{"class":1151,"line":1799},[1149,3731,3732],{"class":1611},"provisioner",[1149,3734,1624],{"class":1615},[1149,3736,3737],{"class":1166},"kubernetes.io\u002Faws-ebs\n",[1149,3739,3740,3743],{"class":1151,"line":1810},[1149,3741,3742],{"class":1611},"parameters",[1149,3744,1616],{"class":1615},[1149,3746,3747,3749,3751],{"class":1151,"line":1817},[1149,3748,2575],{"class":1611},[1149,3750,1624],{"class":1615},[1149,3752,3753],{"class":1166},"gp3\n",[1149,3755,3756,3759,3761],{"class":1151,"line":1825},[1149,3757,3758],{"class":1611},"reclaimPolicy",[1149,3760,1624],{"class":1615},[1149,3762,3763],{"class":1166},"Delete\n",[1149,3765,3766],{"class":1151,"line":1832},[1149,3767,1814],{"emptyLinePlaceholder":1813},[1149,3769,3770],{"class":1151,"line":1842},[1149,3771,3772],{"class":1155},"# PVC（自动创建 PV）\n",[1149,3774,3775,3777,3779],{"class":1151,"line":1851},[1149,3776,2171],{"class":1611},[1149,3778,1624],{"class":1615},[1149,3780,2540],{"class":1166},[1149,3782,3783,3785,3787],{"class":1151,"line":1861},[1149,3784,2181],{"class":1611},[1149,3786,1624],{"class":1615},[1149,3788,3789],{"class":1166},"PersistentVolumeClaim\n",[1149,3791,3792,3794],{"class":1151,"line":2433},[1149,3793,2191],{"class":1611},[1149,3795,1616],{"class":1615},[1149,3797,3798,3800,3802],{"class":1151,"line":2444},[1149,3799,2198],{"class":1611},[1149,3801,1624],{"class":1615},[1149,3803,3804],{"class":1166},"my-pvc\n",[1149,3806,3807,3809],{"class":1151,"line":2937},[1149,3808,1612],{"class":1611},[1149,3810,1616],{"class":1615},[1149,3812,3813,3816,3819,3822],{"class":1151,"line":3299},[1149,3814,3815],{"class":1611},"  accessModes",[1149,3817,3818],{"class":1615},": [",[1149,3820,3821],{"class":1166},"\"ReadWriteOnce\"",[1149,3823,3824],{"class":1615},"]\n",[1149,3826,3827,3830,3832],{"class":1151,"line":3310},[1149,3828,3829],{"class":1611},"  storageClassName",[1149,3831,1624],{"class":1615},[1149,3833,3727],{"class":1166},[1149,3835,3836,3839],{"class":1151,"line":3317},[1149,3837,3838],{"class":1611},"  resources",[1149,3840,1616],{"class":1615},[1149,3842,3843,3846],{"class":1151,"line":3486},[1149,3844,3845],{"class":1611},"    requests",[1149,3847,1616],{"class":1615},[1149,3849,3850,3853,3855],{"class":1151,"line":3497},[1149,3851,3852],{"class":1611},"      storage",[1149,3854,1624],{"class":1615},[1149,3856,3857],{"class":1166},"10Gi\n",[895,3859],{},[898,3861,3863],{"id":3862},"四调度与扩缩容","四、调度与扩缩容",[903,3865,3867],{"id":3866},"q29-nodeselector-如何工作","Q29: nodeSelector 如何工作？",[892,3869,3870],{},[910,3871,3872],{},"nodeSelector 通过标签匹配将 Pod 调度到特定节点。",[1140,3874,3876],{"className":1602,"code":3875,"language":1604,"meta":11,"style":11},"# 给节点打标签\nkubectl label nodes node1 disktype=ssd\n\n# Pod 中使用 nodeSelector\nspec:\n  nodeSelector:\n    disktype: ssd\n",[1146,3877,3878,3883,3888,3892,3897,3903,3910],{"__ignoreMap":11},[1149,3879,3880],{"class":1151,"line":1152},[1149,3881,3882],{"class":1155},"# 给节点打标签\n",[1149,3884,3885],{"class":1151,"line":1159},[1149,3886,3887],{"class":1166},"kubectl label nodes node1 disktype=ssd\n",[1149,3889,3890],{"class":1151,"line":1173},[1149,3891,1814],{"emptyLinePlaceholder":1813},[1149,3893,3894],{"class":1151,"line":1777},[1149,3895,3896],{"class":1155},"# Pod 中使用 nodeSelector\n",[1149,3898,3899,3901],{"class":1151,"line":1788},[1149,3900,1612],{"class":1611},[1149,3902,1616],{"class":1615},[1149,3904,3905,3908],{"class":1151,"line":1799},[1149,3906,3907],{"class":1611},"  nodeSelector",[1149,3909,1616],{"class":1615},[1149,3911,3912,3915,3917],{"class":1151,"line":1810},[1149,3913,3914],{"class":1611},"    disktype",[1149,3916,1624],{"class":1615},[1149,3918,3919],{"class":1166},"ssd\n",[895,3921],{},[903,3923,3925],{"id":3924},"q30-node-affinity-和-nodeselector-的区别","Q30: Node Affinity 和 nodeSelector 的区别？",[953,3927,3928,3940],{},[956,3929,3930],{},[959,3931,3932,3934,3937],{},[962,3933,2069],{"align":964},[962,3935,3936],{"align":964},"nodeSelector",[962,3938,3939],{"align":964},"Node Affinity",[973,3941,3942,3953,3964],{},[959,3943,3944,3947,3950],{},[978,3945,3946],{"align":964},"表达能力",[978,3948,3949],{"align":964},"简单匹配",[978,3951,3952],{"align":964},"支持复杂表达式",[959,3954,3955,3958,3961],{},[978,3956,3957],{"align":964},"软硬约束",[978,3959,3960],{"align":964},"硬约束",[978,3962,3963],{"align":964},"支持软硬约束",[959,3965,3966,3969,3972],{},[978,3967,3968],{"align":964},"操作符",[978,3970,3971],{"align":964},"只有 In",[978,3973,3974],{"align":964},"In、NotIn、Exists 等",[1140,3976,3978],{"className":1602,"code":3977,"language":1604,"meta":11,"style":11},"affinity:\n  nodeAffinity:\n    requiredDuringSchedulingIgnoredDuringExecution:  # 硬约束\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: disktype\n          operator: In\n          values: [\"ssd\"]\n    preferredDuringSchedulingIgnoredDuringExecution:  # 软约束\n      - weight: 1\n        preference:\n          matchExpressions:\n          - key: zone\n            operator: In\n            values: [\"zone-a\"]\n",[1146,3979,3980,3987,3994,4005,4012,4021,4034,4044,4056,4066,4078,4085,4092,4103,4112],{"__ignoreMap":11},[1149,3981,3982,3985],{"class":1151,"line":1152},[1149,3983,3984],{"class":1611},"affinity",[1149,3986,1616],{"class":1615},[1149,3988,3989,3992],{"class":1151,"line":1159},[1149,3990,3991],{"class":1611},"  nodeAffinity",[1149,3993,1616],{"class":1615},[1149,3995,3996,3999,4002],{"class":1151,"line":1173},[1149,3997,3998],{"class":1611},"    requiredDuringSchedulingIgnoredDuringExecution",[1149,4000,4001],{"class":1615},":  ",[1149,4003,4004],{"class":1155},"# 硬约束\n",[1149,4006,4007,4010],{"class":1151,"line":1777},[1149,4008,4009],{"class":1611},"      nodeSelectorTerms",[1149,4011,1616],{"class":1615},[1149,4013,4014,4016,4019],{"class":1151,"line":1788},[1149,4015,2258],{"class":1615},[1149,4017,4018],{"class":1611},"matchExpressions",[1149,4020,1616],{"class":1615},[1149,4022,4023,4026,4029,4031],{"class":1151,"line":1799},[1149,4024,4025],{"class":1615},"        - ",[1149,4027,4028],{"class":1611},"key",[1149,4030,1624],{"class":1615},[1149,4032,4033],{"class":1166},"disktype\n",[1149,4035,4036,4039,4041],{"class":1151,"line":1810},[1149,4037,4038],{"class":1611},"          operator",[1149,4040,1624],{"class":1615},[1149,4042,4043],{"class":1166},"In\n",[1149,4045,4046,4049,4051,4054],{"class":1151,"line":1817},[1149,4047,4048],{"class":1611},"          values",[1149,4050,3818],{"class":1615},[1149,4052,4053],{"class":1166},"\"ssd\"",[1149,4055,3824],{"class":1615},[1149,4057,4058,4061,4063],{"class":1151,"line":1825},[1149,4059,4060],{"class":1611},"    preferredDuringSchedulingIgnoredDuringExecution",[1149,4062,4001],{"class":1615},[1149,4064,4065],{"class":1155},"# 软约束\n",[1149,4067,4068,4070,4073,4075],{"class":1151,"line":1832},[1149,4069,2258],{"class":1615},[1149,4071,4072],{"class":1611},"weight",[1149,4074,1624],{"class":1615},[1149,4076,4077],{"class":1454},"1\n",[1149,4079,4080,4083],{"class":1151,"line":1842},[1149,4081,4082],{"class":1611},"        preference",[1149,4084,1616],{"class":1615},[1149,4086,4087,4090],{"class":1151,"line":1851},[1149,4088,4089],{"class":1611},"          matchExpressions",[1149,4091,1616],{"class":1615},[1149,4093,4094,4096,4098,4100],{"class":1151,"line":1861},[1149,4095,2423],{"class":1615},[1149,4097,4028],{"class":1611},[1149,4099,1624],{"class":1615},[1149,4101,4102],{"class":1166},"zone\n",[1149,4104,4105,4108,4110],{"class":1151,"line":2433},[1149,4106,4107],{"class":1611},"            operator",[1149,4109,1624],{"class":1615},[1149,4111,4043],{"class":1166},[1149,4113,4114,4117,4119,4122],{"class":1151,"line":2444},[1149,4115,4116],{"class":1611},"            values",[1149,4118,3818],{"class":1615},[1149,4120,4121],{"class":1166},"\"zone-a\"",[1149,4123,3824],{"class":1615},[895,4125],{},[903,4127,4129],{"id":4128},"q31-pod-affinity-和-anti-affinity-的作用","Q31: Pod Affinity 和 Anti-Affinity 的作用？",[953,4131,4132,4142],{},[956,4133,4134],{},[959,4135,4136,4138,4140],{},[962,4137,2467],{"align":964},[962,4139,1254],{"align":964},[962,4141,2295],{"align":964},[973,4143,4144,4157],{},[959,4145,4146,4151,4154],{},[978,4147,4148],{"align":964},[910,4149,4150],{},"Pod Affinity",[978,4152,4153],{"align":964},"Pod 调度到一起",[978,4155,4156],{"align":964},"关联服务就近部署",[959,4158,4159,4164,4167],{},[978,4160,4161],{"align":964},[910,4162,4163],{},"Pod Anti-Affinity",[978,4165,4166],{"align":964},"Pod 分散调度",[978,4168,4169],{"align":964},"高可用、故障隔离",[1140,4171,4173],{"className":1602,"code":4172,"language":1604,"meta":11,"style":11},"affinity:\n  podAntiAffinity:\n    requiredDuringSchedulingIgnoredDuringExecution:\n    - labelSelector:\n        matchExpressions:\n        - key: app\n          operator: In\n          values: [\"web\"]\n      topologyKey: \"kubernetes.io\u002Fhostname\"  # 不同节点\n",[1146,4174,4175,4181,4188,4194,4204,4211,4222,4230,4241],{"__ignoreMap":11},[1149,4176,4177,4179],{"class":1151,"line":1152},[1149,4178,3984],{"class":1611},[1149,4180,1616],{"class":1615},[1149,4182,4183,4186],{"class":1151,"line":1159},[1149,4184,4185],{"class":1611},"  podAntiAffinity",[1149,4187,1616],{"class":1615},[1149,4189,4190,4192],{"class":1151,"line":1173},[1149,4191,3998],{"class":1611},[1149,4193,1616],{"class":1615},[1149,4195,4196,4199,4202],{"class":1151,"line":1777},[1149,4197,4198],{"class":1615},"    - ",[1149,4200,4201],{"class":1611},"labelSelector",[1149,4203,1616],{"class":1615},[1149,4205,4206,4209],{"class":1151,"line":1788},[1149,4207,4208],{"class":1611},"        matchExpressions",[1149,4210,1616],{"class":1615},[1149,4212,4213,4215,4217,4219],{"class":1151,"line":1799},[1149,4214,4025],{"class":1615},[1149,4216,4028],{"class":1611},[1149,4218,1624],{"class":1615},[1149,4220,4221],{"class":1166},"app\n",[1149,4223,4224,4226,4228],{"class":1151,"line":1810},[1149,4225,4038],{"class":1611},[1149,4227,1624],{"class":1615},[1149,4229,4043],{"class":1166},[1149,4231,4232,4234,4236,4239],{"class":1151,"line":1817},[1149,4233,4048],{"class":1611},[1149,4235,3818],{"class":1615},[1149,4237,4238],{"class":1166},"\"web\"",[1149,4240,3824],{"class":1615},[1149,4242,4243,4246,4248,4251],{"class":1151,"line":1825},[1149,4244,4245],{"class":1611},"      topologyKey",[1149,4247,1624],{"class":1615},[1149,4249,4250],{"class":1166},"\"kubernetes.io\u002Fhostname\"",[1149,4252,4253],{"class":1155},"  # 不同节点\n",[895,4255],{},[903,4257,4259],{"id":4258},"q32-taints-和-tolerations-如何工作","Q32: Taints 和 Tolerations 如何工作？",[892,4261,4262,4265,4266,4269],{},[910,4263,4264],{},"Taints（污点）","：阻止 Pod 调度到节点\n",[910,4267,4268],{},"Tolerations（容忍）","：允许 Pod 调度到有污点的节点",[1140,4271,4273],{"className":1142,"code":4272,"language":1144,"meta":11,"style":11},"# 给节点添加污点\nkubectl taint nodes node1 gpu=true:NoSchedule\n",[1146,4274,4275,4280],{"__ignoreMap":11},[1149,4276,4277],{"class":1151,"line":1152},[1149,4278,4279],{"class":1155},"# 给节点添加污点\n",[1149,4281,4282,4284,4287,4290,4293,4296,4299],{"class":1151,"line":1159},[1149,4283,1163],{"class":1162},[1149,4285,4286],{"class":1166}," taint",[1149,4288,4289],{"class":1166}," nodes",[1149,4291,4292],{"class":1166}," node1",[1149,4294,4295],{"class":1166}," gpu=",[1149,4297,4298],{"class":1454},"true",[1149,4300,4301],{"class":1166},":NoSchedule\n",[1140,4303,4305],{"className":1602,"code":4304,"language":1604,"meta":11,"style":11},"# Pod 添加容忍\ntolerations:\n- key: \"gpu\"\n  operator: \"Equal\"\n  value: \"true\"\n  effect: \"NoSchedule\"\n",[1146,4306,4307,4312,4319,4330,4340,4350],{"__ignoreMap":11},[1149,4308,4309],{"class":1151,"line":1152},[1149,4310,4311],{"class":1155},"# Pod 添加容忍\n",[1149,4313,4314,4317],{"class":1151,"line":1159},[1149,4315,4316],{"class":1611},"tolerations",[1149,4318,1616],{"class":1615},[1149,4320,4321,4323,4325,4327],{"class":1151,"line":1173},[1149,4322,3361],{"class":1615},[1149,4324,4028],{"class":1611},[1149,4326,1624],{"class":1615},[1149,4328,4329],{"class":1166},"\"gpu\"\n",[1149,4331,4332,4335,4337],{"class":1151,"line":1777},[1149,4333,4334],{"class":1611},"  operator",[1149,4336,1624],{"class":1615},[1149,4338,4339],{"class":1166},"\"Equal\"\n",[1149,4341,4342,4345,4347],{"class":1151,"line":1788},[1149,4343,4344],{"class":1611},"  value",[1149,4346,1624],{"class":1615},[1149,4348,4349],{"class":1166},"\"true\"\n",[1149,4351,4352,4355,4357],{"class":1151,"line":1799},[1149,4353,4354],{"class":1611},"  effect",[1149,4356,1624],{"class":1615},[1149,4358,4359],{"class":1166},"\"NoSchedule\"\n",[892,4361,4362],{},[910,4363,4364],{},"Effect 类型：",[920,4366,4367,4373,4379],{},[923,4368,4369,4372],{},[1146,4370,4371],{},"NoSchedule","：不调度新 Pod",[923,4374,4375,4378],{},[1146,4376,4377],{},"PreferNoSchedule","：尽量不调度",[923,4380,4381,4384],{},[1146,4382,4383],{},"NoExecute","：驱逐现有 Pod",[895,4386],{},[903,4388,4390],{"id":4389},"q33-什么是-pod-优先级和抢占","Q33: 什么是 Pod 优先级和抢占？",[892,4392,4393],{},[910,4394,4395],{},"优先级和抢占用于资源紧张时的调度决策。",[1140,4397,4399],{"className":1602,"code":4398,"language":1604,"meta":11,"style":11},"# PriorityClass\napiVersion: scheduling.k8s.io\u002Fv1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 1000000\nglobalDefault: false\ndescription: \"高优先级任务\"\n\n# Pod 使用\nspec:\n  priorityClassName: high-priority\n",[1146,4400,4401,4406,4415,4424,4430,4439,4449,4459,4469,4473,4478,4484],{"__ignoreMap":11},[1149,4402,4403],{"class":1151,"line":1152},[1149,4404,4405],{"class":1155},"# PriorityClass\n",[1149,4407,4408,4410,4412],{"class":1151,"line":1159},[1149,4409,2171],{"class":1611},[1149,4411,1624],{"class":1615},[1149,4413,4414],{"class":1166},"scheduling.k8s.io\u002Fv1\n",[1149,4416,4417,4419,4421],{"class":1151,"line":1173},[1149,4418,2181],{"class":1611},[1149,4420,1624],{"class":1615},[1149,4422,4423],{"class":1166},"PriorityClass\n",[1149,4425,4426,4428],{"class":1151,"line":1777},[1149,4427,2191],{"class":1611},[1149,4429,1616],{"class":1615},[1149,4431,4432,4434,4436],{"class":1151,"line":1788},[1149,4433,2198],{"class":1611},[1149,4435,1624],{"class":1615},[1149,4437,4438],{"class":1166},"high-priority\n",[1149,4440,4441,4444,4446],{"class":1151,"line":1799},[1149,4442,4443],{"class":1611},"value",[1149,4445,1624],{"class":1615},[1149,4447,4448],{"class":1454},"1000000\n",[1149,4450,4451,4454,4456],{"class":1151,"line":1810},[1149,4452,4453],{"class":1611},"globalDefault",[1149,4455,1624],{"class":1615},[1149,4457,4458],{"class":1454},"false\n",[1149,4460,4461,4464,4466],{"class":1151,"line":1817},[1149,4462,4463],{"class":1611},"description",[1149,4465,1624],{"class":1615},[1149,4467,4468],{"class":1166},"\"高优先级任务\"\n",[1149,4470,4471],{"class":1151,"line":1825},[1149,4472,1814],{"emptyLinePlaceholder":1813},[1149,4474,4475],{"class":1151,"line":1832},[1149,4476,4477],{"class":1155},"# Pod 使用\n",[1149,4479,4480,4482],{"class":1151,"line":1842},[1149,4481,1612],{"class":1611},[1149,4483,1616],{"class":1615},[1149,4485,4486,4489,4491],{"class":1151,"line":1851},[1149,4487,4488],{"class":1611},"  priorityClassName",[1149,4490,1624],{"class":1615},[1149,4492,4438],{"class":1166},[892,4494,4495,4498],{},[910,4496,4497],{},"抢占机制："," 当高优先级 Pod 无法调度时，会驱逐低优先级 Pod",[895,4500],{},[903,4502,4504],{"id":4503},"q34-hpa-如何实现自动扩缩容","Q34: HPA 如何实现自动扩缩容？",[892,4506,4507],{},[910,4508,4509],{},"HPA（Horizontal Pod Autoscaler）根据指标自动调整 Pod 副本数。",[1140,4511,4513],{"className":1602,"code":4512,"language":1604,"meta":11,"style":11},"apiVersion: autoscaling\u002Fv2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: my-hpa\nspec:\n  scaleTargetRef:\n    apiVersion: apps\u002Fv1\n    kind: Deployment\n    name: my-deployment\n  minReplicas: 2\n  maxReplicas: 10\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70\n",[1146,4514,4515,4524,4533,4539,4548,4554,4561,4570,4580,4589,4599,4608,4615,4626,4633,4642,4649,4659],{"__ignoreMap":11},[1149,4516,4517,4519,4521],{"class":1151,"line":1152},[1149,4518,2171],{"class":1611},[1149,4520,1624],{"class":1615},[1149,4522,4523],{"class":1166},"autoscaling\u002Fv2\n",[1149,4525,4526,4528,4530],{"class":1151,"line":1159},[1149,4527,2181],{"class":1611},[1149,4529,1624],{"class":1615},[1149,4531,4532],{"class":1166},"HorizontalPodAutoscaler\n",[1149,4534,4535,4537],{"class":1151,"line":1173},[1149,4536,2191],{"class":1611},[1149,4538,1616],{"class":1615},[1149,4540,4541,4543,4545],{"class":1151,"line":1777},[1149,4542,2198],{"class":1611},[1149,4544,1624],{"class":1615},[1149,4546,4547],{"class":1166},"my-hpa\n",[1149,4549,4550,4552],{"class":1151,"line":1788},[1149,4551,1612],{"class":1611},[1149,4553,1616],{"class":1615},[1149,4555,4556,4559],{"class":1151,"line":1799},[1149,4557,4558],{"class":1611},"  scaleTargetRef",[1149,4560,1616],{"class":1615},[1149,4562,4563,4566,4568],{"class":1151,"line":1810},[1149,4564,4565],{"class":1611},"    apiVersion",[1149,4567,1624],{"class":1615},[1149,4569,2176],{"class":1166},[1149,4571,4572,4575,4577],{"class":1151,"line":1817},[1149,4573,4574],{"class":1611},"    kind",[1149,4576,1624],{"class":1615},[1149,4578,4579],{"class":1166},"Deployment\n",[1149,4581,4582,4584,4586],{"class":1151,"line":1825},[1149,4583,3430],{"class":1611},[1149,4585,1624],{"class":1615},[1149,4587,4588],{"class":1166},"my-deployment\n",[1149,4590,4591,4594,4596],{"class":1151,"line":1832},[1149,4592,4593],{"class":1611},"  minReplicas",[1149,4595,1624],{"class":1615},[1149,4597,4598],{"class":1454},"2\n",[1149,4600,4601,4604,4606],{"class":1151,"line":1842},[1149,4602,4603],{"class":1611},"  maxReplicas",[1149,4605,1624],{"class":1615},[1149,4607,1807],{"class":1454},[1149,4609,4610,4613],{"class":1151,"line":1851},[1149,4611,4612],{"class":1611},"  metrics",[1149,4614,1616],{"class":1615},[1149,4616,4617,4619,4621,4623],{"class":1151,"line":1861},[1149,4618,2608],{"class":1615},[1149,4620,3302],{"class":1611},[1149,4622,1624],{"class":1615},[1149,4624,4625],{"class":1166},"Resource\n",[1149,4627,4628,4631],{"class":1151,"line":2433},[1149,4629,4630],{"class":1611},"    resource",[1149,4632,1616],{"class":1615},[1149,4634,4635,4637,4639],{"class":1151,"line":2444},[1149,4636,2228],{"class":1611},[1149,4638,1624],{"class":1615},[1149,4640,4641],{"class":1166},"cpu\n",[1149,4643,4644,4647],{"class":1151,"line":2937},[1149,4645,4646],{"class":1611},"      target",[1149,4648,1616],{"class":1615},[1149,4650,4651,4654,4656],{"class":1151,"line":3299},[1149,4652,4653],{"class":1611},"        type",[1149,4655,1624],{"class":1615},[1149,4657,4658],{"class":1166},"Utilization\n",[1149,4660,4661,4664,4666],{"class":1151,"line":3310},[1149,4662,4663],{"class":1611},"        averageUtilization",[1149,4665,1624],{"class":1615},[1149,4667,4668],{"class":1454},"70\n",[1140,4670,4672],{"className":1142,"code":4671,"language":1144,"meta":11,"style":11},"# 快速创建 HPA\nkubectl autoscale deployment nginx --min=2 --max=10 --cpu-percent=70\n",[1146,4673,4674,4679],{"__ignoreMap":11},[1149,4675,4676],{"class":1151,"line":1152},[1149,4677,4678],{"class":1155},"# 快速创建 HPA\n",[1149,4680,4681,4683,4686,4689,4692,4695,4698],{"class":1151,"line":1159},[1149,4682,1163],{"class":1162},[1149,4684,4685],{"class":1166}," autoscale",[1149,4687,4688],{"class":1166}," deployment",[1149,4690,4691],{"class":1166}," nginx",[1149,4693,4694],{"class":1454}," --min=2",[1149,4696,4697],{"class":1454}," --max=10",[1149,4699,4700],{"class":1454}," --cpu-percent=70\n",[895,4702],{},[903,4704,4706],{"id":4705},"q35-hpa-和-vpa-的区别","Q35: HPA 和 VPA 的区别？",[953,4708,4709,4721],{},[956,4710,4711],{},[959,4712,4713,4715,4718],{},[962,4714,2069],{"align":964},[962,4716,4717],{"align":964},"HPA",[962,4719,4720],{"align":964},"VPA",[973,4722,4723,4734,4743],{},[959,4724,4725,4728,4731],{},[978,4726,4727],{"align":964},"扩展方式",[978,4729,4730],{"align":964},"水平扩展（增加 Pod 数量）",[978,4732,4733],{"align":964},"垂直扩展（调整资源配额）",[959,4735,4736,4738,4740],{},[978,4737,2295],{"align":964},[978,4739,2128],{"align":964},[978,4741,4742],{"align":964},"有状态服务、单实例应用",[959,4744,4745,4748,4751],{},[978,4746,4747],{"align":964},"成熟度",[978,4749,4750],{"align":964},"内置稳定",[978,4752,4753],{"align":964},"需要额外安装",[895,4755],{},[898,4757,4759],{"id":4758},"五网络与安全","五、网络与安全",[903,4761,4763],{"id":4762},"q36-kubernetes-网络模型的基本原则","Q36: Kubernetes 网络模型的基本原则？",[892,4765,4766],{},[910,4767,4768],{},"K8s 网络模型要求：",[1122,4770,4771,4777,4783],{},[923,4772,4773,4776],{},[910,4774,4775],{},"Pod 间通信","：所有 Pod 可以直接通信（无 NAT）",[923,4778,4779,4782],{},[910,4780,4781],{},"Node 与 Pod 通信","：节点可以直接与所有 Pod 通信",[923,4784,4785,4788],{},[910,4786,4787],{},"Pod IP 一致","：Pod 看到的自己 IP 与其他 Pod 看到的一致",[892,4790,4791],{},[910,4792,4793],{},"常见 CNI 插件：",[920,4795,4796,4799,4802,4805],{},[923,4797,4798],{},"Calico",[923,4800,4801],{},"Flannel",[923,4803,4804],{},"Cilium",[923,4806,4807],{},"Weave Net",[895,4809],{},[903,4811,4813],{"id":4812},"q37-pod-之间如何通信","Q37: Pod 之间如何通信？",[953,4815,4816,4826],{},[956,4817,4818],{},[959,4819,4820,4823],{},[962,4821,4822],{"align":964},"场景",[962,4824,4825],{"align":964},"通信方式",[973,4827,4828,4838,4848,4858],{},[959,4829,4830,4835],{},[978,4831,4832],{"align":964},[910,4833,4834],{},"同 Pod 内容器",[978,4836,4837],{"align":964},"localhost",[959,4839,4840,4845],{},[978,4841,4842],{"align":964},[910,4843,4844],{},"同 Node 的 Pod",[978,4846,4847],{"align":964},"直接通过 Pod IP",[959,4849,4850,4855],{},[978,4851,4852],{"align":964},[910,4853,4854],{},"跨 Node 的 Pod",[978,4856,4857],{"align":964},"通过 CNI 网络插件",[959,4859,4860,4865],{},[978,4861,4862],{"align":964},[910,4863,4864],{},"通过 Service",[978,4866,4867],{"align":964},"ClusterIP \u002F DNS",[895,4869],{},[903,4871,4873],{"id":4872},"q38-networkpolicy-的作用","Q38: NetworkPolicy 的作用？",[892,4875,4876],{},[910,4877,4878],{},"NetworkPolicy 用于控制 Pod 间的网络访问。",[1140,4880,4882],{"className":1602,"code":4881,"language":1604,"meta":11,"style":11},"apiVersion: networking.k8s.io\u002Fv1\nkind: NetworkPolicy\nmetadata:\n  name: deny-all\n  namespace: production\nspec:\n  podSelector: {}  # 应用到所有 Pod\n  policyTypes:\n  - Ingress\n  - Egress\n  # 不定义规则 = 拒绝所有\n\n---\napiVersion: networking.k8s.io\u002Fv1\nkind: NetworkPolicy\nmetadata:\n  name: allow-web\nspec:\n  podSelector:\n    matchLabels:\n      app: api\n  ingress:\n  - from:\n    - podSelector:\n        matchLabels:\n          app: web\n    ports:\n    - port: 8080\n",[1146,4883,4884,4892,4901,4907,4916,4926,4932,4943,4950,4956,4963,4968,4972,4977,4985,4993,4999,5008,5014,5020,5026,5036,5044,5054,5064,5072,5083,5091],{"__ignoreMap":11},[1149,4885,4886,4888,4890],{"class":1151,"line":1152},[1149,4887,2171],{"class":1611},[1149,4889,1624],{"class":1615},[1149,4891,2819],{"class":1166},[1149,4893,4894,4896,4898],{"class":1151,"line":1159},[1149,4895,2181],{"class":1611},[1149,4897,1624],{"class":1615},[1149,4899,4900],{"class":1166},"NetworkPolicy\n",[1149,4902,4903,4905],{"class":1151,"line":1173},[1149,4904,2191],{"class":1611},[1149,4906,1616],{"class":1615},[1149,4908,4909,4911,4913],{"class":1151,"line":1777},[1149,4910,2198],{"class":1611},[1149,4912,1624],{"class":1615},[1149,4914,4915],{"class":1166},"deny-all\n",[1149,4917,4918,4921,4923],{"class":1151,"line":1788},[1149,4919,4920],{"class":1611},"  namespace",[1149,4922,1624],{"class":1615},[1149,4924,4925],{"class":1166},"production\n",[1149,4927,4928,4930],{"class":1151,"line":1799},[1149,4929,1612],{"class":1611},[1149,4931,1616],{"class":1615},[1149,4933,4934,4937,4940],{"class":1151,"line":1810},[1149,4935,4936],{"class":1611},"  podSelector",[1149,4938,4939],{"class":1615},": {}  ",[1149,4941,4942],{"class":1155},"# 应用到所有 Pod\n",[1149,4944,4945,4948],{"class":1151,"line":1817},[1149,4946,4947],{"class":1611},"  policyTypes",[1149,4949,1616],{"class":1615},[1149,4951,4952,4954],{"class":1151,"line":1825},[1149,4953,2608],{"class":1615},[1149,4955,2828],{"class":1166},[1149,4957,4958,4960],{"class":1151,"line":1832},[1149,4959,2608],{"class":1615},[1149,4961,4962],{"class":1166},"Egress\n",[1149,4964,4965],{"class":1151,"line":1842},[1149,4966,4967],{"class":1155},"  # 不定义规则 = 拒绝所有\n",[1149,4969,4970],{"class":1151,"line":1851},[1149,4971,1814],{"emptyLinePlaceholder":1813},[1149,4973,4974],{"class":1151,"line":1861},[1149,4975,4976],{"class":1162},"---\n",[1149,4978,4979,4981,4983],{"class":1151,"line":2433},[1149,4980,2171],{"class":1611},[1149,4982,1624],{"class":1615},[1149,4984,2819],{"class":1166},[1149,4986,4987,4989,4991],{"class":1151,"line":2444},[1149,4988,2181],{"class":1611},[1149,4990,1624],{"class":1615},[1149,4992,4900],{"class":1166},[1149,4994,4995,4997],{"class":1151,"line":2937},[1149,4996,2191],{"class":1611},[1149,4998,1616],{"class":1615},[1149,5000,5001,5003,5005],{"class":1151,"line":3299},[1149,5002,2198],{"class":1611},[1149,5004,1624],{"class":1615},[1149,5006,5007],{"class":1166},"allow-web\n",[1149,5009,5010,5012],{"class":1151,"line":3310},[1149,5011,1612],{"class":1611},[1149,5013,1616],{"class":1615},[1149,5015,5016,5018],{"class":1151,"line":3317},[1149,5017,4936],{"class":1611},[1149,5019,1616],{"class":1615},[1149,5021,5022,5024],{"class":1151,"line":3486},[1149,5023,2221],{"class":1611},[1149,5025,1616],{"class":1615},[1149,5027,5028,5031,5033],{"class":1151,"line":3497},[1149,5029,5030],{"class":1611},"      app",[1149,5032,1624],{"class":1615},[1149,5034,5035],{"class":1166},"api\n",[1149,5037,5039,5042],{"class":1151,"line":5038},22,[1149,5040,5041],{"class":1611},"  ingress",[1149,5043,1616],{"class":1615},[1149,5045,5047,5049,5052],{"class":1151,"line":5046},23,[1149,5048,2608],{"class":1615},[1149,5050,5051],{"class":1611},"from",[1149,5053,1616],{"class":1615},[1149,5055,5057,5059,5062],{"class":1151,"line":5056},24,[1149,5058,4198],{"class":1615},[1149,5060,5061],{"class":1611},"podSelector",[1149,5063,1616],{"class":1615},[1149,5065,5067,5070],{"class":1151,"line":5066},25,[1149,5068,5069],{"class":1611},"        matchLabels",[1149,5071,1616],{"class":1615},[1149,5073,5075,5078,5080],{"class":1151,"line":5074},26,[1149,5076,5077],{"class":1611},"          app",[1149,5079,1624],{"class":1615},[1149,5081,5082],{"class":1166},"web\n",[1149,5084,5086,5089],{"class":1151,"line":5085},27,[1149,5087,5088],{"class":1611},"    ports",[1149,5090,1616],{"class":1615},[1149,5092,5094,5096,5098,5100],{"class":1151,"line":5093},28,[1149,5095,4198],{"class":1615},[1149,5097,2611],{"class":1611},[1149,5099,1624],{"class":1615},[1149,5101,1785],{"class":1454},[895,5103],{},[903,5105,5107],{"id":5106},"q39-rbac-权限控制如何工作","Q39: RBAC 权限控制如何工作？",[892,5109,5110],{},[910,5111,5112],{},"RBAC（Role-Based Access Control）基于角色的权限控制。",[953,5114,5115,5126],{},[956,5116,5117],{},[959,5118,5119,5121,5123],{},[962,5120,2290],{"align":964},[962,5122,1254],{"align":964},[962,5124,5125],{"align":964},"作用域",[973,5127,5128,5139,5149,5159],{},[959,5129,5130,5133,5136],{},[978,5131,5132],{"align":964},"Role",[978,5134,5135],{"align":964},"定义权限",[978,5137,5138],{"align":964},"命名空间级别",[959,5140,5141,5144,5146],{},[978,5142,5143],{"align":964},"ClusterRole",[978,5145,5135],{"align":964},[978,5147,5148],{"align":964},"集群级别",[959,5150,5151,5154,5157],{},[978,5152,5153],{"align":964},"RoleBinding",[978,5155,5156],{"align":964},"绑定用户和 Role",[978,5158,5138],{"align":964},[959,5160,5161,5164,5167],{},[978,5162,5163],{"align":964},"ClusterRoleBinding",[978,5165,5166],{"align":964},"绑定用户和 ClusterRole",[978,5168,5148],{"align":964},[1140,5170,5172],{"className":1602,"code":5171,"language":1604,"meta":11,"style":11},"# Role\napiVersion: rbac.authorization.k8s.io\u002Fv1\nkind: Role\nmetadata:\n  namespace: default\n  name: pod-reader\nrules:\n- apiGroups: [\"\"]\n  resources: [\"pods\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n\n# RoleBinding\napiVersion: rbac.authorization.k8s.io\u002Fv1\nkind: RoleBinding\nmetadata:\n  name: read-pods\n  namespace: default\nsubjects:\n- kind: User\n  name: alice\n  apiGroup: rbac.authorization.k8s.io\nroleRef:\n  kind: Role\n  name: pod-reader\n  apiGroup: rbac.authorization.k8s.io\n",[1146,5173,5174,5179,5188,5197,5203,5212,5221,5228,5242,5253,5276,5280,5285,5293,5302,5308,5317,5325,5332,5343,5352,5362,5369,5378,5386],{"__ignoreMap":11},[1149,5175,5176],{"class":1151,"line":1152},[1149,5177,5178],{"class":1155},"# Role\n",[1149,5180,5181,5183,5185],{"class":1151,"line":1159},[1149,5182,2171],{"class":1611},[1149,5184,1624],{"class":1615},[1149,5186,5187],{"class":1166},"rbac.authorization.k8s.io\u002Fv1\n",[1149,5189,5190,5192,5194],{"class":1151,"line":1173},[1149,5191,2181],{"class":1611},[1149,5193,1624],{"class":1615},[1149,5195,5196],{"class":1166},"Role\n",[1149,5198,5199,5201],{"class":1151,"line":1777},[1149,5200,2191],{"class":1611},[1149,5202,1616],{"class":1615},[1149,5204,5205,5207,5209],{"class":1151,"line":1788},[1149,5206,4920],{"class":1611},[1149,5208,1624],{"class":1615},[1149,5210,5211],{"class":1166},"default\n",[1149,5213,5214,5216,5218],{"class":1151,"line":1799},[1149,5215,2198],{"class":1611},[1149,5217,1624],{"class":1615},[1149,5219,5220],{"class":1166},"pod-reader\n",[1149,5222,5223,5226],{"class":1151,"line":1810},[1149,5224,5225],{"class":1611},"rules",[1149,5227,1616],{"class":1615},[1149,5229,5230,5232,5235,5237,5240],{"class":1151,"line":1817},[1149,5231,3361],{"class":1615},[1149,5233,5234],{"class":1611},"apiGroups",[1149,5236,3818],{"class":1615},[1149,5238,5239],{"class":1166},"\"\"",[1149,5241,3824],{"class":1615},[1149,5243,5244,5246,5248,5251],{"class":1151,"line":1825},[1149,5245,3838],{"class":1611},[1149,5247,3818],{"class":1615},[1149,5249,5250],{"class":1166},"\"pods\"",[1149,5252,3824],{"class":1615},[1149,5254,5255,5258,5260,5263,5266,5269,5271,5274],{"class":1151,"line":1832},[1149,5256,5257],{"class":1611},"  verbs",[1149,5259,3818],{"class":1615},[1149,5261,5262],{"class":1166},"\"get\"",[1149,5264,5265],{"class":1615},", ",[1149,5267,5268],{"class":1166},"\"list\"",[1149,5270,5265],{"class":1615},[1149,5272,5273],{"class":1166},"\"watch\"",[1149,5275,3824],{"class":1615},[1149,5277,5278],{"class":1151,"line":1842},[1149,5279,1814],{"emptyLinePlaceholder":1813},[1149,5281,5282],{"class":1151,"line":1851},[1149,5283,5284],{"class":1155},"# RoleBinding\n",[1149,5286,5287,5289,5291],{"class":1151,"line":1861},[1149,5288,2171],{"class":1611},[1149,5290,1624],{"class":1615},[1149,5292,5187],{"class":1166},[1149,5294,5295,5297,5299],{"class":1151,"line":2433},[1149,5296,2181],{"class":1611},[1149,5298,1624],{"class":1615},[1149,5300,5301],{"class":1166},"RoleBinding\n",[1149,5303,5304,5306],{"class":1151,"line":2444},[1149,5305,2191],{"class":1611},[1149,5307,1616],{"class":1615},[1149,5309,5310,5312,5314],{"class":1151,"line":2937},[1149,5311,2198],{"class":1611},[1149,5313,1624],{"class":1615},[1149,5315,5316],{"class":1166},"read-pods\n",[1149,5318,5319,5321,5323],{"class":1151,"line":3299},[1149,5320,4920],{"class":1611},[1149,5322,1624],{"class":1615},[1149,5324,5211],{"class":1166},[1149,5326,5327,5330],{"class":1151,"line":3310},[1149,5328,5329],{"class":1611},"subjects",[1149,5331,1616],{"class":1615},[1149,5333,5334,5336,5338,5340],{"class":1151,"line":3317},[1149,5335,3361],{"class":1615},[1149,5337,2181],{"class":1611},[1149,5339,1624],{"class":1615},[1149,5341,5342],{"class":1166},"User\n",[1149,5344,5345,5347,5349],{"class":1151,"line":3486},[1149,5346,2198],{"class":1611},[1149,5348,1624],{"class":1615},[1149,5350,5351],{"class":1166},"alice\n",[1149,5353,5354,5357,5359],{"class":1151,"line":3497},[1149,5355,5356],{"class":1611},"  apiGroup",[1149,5358,1624],{"class":1615},[1149,5360,5361],{"class":1166},"rbac.authorization.k8s.io\n",[1149,5363,5364,5367],{"class":1151,"line":5038},[1149,5365,5366],{"class":1611},"roleRef",[1149,5368,1616],{"class":1615},[1149,5370,5371,5374,5376],{"class":1151,"line":5046},[1149,5372,5373],{"class":1611},"  kind",[1149,5375,1624],{"class":1615},[1149,5377,5196],{"class":1166},[1149,5379,5380,5382,5384],{"class":1151,"line":5056},[1149,5381,2198],{"class":1611},[1149,5383,1624],{"class":1615},[1149,5385,5220],{"class":1166},[1149,5387,5388,5390,5392],{"class":1151,"line":5066},[1149,5389,5356],{"class":1611},[1149,5391,1624],{"class":1615},[1149,5393,5361],{"class":1166},[895,5395],{},[903,5397,5399],{"id":5398},"q40-serviceaccount-的作用","Q40: ServiceAccount 的作用？",[892,5401,5402],{},[910,5403,5404],{},"ServiceAccount 为 Pod 提供身份认证。",[892,5406,5407],{},[910,5408,5409],{},"用途：",[1122,5411,5412,5415,5418],{},[923,5413,5414],{},"Pod 访问 API Server 的身份",[923,5416,5417],{},"拉取私有镜像的凭证",[923,5419,5420],{},"RBAC 权限绑定的主体",[1140,5422,5424],{"className":1602,"code":5423,"language":1604,"meta":11,"style":11},"# 创建 ServiceAccount\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: my-sa\n  \n# Pod 使用 ServiceAccount\nspec:\n  serviceAccountName: my-sa\n",[1146,5425,5426,5431,5439,5448,5454,5463,5468,5473,5479],{"__ignoreMap":11},[1149,5427,5428],{"class":1151,"line":1152},[1149,5429,5430],{"class":1155},"# 创建 ServiceAccount\n",[1149,5432,5433,5435,5437],{"class":1151,"line":1159},[1149,5434,2171],{"class":1611},[1149,5436,1624],{"class":1615},[1149,5438,2540],{"class":1166},[1149,5440,5441,5443,5445],{"class":1151,"line":1173},[1149,5442,2181],{"class":1611},[1149,5444,1624],{"class":1615},[1149,5446,5447],{"class":1166},"ServiceAccount\n",[1149,5449,5450,5452],{"class":1151,"line":1777},[1149,5451,2191],{"class":1611},[1149,5453,1616],{"class":1615},[1149,5455,5456,5458,5460],{"class":1151,"line":1788},[1149,5457,2198],{"class":1611},[1149,5459,1624],{"class":1615},[1149,5461,5462],{"class":1166},"my-sa\n",[1149,5464,5465],{"class":1151,"line":1799},[1149,5466,5467],{"class":1615},"  \n",[1149,5469,5470],{"class":1151,"line":1810},[1149,5471,5472],{"class":1155},"# Pod 使用 ServiceAccount\n",[1149,5474,5475,5477],{"class":1151,"line":1817},[1149,5476,1612],{"class":1611},[1149,5478,1616],{"class":1615},[1149,5480,5481,5484,5486],{"class":1151,"line":1825},[1149,5482,5483],{"class":1611},"  serviceAccountName",[1149,5485,1624],{"class":1615},[1149,5487,5462],{"class":1166},[895,5489],{},[903,5491,5493],{"id":5492},"q41-pod-security-如何配置","Q41: Pod Security 如何配置？",[892,5495,5496],{},[910,5497,5498],{},"Pod Security 控制 Pod 的安全上下文。",[1140,5500,5502],{"className":1602,"code":5501,"language":1604,"meta":11,"style":11},"spec:\n  securityContext:\n    runAsUser: 1000          # 运行用户\n    runAsGroup: 3000         # 运行组\n    fsGroup: 2000            # 文件系统组\n    runAsNonRoot: true       # 禁止 root 运行\n  containers:\n  - name: app\n    securityContext:\n      allowPrivilegeEscalation: false  # 禁止提权\n      readOnlyRootFilesystem: true     # 只读根文件系统\n      capabilities:\n        drop: [\"ALL\"]\n",[1146,5503,5504,5510,5517,5530,5543,5556,5568,5575,5585,5592,5605,5617,5624],{"__ignoreMap":11},[1149,5505,5506,5508],{"class":1151,"line":1152},[1149,5507,1612],{"class":1611},[1149,5509,1616],{"class":1615},[1149,5511,5512,5515],{"class":1151,"line":1159},[1149,5513,5514],{"class":1611},"  securityContext",[1149,5516,1616],{"class":1615},[1149,5518,5519,5522,5524,5527],{"class":1151,"line":1173},[1149,5520,5521],{"class":1611},"    runAsUser",[1149,5523,1624],{"class":1615},[1149,5525,5526],{"class":1454},"1000",[1149,5528,5529],{"class":1155},"          # 运行用户\n",[1149,5531,5532,5535,5537,5540],{"class":1151,"line":1777},[1149,5533,5534],{"class":1611},"    runAsGroup",[1149,5536,1624],{"class":1615},[1149,5538,5539],{"class":1454},"3000",[1149,5541,5542],{"class":1155},"         # 运行组\n",[1149,5544,5545,5548,5550,5553],{"class":1151,"line":1788},[1149,5546,5547],{"class":1611},"    fsGroup",[1149,5549,1624],{"class":1615},[1149,5551,5552],{"class":1454},"2000",[1149,5554,5555],{"class":1155},"            # 文件系统组\n",[1149,5557,5558,5561,5563,5565],{"class":1151,"line":1799},[1149,5559,5560],{"class":1611},"    runAsNonRoot",[1149,5562,1624],{"class":1615},[1149,5564,4298],{"class":1454},[1149,5566,5567],{"class":1155},"       # 禁止 root 运行\n",[1149,5569,5570,5573],{"class":1151,"line":1810},[1149,5571,5572],{"class":1611},"  containers",[1149,5574,1616],{"class":1615},[1149,5576,5577,5579,5581,5583],{"class":1151,"line":1817},[1149,5578,2608],{"class":1615},[1149,5580,2261],{"class":1611},[1149,5582,1624],{"class":1615},[1149,5584,4221],{"class":1166},[1149,5586,5587,5590],{"class":1151,"line":1825},[1149,5588,5589],{"class":1611},"    securityContext",[1149,5591,1616],{"class":1615},[1149,5593,5594,5597,5599,5602],{"class":1151,"line":1832},[1149,5595,5596],{"class":1611},"      allowPrivilegeEscalation",[1149,5598,1624],{"class":1615},[1149,5600,5601],{"class":1454},"false",[1149,5603,5604],{"class":1155},"  # 禁止提权\n",[1149,5606,5607,5610,5612,5614],{"class":1151,"line":1842},[1149,5608,5609],{"class":1611},"      readOnlyRootFilesystem",[1149,5611,1624],{"class":1615},[1149,5613,4298],{"class":1454},[1149,5615,5616],{"class":1155},"     # 只读根文件系统\n",[1149,5618,5619,5622],{"class":1151,"line":1851},[1149,5620,5621],{"class":1611},"      capabilities",[1149,5623,1616],{"class":1615},[1149,5625,5626,5629,5631,5634],{"class":1151,"line":1861},[1149,5627,5628],{"class":1611},"        drop",[1149,5630,3818],{"class":1615},[1149,5632,5633],{"class":1166},"\"ALL\"",[1149,5635,3824],{"class":1615},[895,5637],{},[898,5639,5641],{"id":5640},"六运维与监控","六、运维与监控",[903,5643,5645],{"id":5644},"q42-kubectl-常用命令有哪些","Q42: kubectl 常用命令有哪些？",[1140,5647,5649],{"className":1142,"code":5648,"language":1144,"meta":11,"style":11},"# 资源查看\nkubectl get pods -o wide\nkubectl describe pod nginx\nkubectl logs nginx -f --tail=100\n\n# 资源创建\nkubectl apply -f deployment.yaml\nkubectl create deployment nginx --image=nginx\n\n# 资源编辑\nkubectl edit deployment nginx\nkubectl patch deployment nginx -p '{\"spec\":{\"replicas\":3}}'\n\n# 资源删除\nkubectl delete pod nginx\nkubectl delete -f deployment.yaml\n\n# 调试命令\nkubectl exec -it nginx -- \u002Fbin\u002Fsh\nkubectl port-forward pod\u002Fnginx 8080:80\nkubectl cp nginx:\u002Fvar\u002Flog\u002Fapp.log .\u002Fapp.log\n\n# 集群管理\nkubectl get nodes\nkubectl cordon node1        # 禁止调度\nkubectl drain node1         # 驱逐并禁止调度\nkubectl uncordon node1      # 恢复调度\n",[1146,5650,5651,5656,5671,5684,5698,5702,5707,5719,5733,5737,5742,5753,5770,5774,5779,5790,5800,5804,5809,5827,5840,5853,5857,5862,5871,5883,5895],{"__ignoreMap":11},[1149,5652,5653],{"class":1151,"line":1152},[1149,5654,5655],{"class":1155},"# 资源查看\n",[1149,5657,5658,5660,5662,5665,5668],{"class":1151,"line":1159},[1149,5659,1163],{"class":1162},[1149,5661,1167],{"class":1166},[1149,5663,5664],{"class":1166}," pods",[1149,5666,5667],{"class":1454}," -o",[1149,5669,5670],{"class":1166}," wide\n",[1149,5672,5673,5675,5678,5681],{"class":1151,"line":1173},[1149,5674,1163],{"class":1162},[1149,5676,5677],{"class":1166}," describe",[1149,5679,5680],{"class":1166}," pod",[1149,5682,5683],{"class":1166}," nginx\n",[1149,5685,5686,5688,5690,5692,5695],{"class":1151,"line":1777},[1149,5687,1163],{"class":1162},[1149,5689,1451],{"class":1166},[1149,5691,4691],{"class":1166},[1149,5693,5694],{"class":1454}," -f",[1149,5696,5697],{"class":1454}," --tail=100\n",[1149,5699,5700],{"class":1151,"line":1788},[1149,5701,1814],{"emptyLinePlaceholder":1813},[1149,5703,5704],{"class":1151,"line":1799},[1149,5705,5706],{"class":1155},"# 资源创建\n",[1149,5708,5709,5711,5714,5716],{"class":1151,"line":1810},[1149,5710,1163],{"class":1162},[1149,5712,5713],{"class":1166}," apply",[1149,5715,5694],{"class":1454},[1149,5717,5718],{"class":1166}," deployment.yaml\n",[1149,5720,5721,5723,5726,5728,5730],{"class":1151,"line":1817},[1149,5722,1163],{"class":1162},[1149,5724,5725],{"class":1166}," create",[1149,5727,4688],{"class":1166},[1149,5729,4691],{"class":1166},[1149,5731,5732],{"class":1454}," --image=nginx\n",[1149,5734,5735],{"class":1151,"line":1825},[1149,5736,1814],{"emptyLinePlaceholder":1813},[1149,5738,5739],{"class":1151,"line":1832},[1149,5740,5741],{"class":1155},"# 资源编辑\n",[1149,5743,5744,5746,5749,5751],{"class":1151,"line":1842},[1149,5745,1163],{"class":1162},[1149,5747,5748],{"class":1166}," edit",[1149,5750,4688],{"class":1166},[1149,5752,5683],{"class":1166},[1149,5754,5755,5757,5760,5762,5764,5767],{"class":1151,"line":1851},[1149,5756,1163],{"class":1162},[1149,5758,5759],{"class":1166}," patch",[1149,5761,4688],{"class":1166},[1149,5763,4691],{"class":1166},[1149,5765,5766],{"class":1454}," -p",[1149,5768,5769],{"class":1166}," '{\"spec\":{\"replicas\":3}}'\n",[1149,5771,5772],{"class":1151,"line":1861},[1149,5773,1814],{"emptyLinePlaceholder":1813},[1149,5775,5776],{"class":1151,"line":2433},[1149,5777,5778],{"class":1155},"# 资源删除\n",[1149,5780,5781,5783,5786,5788],{"class":1151,"line":2444},[1149,5782,1163],{"class":1162},[1149,5784,5785],{"class":1166}," delete",[1149,5787,5680],{"class":1166},[1149,5789,5683],{"class":1166},[1149,5791,5792,5794,5796,5798],{"class":1151,"line":2937},[1149,5793,1163],{"class":1162},[1149,5795,5785],{"class":1166},[1149,5797,5694],{"class":1454},[1149,5799,5718],{"class":1166},[1149,5801,5802],{"class":1151,"line":3299},[1149,5803,1814],{"emptyLinePlaceholder":1813},[1149,5805,5806],{"class":1151,"line":3310},[1149,5807,5808],{"class":1155},"# 调试命令\n",[1149,5810,5811,5813,5816,5819,5821,5824],{"class":1151,"line":3317},[1149,5812,1163],{"class":1162},[1149,5814,5815],{"class":1166}," exec",[1149,5817,5818],{"class":1454}," -it",[1149,5820,4691],{"class":1166},[1149,5822,5823],{"class":1454}," --",[1149,5825,5826],{"class":1166}," \u002Fbin\u002Fsh\n",[1149,5828,5829,5831,5834,5837],{"class":1151,"line":3486},[1149,5830,1163],{"class":1162},[1149,5832,5833],{"class":1166}," port-forward",[1149,5835,5836],{"class":1166}," pod\u002Fnginx",[1149,5838,5839],{"class":1166}," 8080:80\n",[1149,5841,5842,5844,5847,5850],{"class":1151,"line":3497},[1149,5843,1163],{"class":1162},[1149,5845,5846],{"class":1166}," cp",[1149,5848,5849],{"class":1166}," nginx:\u002Fvar\u002Flog\u002Fapp.log",[1149,5851,5852],{"class":1166}," .\u002Fapp.log\n",[1149,5854,5855],{"class":1151,"line":5038},[1149,5856,1814],{"emptyLinePlaceholder":1813},[1149,5858,5859],{"class":1151,"line":5046},[1149,5860,5861],{"class":1155},"# 集群管理\n",[1149,5863,5864,5866,5868],{"class":1151,"line":5056},[1149,5865,1163],{"class":1162},[1149,5867,1167],{"class":1166},[1149,5869,5870],{"class":1166}," nodes\n",[1149,5872,5873,5875,5878,5880],{"class":1151,"line":5066},[1149,5874,1163],{"class":1162},[1149,5876,5877],{"class":1166}," cordon",[1149,5879,4292],{"class":1166},[1149,5881,5882],{"class":1155},"        # 禁止调度\n",[1149,5884,5885,5887,5890,5892],{"class":1151,"line":5074},[1149,5886,1163],{"class":1162},[1149,5888,5889],{"class":1166}," drain",[1149,5891,4292],{"class":1166},[1149,5893,5894],{"class":1155},"         # 驱逐并禁止调度\n",[1149,5896,5897,5899,5902,5904],{"class":1151,"line":5085},[1149,5898,1163],{"class":1162},[1149,5900,5901],{"class":1166}," uncordon",[1149,5903,4292],{"class":1166},[1149,5905,5906],{"class":1155},"      # 恢复调度\n",[895,5908],{},[903,5910,5912],{"id":5911},"q43-如何排查-pod-启动失败","Q43: 如何排查 Pod 启动失败？",[892,5914,5915],{},[910,5916,5917],{},"排查步骤：",[1140,5919,5921],{"className":1142,"code":5920,"language":1144,"meta":11,"style":11},"# 1. 查看 Pod 状态\nkubectl get pod nginx -o wide\n\n# 2. 查看详细事件\nkubectl describe pod nginx\n\n# 3. 查看容器日志\nkubectl logs nginx\nkubectl logs nginx --previous  # 上一次容器日志\n\n# 4. 进入容器调试\nkubectl exec -it nginx -- \u002Fbin\u002Fsh\n",[1146,5922,5923,5928,5942,5946,5951,5961,5965,5970,5978,5992,5996,6001],{"__ignoreMap":11},[1149,5924,5925],{"class":1151,"line":1152},[1149,5926,5927],{"class":1155},"# 1. 查看 Pod 状态\n",[1149,5929,5930,5932,5934,5936,5938,5940],{"class":1151,"line":1159},[1149,5931,1163],{"class":1162},[1149,5933,1167],{"class":1166},[1149,5935,5680],{"class":1166},[1149,5937,4691],{"class":1166},[1149,5939,5667],{"class":1454},[1149,5941,5670],{"class":1166},[1149,5943,5944],{"class":1151,"line":1173},[1149,5945,1814],{"emptyLinePlaceholder":1813},[1149,5947,5948],{"class":1151,"line":1777},[1149,5949,5950],{"class":1155},"# 2. 查看详细事件\n",[1149,5952,5953,5955,5957,5959],{"class":1151,"line":1788},[1149,5954,1163],{"class":1162},[1149,5956,5677],{"class":1166},[1149,5958,5680],{"class":1166},[1149,5960,5683],{"class":1166},[1149,5962,5963],{"class":1151,"line":1799},[1149,5964,1814],{"emptyLinePlaceholder":1813},[1149,5966,5967],{"class":1151,"line":1810},[1149,5968,5969],{"class":1155},"# 3. 查看容器日志\n",[1149,5971,5972,5974,5976],{"class":1151,"line":1817},[1149,5973,1163],{"class":1162},[1149,5975,1451],{"class":1166},[1149,5977,5683],{"class":1166},[1149,5979,5980,5982,5984,5986,5989],{"class":1151,"line":1825},[1149,5981,1163],{"class":1162},[1149,5983,1451],{"class":1166},[1149,5985,4691],{"class":1166},[1149,5987,5988],{"class":1454}," --previous",[1149,5990,5991],{"class":1155},"  # 上一次容器日志\n",[1149,5993,5994],{"class":1151,"line":1832},[1149,5995,1814],{"emptyLinePlaceholder":1813},[1149,5997,5998],{"class":1151,"line":1842},[1149,5999,6000],{"class":1155},"# 4. 进入容器调试\n",[1149,6002,6003,6005,6007,6009,6011,6013],{"class":1151,"line":1851},[1149,6004,1163],{"class":1162},[1149,6006,5815],{"class":1166},[1149,6008,5818],{"class":1454},[1149,6010,4691],{"class":1166},[1149,6012,5823],{"class":1454},[1149,6014,5826],{"class":1166},[892,6016,6017],{},[910,6018,6019],{},"常见问题：",[953,6021,6022,6032],{},[956,6023,6024],{},[959,6025,6026,6029],{},[962,6027,6028],{"align":964},"状态",[962,6030,6031],{"align":964},"可能原因",[973,6033,6034,6042,6050,6057],{},[959,6035,6036,6039],{},[978,6037,6038],{"align":964},"ImagePullBackOff",[978,6040,6041],{"align":964},"镜像拉取失败",[959,6043,6044,6047],{},[978,6045,6046],{"align":964},"CrashLoopBackOff",[978,6048,6049],{"align":964},"容器启动后立即退出",[959,6051,6052,6054],{},[978,6053,1546],{"align":964},[978,6055,6056],{"align":964},"资源不足或调度失败",[959,6058,6059,6062],{},[978,6060,6061],{"align":964},"Init:Error",[978,6063,6064],{"align":964},"Init 容器失败",[895,6066],{},[903,6068,6070],{"id":6069},"q44-如何查看集群事件","Q44: 如何查看集群事件？",[1140,6072,6074],{"className":1142,"code":6073,"language":1144,"meta":11,"style":11},"# 查看所有事件\nkubectl get events --sort-by=.metadata.creationTimestamp\n\n# 查看特定命名空间事件\nkubectl get events -n kube-system\n\n# 以 watch 模式查看\nkubectl get events -w\n",[1146,6075,6076,6081,6093,6097,6102,6115,6119,6124],{"__ignoreMap":11},[1149,6077,6078],{"class":1151,"line":1152},[1149,6079,6080],{"class":1155},"# 查看所有事件\n",[1149,6082,6083,6085,6087,6090],{"class":1151,"line":1159},[1149,6084,1163],{"class":1162},[1149,6086,1167],{"class":1166},[1149,6088,6089],{"class":1166}," events",[1149,6091,6092],{"class":1454}," --sort-by=.metadata.creationTimestamp\n",[1149,6094,6095],{"class":1151,"line":1173},[1149,6096,1814],{"emptyLinePlaceholder":1813},[1149,6098,6099],{"class":1151,"line":1777},[1149,6100,6101],{"class":1155},"# 查看特定命名空间事件\n",[1149,6103,6104,6106,6108,6110,6112],{"class":1151,"line":1788},[1149,6105,1163],{"class":1162},[1149,6107,1167],{"class":1166},[1149,6109,6089],{"class":1166},[1149,6111,1455],{"class":1454},[1149,6113,6114],{"class":1166}," kube-system\n",[1149,6116,6117],{"class":1151,"line":1799},[1149,6118,1814],{"emptyLinePlaceholder":1813},[1149,6120,6121],{"class":1151,"line":1810},[1149,6122,6123],{"class":1155},"# 以 watch 模式查看\n",[1149,6125,6126,6128,6130,6132],{"class":1151,"line":1817},[1149,6127,1163],{"class":1162},[1149,6129,1167],{"class":1166},[1149,6131,6089],{"class":1166},[1149,6133,6134],{"class":1454}," -w\n",[895,6136],{},[903,6138,6140],{"id":6139},"q45-prometheus-和-grafana-如何监控-k8s","Q45: Prometheus 和 Grafana 如何监控 K8s？",[892,6142,6143],{},[910,6144,6145],{},"监控架构：",[1140,6147,6150],{"className":6148,"code":6149,"language":1365,"meta":1366},[1363],"flowchart LR\n    NE[\"Node Exporter\"] --> P[\"Prometheus\"]\n    KSM[\"kube-state-metrics\"] --> P\n    CA[\"cAdvisor\"] --> P\n    P --> G[\"Grafana\"]\n",[1146,6151,6149],{"__ignoreMap":11},[892,6153,6154],{},[910,6155,6156],{},"核心组件：",[920,6158,6159,6165,6171,6177,6183],{},[923,6160,6161,6164],{},[910,6162,6163],{},"Prometheus","：指标采集和存储",[923,6166,6167,6170],{},[910,6168,6169],{},"Grafana","：可视化展示",[923,6172,6173,6176],{},[910,6174,6175],{},"kube-state-metrics","：集群状态指标",[923,6178,6179,6182],{},[910,6180,6181],{},"Node Exporter","：节点指标",[923,6184,6185,6188],{},[910,6186,6187],{},"cAdvisor","：容器资源指标",[895,6190],{},[903,6192,6194],{"id":6193},"q46-如何收集-pod-日志","Q46: 如何收集 Pod 日志？",[892,6196,6197],{},[910,6198,6199],{},"日志收集方案：",[953,6201,6202,6214],{},[956,6203,6204],{},[959,6205,6206,6209,6211],{},[962,6207,6208],{"align":964},"方案",[962,6210,965],{"align":964},[962,6212,6213],{"align":964},"特点",[973,6215,6216,6227,6238],{},[959,6217,6218,6221,6224],{},[978,6219,6220],{"align":964},"EFK",[978,6222,6223],{"align":964},"Elasticsearch + Fluentd + Kibana",[978,6225,6226],{"align":964},"功能强大",[959,6228,6229,6232,6235],{},[978,6230,6231],{"align":964},"ELK",[978,6233,6234],{"align":964},"Elasticsearch + Logstash + Kibana",[978,6236,6237],{"align":964},"经典方案",[959,6239,6240,6243,6246],{},[978,6241,6242],{"align":964},"Loki",[978,6244,6245],{"align":964},"Loki + Promtail + Grafana",[978,6247,6248],{"align":964},"轻量级",[892,6250,6251],{},[910,6252,6253],{},"Fluentd DaemonSet 方式：",[1140,6255,6257],{"className":1602,"code":6256,"language":1604,"meta":11,"style":11},"apiVersion: apps\u002Fv1\nkind: DaemonSet\nmetadata:\n  name: fluentd\nspec:\n  template:\n    spec:\n      containers:\n      - name: fluentd\n        image: fluentd\n        volumeMounts:\n        - name: varlog\n          mountPath: \u002Fvar\u002Flog\n      volumes:\n      - name: varlog\n        hostPath:\n          path: \u002Fvar\u002Flog\n",[1146,6258,6259,6267,6275,6281,6289,6295,6301,6307,6313,6323,6331,6338,6349,6359,6366,6376,6383],{"__ignoreMap":11},[1149,6260,6261,6263,6265],{"class":1151,"line":1152},[1149,6262,2171],{"class":1611},[1149,6264,1624],{"class":1615},[1149,6266,2176],{"class":1166},[1149,6268,6269,6271,6273],{"class":1151,"line":1159},[1149,6270,2181],{"class":1611},[1149,6272,1624],{"class":1615},[1149,6274,2186],{"class":1166},[1149,6276,6277,6279],{"class":1151,"line":1173},[1149,6278,2191],{"class":1611},[1149,6280,1616],{"class":1615},[1149,6282,6283,6285,6287],{"class":1151,"line":1777},[1149,6284,2198],{"class":1611},[1149,6286,1624],{"class":1615},[1149,6288,2203],{"class":1166},[1149,6290,6291,6293],{"class":1151,"line":1788},[1149,6292,1612],{"class":1611},[1149,6294,1616],{"class":1615},[1149,6296,6297,6299],{"class":1151,"line":1799},[1149,6298,2237],{"class":1611},[1149,6300,1616],{"class":1615},[1149,6302,6303,6305],{"class":1151,"line":1810},[1149,6304,2244],{"class":1611},[1149,6306,1616],{"class":1615},[1149,6308,6309,6311],{"class":1151,"line":1817},[1149,6310,2251],{"class":1611},[1149,6312,1616],{"class":1615},[1149,6314,6315,6317,6319,6321],{"class":1151,"line":1825},[1149,6316,2258],{"class":1615},[1149,6318,2261],{"class":1611},[1149,6320,1624],{"class":1615},[1149,6322,2203],{"class":1166},[1149,6324,6325,6327,6329],{"class":1151,"line":1832},[1149,6326,2270],{"class":1611},[1149,6328,1624],{"class":1615},[1149,6330,2203],{"class":1166},[1149,6332,6333,6336],{"class":1151,"line":1842},[1149,6334,6335],{"class":1611},"        volumeMounts",[1149,6337,1616],{"class":1615},[1149,6339,6340,6342,6344,6346],{"class":1151,"line":1851},[1149,6341,4025],{"class":1615},[1149,6343,2261],{"class":1611},[1149,6345,1624],{"class":1615},[1149,6347,6348],{"class":1166},"varlog\n",[1149,6350,6351,6354,6356],{"class":1151,"line":1861},[1149,6352,6353],{"class":1611},"          mountPath",[1149,6355,1624],{"class":1615},[1149,6357,6358],{"class":1166},"\u002Fvar\u002Flog\n",[1149,6360,6361,6364],{"class":1151,"line":2433},[1149,6362,6363],{"class":1611},"      volumes",[1149,6365,1616],{"class":1615},[1149,6367,6368,6370,6372,6374],{"class":1151,"line":2444},[1149,6369,2258],{"class":1615},[1149,6371,2261],{"class":1611},[1149,6373,1624],{"class":1615},[1149,6375,6348],{"class":1166},[1149,6377,6378,6381],{"class":1151,"line":2937},[1149,6379,6380],{"class":1611},"        hostPath",[1149,6382,1616],{"class":1615},[1149,6384,6385,6388,6390],{"class":1151,"line":3299},[1149,6386,6387],{"class":1611},"          path",[1149,6389,1624],{"class":1615},[1149,6391,6358],{"class":1166},[895,6393],{},[903,6395,6397],{"id":6396},"q47-init-container-的作用","Q47: Init Container 的作用？",[892,6399,6400],{},[910,6401,6402],{},"Init Container 在主容器启动前运行，用于初始化工作。",[892,6404,6405],{},[910,6406,2147],{},[920,6408,6409,6412,6415,6418],{},[923,6410,6411],{},"等待依赖服务就绪",[923,6413,6414],{},"初始化配置文件",[923,6416,6417],{},"下载依赖文件",[923,6419,6420],{},"执行数据库迁移",[1140,6422,6424],{"className":1602,"code":6423,"language":1604,"meta":11,"style":11},"spec:\n  initContainers:\n  - name: wait-mysql\n    image: busybox\n    command: ['sh', '-c', 'until nc -z mysql 3306; do sleep 2; done']\n  containers:\n  - name: app\n    image: myapp\n",[1146,6425,6426,6432,6439,6450,6460,6482,6488,6498],{"__ignoreMap":11},[1149,6427,6428,6430],{"class":1151,"line":1152},[1149,6429,1612],{"class":1611},[1149,6431,1616],{"class":1615},[1149,6433,6434,6437],{"class":1151,"line":1159},[1149,6435,6436],{"class":1611},"  initContainers",[1149,6438,1616],{"class":1615},[1149,6440,6441,6443,6445,6447],{"class":1151,"line":1173},[1149,6442,2608],{"class":1615},[1149,6444,2261],{"class":1611},[1149,6446,1624],{"class":1615},[1149,6448,6449],{"class":1166},"wait-mysql\n",[1149,6451,6452,6455,6457],{"class":1151,"line":1777},[1149,6453,6454],{"class":1611},"    image",[1149,6456,1624],{"class":1615},[1149,6458,6459],{"class":1166},"busybox\n",[1149,6461,6462,6465,6467,6470,6472,6475,6477,6480],{"class":1151,"line":1788},[1149,6463,6464],{"class":1611},"    command",[1149,6466,3818],{"class":1615},[1149,6468,6469],{"class":1166},"'sh'",[1149,6471,5265],{"class":1615},[1149,6473,6474],{"class":1166},"'-c'",[1149,6476,5265],{"class":1615},[1149,6478,6479],{"class":1166},"'until nc -z mysql 3306; do sleep 2; done'",[1149,6481,3824],{"class":1615},[1149,6483,6484,6486],{"class":1151,"line":1799},[1149,6485,5572],{"class":1611},[1149,6487,1616],{"class":1615},[1149,6489,6490,6492,6494,6496],{"class":1151,"line":1810},[1149,6491,2608],{"class":1615},[1149,6493,2261],{"class":1611},[1149,6495,1624],{"class":1615},[1149,6497,4221],{"class":1166},[1149,6499,6500,6502,6504],{"class":1151,"line":1817},[1149,6501,6454],{"class":1611},[1149,6503,1624],{"class":1615},[1149,6505,6506],{"class":1166},"myapp\n",[895,6508],{},[903,6510,6512],{"id":6511},"q48-sidecar-模式是什么","Q48: Sidecar 模式是什么？",[892,6514,6515],{},[910,6516,6517],{},"Sidecar 是与主容器共同运行的辅助容器。",[892,6519,6520],{},[910,6521,6522],{},"常见用途：",[920,6524,6525,6531,6537],{},[923,6526,6527,6530],{},[910,6528,6529],{},"日志收集","：收集主容器日志",[923,6532,6533,6536],{},[910,6534,6535],{},"代理","：Service Mesh 数据面代理（Envoy）",[923,6538,6539,6542],{},[910,6540,6541],{},"配置同步","：从配置中心同步配置",[1140,6544,6546],{"className":1602,"code":6545,"language":1604,"meta":11,"style":11},"spec:\n  containers:\n  - name: app\n    image: myapp\n  - name: log-collector\n    image: fluentd\n    volumeMounts:\n    - name: logs\n      mountPath: \u002Fvar\u002Flog\u002Fapp\n",[1146,6547,6548,6554,6560,6570,6578,6589,6597,6604,6615],{"__ignoreMap":11},[1149,6549,6550,6552],{"class":1151,"line":1152},[1149,6551,1612],{"class":1611},[1149,6553,1616],{"class":1615},[1149,6555,6556,6558],{"class":1151,"line":1159},[1149,6557,5572],{"class":1611},[1149,6559,1616],{"class":1615},[1149,6561,6562,6564,6566,6568],{"class":1151,"line":1173},[1149,6563,2608],{"class":1615},[1149,6565,2261],{"class":1611},[1149,6567,1624],{"class":1615},[1149,6569,4221],{"class":1166},[1149,6571,6572,6574,6576],{"class":1151,"line":1777},[1149,6573,6454],{"class":1611},[1149,6575,1624],{"class":1615},[1149,6577,6506],{"class":1166},[1149,6579,6580,6582,6584,6586],{"class":1151,"line":1788},[1149,6581,2608],{"class":1615},[1149,6583,2261],{"class":1611},[1149,6585,1624],{"class":1615},[1149,6587,6588],{"class":1166},"log-collector\n",[1149,6590,6591,6593,6595],{"class":1151,"line":1799},[1149,6592,6454],{"class":1611},[1149,6594,1624],{"class":1615},[1149,6596,2203],{"class":1166},[1149,6598,6599,6602],{"class":1151,"line":1810},[1149,6600,6601],{"class":1611},"    volumeMounts",[1149,6603,1616],{"class":1615},[1149,6605,6606,6608,6610,6612],{"class":1151,"line":1817},[1149,6607,4198],{"class":1615},[1149,6609,2261],{"class":1611},[1149,6611,1624],{"class":1615},[1149,6613,6614],{"class":1166},"logs\n",[1149,6616,6617,6620,6622],{"class":1151,"line":1825},[1149,6618,6619],{"class":1611},"      mountPath",[1149,6621,1624],{"class":1615},[1149,6623,6624],{"class":1166},"\u002Fvar\u002Flog\u002Fapp\n",[895,6626],{},[903,6628,6630],{"id":6629},"q49-什么是-helm","Q49: 什么是 Helm？",[892,6632,6633],{},[910,6634,6635],{},"Helm 是 Kubernetes 的包管理工具。",[892,6637,6638],{},[910,6639,6640],{},"核心概念：",[920,6642,6643,6649,6655],{},[923,6644,6645,6648],{},[910,6646,6647],{},"Chart","：应用包，包含 K8s 资源模板",[923,6650,6651,6654],{},[910,6652,6653],{},"Release","：Chart 的一次安装实例",[923,6656,6657,6660],{},[910,6658,6659],{},"Repository","：Chart 仓库",[1140,6662,6664],{"className":1142,"code":6663,"language":1144,"meta":11,"style":11},"# 添加仓库\nhelm repo add bitnami https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\n\n# 搜索 Chart\nhelm search repo nginx\n\n# 安装 Chart\nhelm install my-nginx bitnami\u002Fnginx\n\n# 查看 Release\nhelm list\n\n# 升级\nhelm upgrade my-nginx bitnami\u002Fnginx --set replicaCount=3\n\n# 卸载\nhelm uninstall my-nginx\n",[1146,6665,6666,6671,6688,6692,6697,6708,6712,6717,6730,6734,6739,6746,6750,6755,6776,6780,6785],{"__ignoreMap":11},[1149,6667,6668],{"class":1151,"line":1152},[1149,6669,6670],{"class":1155},"# 添加仓库\n",[1149,6672,6673,6676,6679,6682,6685],{"class":1151,"line":1159},[1149,6674,6675],{"class":1162},"helm",[1149,6677,6678],{"class":1166}," repo",[1149,6680,6681],{"class":1166}," add",[1149,6683,6684],{"class":1166}," bitnami",[1149,6686,6687],{"class":1166}," https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\n",[1149,6689,6690],{"class":1151,"line":1173},[1149,6691,1814],{"emptyLinePlaceholder":1813},[1149,6693,6694],{"class":1151,"line":1777},[1149,6695,6696],{"class":1155},"# 搜索 Chart\n",[1149,6698,6699,6701,6704,6706],{"class":1151,"line":1788},[1149,6700,6675],{"class":1162},[1149,6702,6703],{"class":1166}," search",[1149,6705,6678],{"class":1166},[1149,6707,5683],{"class":1166},[1149,6709,6710],{"class":1151,"line":1799},[1149,6711,1814],{"emptyLinePlaceholder":1813},[1149,6713,6714],{"class":1151,"line":1810},[1149,6715,6716],{"class":1155},"# 安装 Chart\n",[1149,6718,6719,6721,6724,6727],{"class":1151,"line":1817},[1149,6720,6675],{"class":1162},[1149,6722,6723],{"class":1166}," install",[1149,6725,6726],{"class":1166}," my-nginx",[1149,6728,6729],{"class":1166}," bitnami\u002Fnginx\n",[1149,6731,6732],{"class":1151,"line":1825},[1149,6733,1814],{"emptyLinePlaceholder":1813},[1149,6735,6736],{"class":1151,"line":1832},[1149,6737,6738],{"class":1155},"# 查看 Release\n",[1149,6740,6741,6743],{"class":1151,"line":1842},[1149,6742,6675],{"class":1162},[1149,6744,6745],{"class":1166}," list\n",[1149,6747,6748],{"class":1151,"line":1851},[1149,6749,1814],{"emptyLinePlaceholder":1813},[1149,6751,6752],{"class":1151,"line":1861},[1149,6753,6754],{"class":1155},"# 升级\n",[1149,6756,6757,6759,6762,6764,6767,6770,6773],{"class":1151,"line":2433},[1149,6758,6675],{"class":1162},[1149,6760,6761],{"class":1166}," upgrade",[1149,6763,6726],{"class":1166},[1149,6765,6766],{"class":1166}," bitnami\u002Fnginx",[1149,6768,6769],{"class":1454}," --set",[1149,6771,6772],{"class":1166}," replicaCount=",[1149,6774,6775],{"class":1454},"3\n",[1149,6777,6778],{"class":1151,"line":2444},[1149,6779,1814],{"emptyLinePlaceholder":1813},[1149,6781,6782],{"class":1151,"line":2937},[1149,6783,6784],{"class":1155},"# 卸载\n",[1149,6786,6787,6789,6792],{"class":1151,"line":3299},[1149,6788,6675],{"class":1162},[1149,6790,6791],{"class":1166}," uninstall",[1149,6793,6794],{"class":1166}," my-nginx\n",[895,6796],{},[903,6798,6800],{"id":6799},"q50-helm-chart-的结构","Q50: Helm Chart 的结构？",[1140,6802,6805],{"className":6803,"code":6804,"language":1365},[1363],"mychart\u002F\n├── Chart.yaml          # Chart 元数据\n├── values.yaml         # 默认配置值\n├── charts\u002F             # 依赖的其他 Chart\n├── templates\u002F          # K8s 资源模板\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   ├── _helpers.tpl    # 模板助手函数\n│   └── NOTES.txt       # 安装后提示\n└── .helmignore         # 忽略文件\n",[1146,6806,6804],{"__ignoreMap":11},[895,6808],{},[898,6810,6812],{"id":6811},"七高级主题","七、高级主题",[903,6814,6816],{"id":6815},"q51-什么是-operator","Q51: 什么是 Operator？",[892,6818,6819],{},[910,6820,6821],{},"Operator 是一种封装运维知识的 K8s 扩展。",[892,6823,6824],{},[910,6825,6826],{},"核心思想：",[920,6828,6829,6832,6835],{},[923,6830,6831],{},"将运维操作编码为 Controller",[923,6833,6834],{},"使用 CRD（Custom Resource Definition）扩展 API",[923,6836,6837],{},"自动化复杂应用的生命周期管理",[892,6839,6840],{},[910,6841,2147],{},[920,6843,6844,6847,6850],{},[923,6845,6846],{},"数据库（MySQL Operator、Redis Operator）",[923,6848,6849],{},"消息队列（Kafka Operator）",[923,6851,6852],{},"监控系统（Prometheus Operator）",[895,6854],{},[903,6856,6858],{"id":6857},"q52-crd-是什么","Q52: CRD 是什么？",[892,6860,6861],{},[910,6862,6863],{},"CRD（Custom Resource Definition）用于扩展 Kubernetes API。",[1140,6865,6867],{"className":1602,"code":6866,"language":1604,"meta":11,"style":11},"apiVersion: apiextensions.k8s.io\u002Fv1\nkind: CustomResourceDefinition\nmetadata:\n  name: databases.example.com\nspec:\n  group: example.com\n  names:\n    kind: Database\n    plural: databases\n    singular: database\n  scope: Namespaced\n  versions:\n  - name: v1\n    served: true\n    storage: true\n    schema:\n      openAPIV3Schema:\n        type: object\n        properties:\n          spec:\n            type: object\n            properties:\n              engine:\n                type: string\n              version:\n                type: string\n",[1146,6868,6869,6878,6887,6893,6902,6908,6918,6925,6934,6944,6954,6964,6971,6981,6991,7000,7007,7014,7023,7030,7037,7046,7053,7060,7070,7077],{"__ignoreMap":11},[1149,6870,6871,6873,6875],{"class":1151,"line":1152},[1149,6872,2171],{"class":1611},[1149,6874,1624],{"class":1615},[1149,6876,6877],{"class":1166},"apiextensions.k8s.io\u002Fv1\n",[1149,6879,6880,6882,6884],{"class":1151,"line":1159},[1149,6881,2181],{"class":1611},[1149,6883,1624],{"class":1615},[1149,6885,6886],{"class":1166},"CustomResourceDefinition\n",[1149,6888,6889,6891],{"class":1151,"line":1173},[1149,6890,2191],{"class":1611},[1149,6892,1616],{"class":1615},[1149,6894,6895,6897,6899],{"class":1151,"line":1777},[1149,6896,2198],{"class":1611},[1149,6898,1624],{"class":1615},[1149,6900,6901],{"class":1166},"databases.example.com\n",[1149,6903,6904,6906],{"class":1151,"line":1788},[1149,6905,1612],{"class":1611},[1149,6907,1616],{"class":1615},[1149,6909,6910,6913,6915],{"class":1151,"line":1799},[1149,6911,6912],{"class":1611},"  group",[1149,6914,1624],{"class":1615},[1149,6916,6917],{"class":1166},"example.com\n",[1149,6919,6920,6923],{"class":1151,"line":1810},[1149,6921,6922],{"class":1611},"  names",[1149,6924,1616],{"class":1615},[1149,6926,6927,6929,6931],{"class":1151,"line":1817},[1149,6928,4574],{"class":1611},[1149,6930,1624],{"class":1615},[1149,6932,6933],{"class":1166},"Database\n",[1149,6935,6936,6939,6941],{"class":1151,"line":1825},[1149,6937,6938],{"class":1611},"    plural",[1149,6940,1624],{"class":1615},[1149,6942,6943],{"class":1166},"databases\n",[1149,6945,6946,6949,6951],{"class":1151,"line":1832},[1149,6947,6948],{"class":1611},"    singular",[1149,6950,1624],{"class":1615},[1149,6952,6953],{"class":1166},"database\n",[1149,6955,6956,6959,6961],{"class":1151,"line":1842},[1149,6957,6958],{"class":1611},"  scope",[1149,6960,1624],{"class":1615},[1149,6962,6963],{"class":1166},"Namespaced\n",[1149,6965,6966,6969],{"class":1151,"line":1851},[1149,6967,6968],{"class":1611},"  versions",[1149,6970,1616],{"class":1615},[1149,6972,6973,6975,6977,6979],{"class":1151,"line":1861},[1149,6974,2608],{"class":1615},[1149,6976,2261],{"class":1611},[1149,6978,1624],{"class":1615},[1149,6980,2540],{"class":1166},[1149,6982,6983,6986,6988],{"class":1151,"line":2433},[1149,6984,6985],{"class":1611},"    served",[1149,6987,1624],{"class":1615},[1149,6989,6990],{"class":1454},"true\n",[1149,6992,6993,6996,6998],{"class":1151,"line":2444},[1149,6994,6995],{"class":1611},"    storage",[1149,6997,1624],{"class":1615},[1149,6999,6990],{"class":1454},[1149,7001,7002,7005],{"class":1151,"line":2937},[1149,7003,7004],{"class":1611},"    schema",[1149,7006,1616],{"class":1615},[1149,7008,7009,7012],{"class":1151,"line":3299},[1149,7010,7011],{"class":1611},"      openAPIV3Schema",[1149,7013,1616],{"class":1615},[1149,7015,7016,7018,7020],{"class":1151,"line":3310},[1149,7017,4653],{"class":1611},[1149,7019,1624],{"class":1615},[1149,7021,7022],{"class":1166},"object\n",[1149,7024,7025,7028],{"class":1151,"line":3317},[1149,7026,7027],{"class":1611},"        properties",[1149,7029,1616],{"class":1615},[1149,7031,7032,7035],{"class":1151,"line":3486},[1149,7033,7034],{"class":1611},"          spec",[1149,7036,1616],{"class":1615},[1149,7038,7039,7042,7044],{"class":1151,"line":3497},[1149,7040,7041],{"class":1611},"            type",[1149,7043,1624],{"class":1615},[1149,7045,7022],{"class":1166},[1149,7047,7048,7051],{"class":1151,"line":5038},[1149,7049,7050],{"class":1611},"            properties",[1149,7052,1616],{"class":1615},[1149,7054,7055,7058],{"class":1151,"line":5046},[1149,7056,7057],{"class":1611},"              engine",[1149,7059,1616],{"class":1615},[1149,7061,7062,7065,7067],{"class":1151,"line":5056},[1149,7063,7064],{"class":1611},"                type",[1149,7066,1624],{"class":1615},[1149,7068,7069],{"class":1166},"string\n",[1149,7071,7072,7075],{"class":1151,"line":5066},[1149,7073,7074],{"class":1611},"              version",[1149,7076,1616],{"class":1615},[1149,7078,7079,7081,7083],{"class":1151,"line":5074},[1149,7080,7064],{"class":1611},[1149,7082,1624],{"class":1615},[1149,7084,7069],{"class":1166},[895,7086],{},[903,7088,7090],{"id":7089},"q53-什么是-service-mesh","Q53: 什么是 Service Mesh？",[892,7092,7093],{},[910,7094,7095],{},"Service Mesh 是微服务间通信的基础设施层。",[892,7097,7098],{},[910,7099,7100],{},"功能：",[920,7102,7103,7106,7109],{},[923,7104,7105],{},"流量管理（路由、重试、熔断）",[923,7107,7108],{},"安全（mTLS、认证授权）",[923,7110,7111],{},"可观测性（指标、日志、链路追踪）",[892,7113,7114],{},[910,7115,7116],{},"常见实现：",[920,7118,7119,7125,7131],{},[923,7120,7121,7124],{},[910,7122,7123],{},"Istio","：功能最全，学习曲线陡峭",[923,7126,7127,7130],{},[910,7128,7129],{},"Linkerd","：轻量级，易于使用",[923,7132,7133,7135],{},[910,7134,4804],{},"：基于 eBPF，高性能",[895,7137],{},[903,7139,7141],{"id":7140},"q54-什么是-gitops","Q54: 什么是 GitOps？",[892,7143,7144],{},[910,7145,7146],{},"GitOps 是以 Git 为唯一真实来源的运维方式。",[892,7148,7149],{},[910,7150,7151],{},"核心原则：",[1122,7153,7154,7157,7160,7163],{},[923,7155,7156],{},"基础设施即代码（IaC）",[923,7158,7159],{},"Git 是唯一真实来源",[923,7161,7162],{},"声明式配置",[923,7164,7165],{},"自动同步和收敛",[892,7167,7168],{},[910,7169,7170],{},"常用工具：",[920,7172,7173,7178],{},[923,7174,7175],{},[910,7176,7177],{},"Argo CD",[923,7179,7180],{},[910,7181,7182],{},"Flux",[895,7184],{},[903,7186,7188],{"id":7187},"q55-如何实现-k8s-的多集群管理","Q55: 如何实现 K8s 的多集群管理？",[892,7190,7191],{},[910,7192,7193],{},"多集群管理方案：",[953,7195,7196,7204],{},[956,7197,7198],{},[959,7199,7200,7202],{},[962,7201,6208],{"align":964},[962,7203,971],{"align":964},[973,7205,7206,7216,7226,7236],{},[959,7207,7208,7213],{},[978,7209,7210],{"align":964},[910,7211,7212],{},"Rancher",[978,7214,7215],{"align":964},"统一管理多个 K8s 集群",[959,7217,7218,7223],{},[978,7219,7220],{"align":964},[910,7221,7222],{},"KubeFed",[978,7224,7225],{"align":964},"Kubernetes 联邦",[959,7227,7228,7233],{},[978,7229,7230],{"align":964},[910,7231,7232],{},"Loft",[978,7234,7235],{"align":964},"虚拟集群和多租户",[959,7237,7238,7242],{},[978,7239,7240],{"align":964},[910,7241,7177],{},[978,7243,7244],{"align":964},"GitOps 方式管理多集群",[895,7246],{},[898,7248,7250],{"id":7249},"八场景问题","八、场景问题",[903,7252,7254],{"id":7253},"q56-pod-一直处于-pending-状态怎么办","Q56: Pod 一直处于 Pending 状态怎么办？",[892,7256,7257],{},[910,7258,5917],{},[1140,7260,7262],{"className":1142,"code":7261,"language":1144,"meta":11,"style":11},"kubectl describe pod \u003Cpod-name>\n",[1146,7263,7264],{"__ignoreMap":11},[1149,7265,7266,7268,7270,7272,7275,7278,7281],{"class":1151,"line":1152},[1149,7267,1163],{"class":1162},[1149,7269,5677],{"class":1166},[1149,7271,5680],{"class":1166},[1149,7273,7274],{"class":1467}," \u003C",[1149,7276,7277],{"class":1166},"pod-nam",[1149,7279,7280],{"class":1615},"e",[1149,7282,7283],{"class":1467},">\n",[892,7285,7286],{},[910,7287,7288],{},"常见原因：",[953,7290,7291,7301],{},[956,7292,7293],{},[959,7294,7295,7298],{},[962,7296,7297],{"align":964},"原因",[962,7299,7300],{"align":964},"解决方法",[973,7302,7303,7311,7319,7327],{},[959,7304,7305,7308],{},[978,7306,7307],{"align":964},"资源不足",[978,7309,7310],{"align":964},"增加节点或调整资源请求",[959,7312,7313,7316],{},[978,7314,7315],{"align":964},"nodeSelector 不匹配",[978,7317,7318],{"align":964},"检查标签或调整选择器",[959,7320,7321,7324],{},[978,7322,7323],{"align":964},"污点导致",[978,7325,7326],{"align":964},"添加容忍或移除污点",[959,7328,7329,7332],{},[978,7330,7331],{"align":964},"PVC 未绑定",[978,7333,7334],{"align":964},"检查 PV 和 StorageClass",[895,7336],{},[903,7338,7340],{"id":7339},"q57-pod-频繁重启crashloopbackoff怎么办","Q57: Pod 频繁重启（CrashLoopBackOff）怎么办？",[892,7342,7343],{},[910,7344,5917],{},[1140,7346,7348],{"className":1142,"code":7347,"language":1144,"meta":11,"style":11},"# 查看日志\nkubectl logs \u003Cpod-name> --previous\n\n# 查看退出码\nkubectl describe pod \u003Cpod-name>\n",[1146,7349,7350,7355,7372,7376,7381],{"__ignoreMap":11},[1149,7351,7352],{"class":1151,"line":1152},[1149,7353,7354],{"class":1155},"# 查看日志\n",[1149,7356,7357,7359,7361,7363,7365,7367,7369],{"class":1151,"line":1159},[1149,7358,1163],{"class":1162},[1149,7360,1451],{"class":1166},[1149,7362,7274],{"class":1467},[1149,7364,7277],{"class":1166},[1149,7366,7280],{"class":1615},[1149,7368,2710],{"class":1467},[1149,7370,7371],{"class":1454}," --previous\n",[1149,7373,7374],{"class":1151,"line":1173},[1149,7375,1814],{"emptyLinePlaceholder":1813},[1149,7377,7378],{"class":1151,"line":1777},[1149,7379,7380],{"class":1155},"# 查看退出码\n",[1149,7382,7383,7385,7387,7389,7391,7393,7395],{"class":1151,"line":1788},[1149,7384,1163],{"class":1162},[1149,7386,5677],{"class":1166},[1149,7388,5680],{"class":1166},[1149,7390,7274],{"class":1467},[1149,7392,7277],{"class":1166},[1149,7394,7280],{"class":1615},[1149,7396,7283],{"class":1467},[892,7398,7399],{},[910,7400,7288],{},[920,7402,7403,7406,7409,7412],{},[923,7404,7405],{},"应用启动失败",[923,7407,7408],{},"配置错误",[923,7410,7411],{},"资源限制触发 OOMKilled",[923,7413,7414],{},"健康检查配置不当",[895,7416],{},[903,7418,7420],{"id":7419},"q58-如何优化-pod-启动速度","Q58: 如何优化 Pod 启动速度？",[1122,7422,7423,7429,7435,7440,7445,7450],{},[923,7424,7425,7428],{},[910,7426,7427],{},"使用轻量级基础镜像","（alpine）",[923,7430,7431,7434],{},[910,7432,7433],{},"预拉取镜像","（使用 DaemonSet 预热）",[923,7436,7437],{},[910,7438,7439],{},"优化健康检查参数",[923,7441,7442],{},[910,7443,7444],{},"减少 Init Container 数量",[923,7446,7447],{},[910,7448,7449],{},"开启镜像缓存",[923,7451,7452],{},[910,7453,7454],{},"使用 StartupProbe",[895,7456],{},[903,7458,7460],{"id":7459},"q59-如何实现零停机部署","Q59: 如何实现零停机部署？",[1122,7462,7463,7514,7519,7524],{},[923,7464,7465,7468],{},[910,7466,7467],{},"滚动更新策略",[1140,7469,7471],{"className":1602,"code":7470,"language":1604,"meta":11,"style":11},"strategy:\n  type: RollingUpdate\n  rollingUpdate:\n    maxSurge: 1\n    maxUnavailable: 0\n",[1146,7472,7473,7480,7488,7495,7504],{"__ignoreMap":11},[1149,7474,7475,7478],{"class":1151,"line":1152},[1149,7476,7477],{"class":1611},"strategy",[1149,7479,1616],{"class":1615},[1149,7481,7482,7484,7486],{"class":1151,"line":1159},[1149,7483,2575],{"class":1611},[1149,7485,1624],{"class":1615},[1149,7487,1937],{"class":1166},[1149,7489,7490,7493],{"class":1151,"line":1173},[1149,7491,7492],{"class":1611},"  rollingUpdate",[1149,7494,1616],{"class":1615},[1149,7496,7497,7500,7502],{"class":1151,"line":1777},[1149,7498,7499],{"class":1611},"    maxSurge",[1149,7501,1624],{"class":1615},[1149,7503,4077],{"class":1454},[1149,7505,7506,7509,7511],{"class":1151,"line":1788},[1149,7507,7508],{"class":1611},"    maxUnavailable",[1149,7510,1624],{"class":1615},[1149,7512,7513],{"class":1454},"0\n",[923,7515,7516],{},[910,7517,7518],{},"配置 Readiness 探针",[923,7520,7521],{},[910,7522,7523],{},"使用 PodDisruptionBudget",[923,7525,7526],{},[910,7527,7528],{},"配置 preStop 钩子",[895,7530],{},[903,7532,7534],{"id":7533},"q60-如何限制容器资源使用","Q60: 如何限制容器资源使用？",[1140,7536,7538],{"className":1602,"code":7537,"language":1604,"meta":11,"style":11},"resources:\n  requests:       # 调度时保证的资源\n    memory: \"256Mi\"\n    cpu: \"250m\"\n  limits:         # 运行时的上限\n    memory: \"512Mi\"\n    cpu: \"500m\"\n",[1146,7539,7540,7547,7558,7568,7578,7589,7598],{"__ignoreMap":11},[1149,7541,7542,7545],{"class":1151,"line":1152},[1149,7543,7544],{"class":1611},"resources",[1149,7546,1616],{"class":1615},[1149,7548,7549,7552,7555],{"class":1151,"line":1159},[1149,7550,7551],{"class":1611},"  requests",[1149,7553,7554],{"class":1615},":       ",[1149,7556,7557],{"class":1155},"# 调度时保证的资源\n",[1149,7559,7560,7563,7565],{"class":1151,"line":1173},[1149,7561,7562],{"class":1611},"    memory",[1149,7564,1624],{"class":1615},[1149,7566,7567],{"class":1166},"\"256Mi\"\n",[1149,7569,7570,7573,7575],{"class":1151,"line":1777},[1149,7571,7572],{"class":1611},"    cpu",[1149,7574,1624],{"class":1615},[1149,7576,7577],{"class":1166},"\"250m\"\n",[1149,7579,7580,7583,7586],{"class":1151,"line":1788},[1149,7581,7582],{"class":1611},"  limits",[1149,7584,7585],{"class":1615},":         ",[1149,7587,7588],{"class":1155},"# 运行时的上限\n",[1149,7590,7591,7593,7595],{"class":1151,"line":1799},[1149,7592,7562],{"class":1611},[1149,7594,1624],{"class":1615},[1149,7596,7597],{"class":1166},"\"512Mi\"\n",[1149,7599,7600,7602,7604],{"class":1151,"line":1810},[1149,7601,7572],{"class":1611},[1149,7603,1624],{"class":1615},[1149,7605,7606],{"class":1166},"\"500m\"\n",[892,7608,7609],{},[910,7610,3109],{},[920,7612,7613,7616,7619],{},[923,7614,7615],{},"始终设置 requests 和 limits",[923,7617,7618],{},"使用 LimitRange 设置默认值",[923,7620,7621],{},"使用 ResourceQuota 限制命名空间总资源",[895,7623],{},[903,7625,7627],{"id":7626},"q61-如何实现配置热更新","Q61: 如何实现配置热更新？",[892,7629,7630],{},[910,7631,7632],{},"方法一：ConfigMap 自动更新",[920,7634,7635,7638],{},[923,7636,7637],{},"挂载为 Volume，kubelet 会自动同步",[923,7639,7640],{},"应用需要监听文件变化",[892,7642,7643],{},[910,7644,7645],{},"方法二：使用 Reloader",[1140,7647,7649],{"className":1602,"code":7648,"language":1604,"meta":11,"style":11},"metadata:\n  annotations:\n    reloader.stakater.com\u002Fauto: \"true\"\n",[1146,7650,7651,7657,7664],{"__ignoreMap":11},[1149,7652,7653,7655],{"class":1151,"line":1152},[1149,7654,2191],{"class":1611},[1149,7656,1616],{"class":1615},[1149,7658,7659,7662],{"class":1151,"line":1159},[1149,7660,7661],{"class":1611},"  annotations",[1149,7663,1616],{"class":1615},[1149,7665,7666,7669,7671],{"class":1151,"line":1173},[1149,7667,7668],{"class":1611},"    reloader.stakater.com\u002Fauto",[1149,7670,1624],{"class":1615},[1149,7672,4349],{"class":1166},[892,7674,7675],{},[910,7676,7677],{},"方法三：滚动重启",[1140,7679,7681],{"className":1142,"code":7680,"language":1144,"meta":11,"style":11},"kubectl rollout restart deployment my-app\n",[1146,7682,7683],{"__ignoreMap":11},[1149,7684,7685,7687,7689,7692,7694],{"class":1151,"line":1152},[1149,7686,1163],{"class":1162},[1149,7688,2005],{"class":1166},[1149,7690,7691],{"class":1166}," restart",[1149,7693,4688],{"class":1166},[1149,7695,7696],{"class":1166}," my-app\n",[895,7698],{},[903,7700,7702],{"id":7701},"q62-如何处理节点故障","Q62: 如何处理节点故障？",[892,7704,7705],{},[910,7706,7707],{},"自动处理：",[1122,7709,7710,7713,7716,7719],{},[923,7711,7712],{},"kubelet 停止心跳上报",[923,7714,7715],{},"Node Controller 检测到节点不可达",[923,7717,7718],{},"等待超时后标记 Pod 为 Terminating",[923,7720,7721],{},"Pod 被调度到其他节点",[892,7723,7724],{},[910,7725,7726],{},"手动处理：",[1140,7728,7730],{"className":1142,"code":7729,"language":1144,"meta":11,"style":11},"# 禁止调度新 Pod\nkubectl cordon \u003Cnode>\n\n# 驱逐现有 Pod\nkubectl drain \u003Cnode> --ignore-daemonsets --delete-emptydir-data\n\n# 维护完成后恢复\nkubectl uncordon \u003Cnode>\n",[1146,7731,7732,7737,7752,7756,7761,7781,7785,7790],{"__ignoreMap":11},[1149,7733,7734],{"class":1151,"line":1152},[1149,7735,7736],{"class":1155},"# 禁止调度新 Pod\n",[1149,7738,7739,7741,7743,7745,7748,7750],{"class":1151,"line":1159},[1149,7740,1163],{"class":1162},[1149,7742,5877],{"class":1166},[1149,7744,7274],{"class":1467},[1149,7746,7747],{"class":1166},"nod",[1149,7749,7280],{"class":1615},[1149,7751,7283],{"class":1467},[1149,7753,7754],{"class":1151,"line":1173},[1149,7755,1814],{"emptyLinePlaceholder":1813},[1149,7757,7758],{"class":1151,"line":1777},[1149,7759,7760],{"class":1155},"# 驱逐现有 Pod\n",[1149,7762,7763,7765,7767,7769,7771,7773,7775,7778],{"class":1151,"line":1788},[1149,7764,1163],{"class":1162},[1149,7766,5889],{"class":1166},[1149,7768,7274],{"class":1467},[1149,7770,7747],{"class":1166},[1149,7772,7280],{"class":1615},[1149,7774,2710],{"class":1467},[1149,7776,7777],{"class":1454}," --ignore-daemonsets",[1149,7779,7780],{"class":1454}," --delete-emptydir-data\n",[1149,7782,7783],{"class":1151,"line":1799},[1149,7784,1814],{"emptyLinePlaceholder":1813},[1149,7786,7787],{"class":1151,"line":1810},[1149,7788,7789],{"class":1155},"# 维护完成后恢复\n",[1149,7791,7792,7794,7796,7798,7800,7802],{"class":1151,"line":1817},[1149,7793,1163],{"class":1162},[1149,7795,5901],{"class":1166},[1149,7797,7274],{"class":1467},[1149,7799,7747],{"class":1166},[1149,7801,7280],{"class":1615},[1149,7803,7283],{"class":1467},[895,7805],{},[903,7807,7809],{"id":7808},"q63-如何备份和恢复-k8s-集群","Q63: 如何备份和恢复 K8s 集群？",[892,7811,7812],{},[910,7813,7814],{},"备份内容：",[1122,7816,7817,7820,7823],{},[923,7818,7819],{},"etcd 数据（最重要）",[923,7821,7822],{},"K8s 资源配置（YAML）",[923,7824,7825],{},"PV 数据",[892,7827,7828],{},[910,7829,7830],{},"备份工具：",[920,7832,7833,7839],{},[923,7834,7835,7838],{},[910,7836,7837],{},"Velero","：备份 K8s 资源和 PV",[923,7840,7841,7844],{},[910,7842,7843],{},"etcdctl","：备份 etcd",[1140,7846,7848],{"className":1142,"code":7847,"language":1144,"meta":11,"style":11},"# etcd 备份\nETCDCTL_API=3 etcdctl snapshot save backup.db\n\n# Velero 备份\nvelero backup create my-backup --include-namespaces=production\n",[1146,7849,7850,7855,7877,7881,7886],{"__ignoreMap":11},[1149,7851,7852],{"class":1151,"line":1152},[1149,7853,7854],{"class":1155},"# etcd 备份\n",[1149,7856,7857,7860,7862,7865,7868,7871,7874],{"class":1151,"line":1159},[1149,7858,7859],{"class":1615},"ETCDCTL_API",[1149,7861,2672],{"class":1467},[1149,7863,7864],{"class":1166},"3",[1149,7866,7867],{"class":1162}," etcdctl",[1149,7869,7870],{"class":1166}," snapshot",[1149,7872,7873],{"class":1166}," save",[1149,7875,7876],{"class":1166}," backup.db\n",[1149,7878,7879],{"class":1151,"line":1173},[1149,7880,1814],{"emptyLinePlaceholder":1813},[1149,7882,7883],{"class":1151,"line":1777},[1149,7884,7885],{"class":1155},"# Velero 备份\n",[1149,7887,7888,7891,7894,7896,7899],{"class":1151,"line":1788},[1149,7889,7890],{"class":1162},"velero",[1149,7892,7893],{"class":1166}," backup",[1149,7895,5725],{"class":1166},[1149,7897,7898],{"class":1166}," my-backup",[1149,7900,7901],{"class":1454}," --include-namespaces=production\n",[895,7903],{},[903,7905,7907],{"id":7906},"q64-k8s-和-docker-compose-的区别","Q64: K8s 和 Docker Compose 的区别？",[953,7909,7910,7922],{},[956,7911,7912],{},[959,7913,7914,7916,7919],{},[962,7915,2069],{"align":964},[962,7917,7918],{"align":964},"Docker Compose",[962,7920,7921],{"align":964},"Kubernetes",[973,7923,7924,7935,7946,7957,7968,7979],{},[959,7925,7926,7929,7932],{},[978,7927,7928],{"align":964},"规模",[978,7930,7931],{"align":964},"单机",[978,7933,7934],{"align":964},"集群",[959,7936,7937,7940,7943],{},[978,7938,7939],{"align":964},"高可用",[978,7941,7942],{"align":964},"不支持",[978,7944,7945],{"align":964},"原生支持",[959,7947,7948,7951,7954],{},[978,7949,7950],{"align":964},"服务发现",[978,7952,7953],{"align":964},"简单",[978,7955,7956],{"align":964},"完整",[959,7958,7959,7962,7965],{},[978,7960,7961],{"align":964},"滚动更新",[978,7963,7964],{"align":964},"有限",[978,7966,7967],{"align":964},"完整支持",[959,7969,7970,7973,7976],{},[978,7971,7972],{"align":964},"学习曲线",[978,7974,7975],{"align":964},"低",[978,7977,7978],{"align":964},"高",[959,7980,7981,7983,7986],{},[978,7982,1644],{"align":964},[978,7984,7985],{"align":964},"开发测试",[978,7987,7988],{"align":964},"生产环境",[895,7990],{},[903,7992,7994],{"id":7993},"q65-生产环境-k8s-最佳实践","Q65: 生产环境 K8s 最佳实践？",[953,7996,7997,8007],{},[956,7998,7999],{},[959,8000,8001,8004],{},[962,8002,8003],{"align":964},"方面",[962,8005,8006],{"align":964},"最佳实践",[973,8008,8009,8018,8027,8037,8047,8057,8067,8077],{},[959,8010,8011,8016],{},[978,8012,8013],{"align":964},[910,8014,8015],{},"资源配置",[978,8017,7615],{"align":964},[959,8019,8020,8024],{},[978,8021,8022],{"align":964},[910,8023,1340],{},[978,8025,8026],{"align":964},"配置 Liveness 和 Readiness 探针",[959,8028,8029,8034],{},[978,8030,8031],{"align":964},[910,8032,8033],{},"安全",[978,8035,8036],{"align":964},"启用 RBAC，使用非 root 用户运行",[959,8038,8039,8044],{},[978,8040,8041],{"align":964},[910,8042,8043],{},"网络",[978,8045,8046],{"align":964},"配置 NetworkPolicy",[959,8048,8049,8054],{},[978,8050,8051],{"align":964},[910,8052,8053],{},"日志监控",[978,8055,8056],{"align":964},"部署完整的日志和监控方案",[959,8058,8059,8064],{},[978,8060,8061],{"align":964},[910,8062,8063],{},"备份",[978,8065,8066],{"align":964},"定期备份 etcd 和重要数据",[959,8068,8069,8074],{},[978,8070,8071],{"align":964},[910,8072,8073],{},"更新策略",[978,8075,8076],{"align":964},"使用滚动更新，配置 PDB",[959,8078,8079,8084],{},[978,8080,8081],{"align":964},[910,8082,8083],{},"GitOps",[978,8085,8086],{"align":964},"采用 GitOps 工作流",[895,8088],{},[898,8090,8092],{"id":8091},"九高频考点清单","九、高频考点清单",[903,8094,8095],{"id":8095},"必考",[920,8097,8100,8109,8115,8121,8127,8133,8139],{"className":8098},[8099],"contains-task-list",[923,8101,8104,8108],{"className":8102},[8103],"task-list-item",[8105,8106],"input",{"disabled":1813,"type":8107},"checkbox"," K8s 架构（Control Plane \u002F Worker Node）",[923,8110,8112,8114],{"className":8111},[8103],[8105,8113],{"disabled":1813,"type":8107}," Pod 概念和生命周期",[923,8116,8118,8120],{"className":8117},[8103],[8105,8119],{"disabled":1813,"type":8107}," Deployment 滚动更新原理",[923,8122,8124,8126],{"className":8123},[8103],[8105,8125],{"disabled":1813,"type":8107}," Service 类型和服务发现",[923,8128,8130,8132],{"className":8129},[8103],[8105,8131],{"disabled":1813,"type":8107}," ConfigMap 和 Secret 使用",[923,8134,8136,8138],{"className":8135},[8103],[8105,8137],{"disabled":1813,"type":8107}," PV\u002FPVC 存储",[923,8140,8142,8144],{"className":8141},[8103],[8105,8143],{"disabled":1813,"type":8107}," 调度策略（nodeSelector、Affinity、Taints）",[903,8146,8147],{"id":8147},"常考",[920,8149,8151,8157,8163,8169,8175,8181,8187],{"className":8150},[8099],[923,8152,8154,8156],{"className":8153},[8103],[8105,8155],{"disabled":1813,"type":8107}," StatefulSet vs Deployment",[923,8158,8160,8162],{"className":8159},[8103],[8105,8161],{"disabled":1813,"type":8107}," HPA 自动扩缩容",[923,8164,8166,8168],{"className":8165},[8103],[8105,8167],{"disabled":1813,"type":8107}," Ingress 与 Ingress Controller",[923,8170,8172,8174],{"className":8171},[8103],[8105,8173],{"disabled":1813,"type":8107}," RBAC 权限控制",[923,8176,8178,8180],{"className":8177},[8103],[8105,8179],{"disabled":1813,"type":8107}," NetworkPolicy",[923,8182,8184,8186],{"className":8183},[8103],[8105,8185],{"disabled":1813,"type":8107}," Pod 健康检查（Liveness\u002FReadiness）",[923,8188,8190,8192],{"className":8189},[8103],[8105,8191],{"disabled":1813,"type":8107}," kubectl 常用命令",[903,8194,8195],{"id":8195},"进阶",[920,8197,8199,8205,8211,8217,8223,8229,8235],{"className":8198},[8099],[923,8200,8202,8204],{"className":8201},[8103],[8105,8203],{"disabled":1813,"type":8107}," Operator 和 CRD",[923,8206,8208,8210],{"className":8207},[8103],[8105,8209],{"disabled":1813,"type":8107}," Service Mesh（Istio）",[923,8212,8214,8216],{"className":8213},[8103],[8105,8215],{"disabled":1813,"type":8107}," Helm 包管理",[923,8218,8220,8222],{"className":8219},[8103],[8105,8221],{"disabled":1813,"type":8107}," GitOps（Argo CD）",[923,8224,8226,8228],{"className":8225},[8103],[8105,8227],{"disabled":1813,"type":8107}," 多集群管理",[923,8230,8232,8234],{"className":8231},[8103],[8105,8233],{"disabled":1813,"type":8107}," etcd 原理",[923,8236,8238,8240],{"className":8237},[8103],[8105,8239],{"disabled":1813,"type":8107}," CNI 网络插件",[8242,8243,8244],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sovSZ, html code.shiki .sovSZ{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":11,"searchDepth":1159,"depth":1159,"links":8246},[8247,8259,8273,8281,8290,8298,8309,8316,8328],{"id":900,"depth":1159,"text":901,"children":8248},[8249,8250,8251,8252,8253,8254,8255,8256,8257,8258],{"id":905,"depth":1173,"text":906},{"id":945,"depth":1173,"text":946},{"id":1066,"depth":1173,"text":1067},{"id":1109,"depth":1173,"text":1110},{"id":1181,"depth":1173,"text":1182},{"id":1236,"depth":1173,"text":1237},{"id":1317,"depth":1173,"text":1318},{"id":1373,"depth":1173,"text":1374},{"id":1479,"depth":1173,"text":1480},{"id":1525,"depth":1173,"text":1526},{"id":1594,"depth":1159,"text":1595,"children":8260},[8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272],{"id":1598,"depth":1173,"text":1599},{"id":1689,"depth":1173,"text":1690},{"id":1872,"depth":1173,"text":1873},{"id":1908,"depth":1173,"text":1909},{"id":2059,"depth":1173,"text":2060},{"id":2136,"depth":1173,"text":2137},{"id":2280,"depth":1173,"text":2281},{"id":2457,"depth":1173,"text":2458},{"id":2643,"depth":1173,"text":2644},{"id":2745,"depth":1173,"text":2746},{"id":2949,"depth":1173,"text":2950},{"id":3067,"depth":1173,"text":3068},{"id":3128,"depth":1159,"text":3129,"children":8274},[8275,8276,8277,8278,8279,8280],{"id":3132,"depth":1173,"text":3133},{"id":3333,"depth":1173,"text":3334},{"id":3510,"depth":1173,"text":3511},{"id":3565,"depth":1173,"text":3566},{"id":3630,"depth":1173,"text":3631},{"id":3678,"depth":1173,"text":3679},{"id":3862,"depth":1159,"text":3863,"children":8282},[8283,8284,8285,8286,8287,8288,8289],{"id":3866,"depth":1173,"text":3867},{"id":3924,"depth":1173,"text":3925},{"id":4128,"depth":1173,"text":4129},{"id":4258,"depth":1173,"text":4259},{"id":4389,"depth":1173,"text":4390},{"id":4503,"depth":1173,"text":4504},{"id":4705,"depth":1173,"text":4706},{"id":4758,"depth":1159,"text":4759,"children":8291},[8292,8293,8294,8295,8296,8297],{"id":4762,"depth":1173,"text":4763},{"id":4812,"depth":1173,"text":4813},{"id":4872,"depth":1173,"text":4873},{"id":5106,"depth":1173,"text":5107},{"id":5398,"depth":1173,"text":5399},{"id":5492,"depth":1173,"text":5493},{"id":5640,"depth":1159,"text":5641,"children":8299},[8300,8301,8302,8303,8304,8305,8306,8307,8308],{"id":5644,"depth":1173,"text":5645},{"id":5911,"depth":1173,"text":5912},{"id":6069,"depth":1173,"text":6070},{"id":6139,"depth":1173,"text":6140},{"id":6193,"depth":1173,"text":6194},{"id":6396,"depth":1173,"text":6397},{"id":6511,"depth":1173,"text":6512},{"id":6629,"depth":1173,"text":6630},{"id":6799,"depth":1173,"text":6800},{"id":6811,"depth":1159,"text":6812,"children":8310},[8311,8312,8313,8314,8315],{"id":6815,"depth":1173,"text":6816},{"id":6857,"depth":1173,"text":6858},{"id":7089,"depth":1173,"text":7090},{"id":7140,"depth":1173,"text":7141},{"id":7187,"depth":1173,"text":7188},{"id":7249,"depth":1159,"text":7250,"children":8317},[8318,8319,8320,8321,8322,8323,8324,8325,8326,8327],{"id":7253,"depth":1173,"text":7254},{"id":7339,"depth":1173,"text":7340},{"id":7419,"depth":1173,"text":7420},{"id":7459,"depth":1173,"text":7460},{"id":7533,"depth":1173,"text":7534},{"id":7626,"depth":1173,"text":7627},{"id":7701,"depth":1173,"text":7702},{"id":7808,"depth":1173,"text":7809},{"id":7906,"depth":1173,"text":7907},{"id":7993,"depth":1173,"text":7994},{"id":8091,"depth":1159,"text":8092,"children":8329},[8330,8331,8332],{"id":8095,"depth":1173,"text":8095},{"id":8147,"depth":1173,"text":8147},{"id":8195,"depth":1173,"text":8195},"md",{},{"title":342,"description":343},"interview\u002Fk8s","eCA7tphDdC8L4fjme9MizjRfHu-SoQh7nVYVk77fEqY",1775496433534]