1. 从“容器编排”到“云原生操作系统”:Kubernetes 的定位演进

如果你在运维、开发或者架构领域待过几年,一定经历过从物理机到虚拟机,再到容器化的技术浪潮。Docker 的出现解决了“我的机器上能跑,你的机器上跑不起来”的经典难题,让应用打包和分发变得前所未有的简单。但很快,当我们需要管理成百上千个容器,处理它们之间的网络通信、存储挂载、自动扩缩容和故障自愈时,单纯靠 Docker 就显得力不从心了。这就好比,你发明了标准化的集装箱(Docker 容器),极大地提升了单个货物的运输效率,但要想管理一个繁忙的全球港口,你需要一套完整的调度系统、交通规则和自动化设备——这就是 Kubernetes(常简称为 k8s)登场的原因。

Kubernetes 本质上是一个开源的容器编排平台。但今天,我更愿意把它称为“云原生操作系统”。为什么这么说?传统的操作系统(如 Linux)管理的是单台机器上的进程、内存、文件和网络。而 Kubernetes 管理的是一个由多台机器(物理机或虚拟机)组成的集群,它将这些机器抽象成一个统一的、巨大的“资源池”。在这个池子里,你的应用(被打包成容器)就是需要运行的“任务”,Kubernetes 负责决定把任务放在哪台机器上运行(调度),为任务分配 CPU 和内存(资源管理),让任务之间能够互相发现和通信(网络),为任务提供持久化存储(存储),并在任务失败时自动重启或迁移(自愈)。它提供了一套声明式的 API,你只需要告诉它“我想要什么状态”(例如,我需要 3 个副本的 Nginx 服务对外提供服务),它就会自动地、持续地工作,直到当前状态与你声明的期望状态一致。

这套模式,彻底改变了我们部署和管理分布式应用的方式。无论是初创公司的小型应用,还是大型互联网企业的核心业务,Kubernetes 都提供了可扩展、高可用的基础设施层。它让你从繁琐的、手动的服务器管理工作中解放出来,更专注于业务逻辑本身。接下来,我会抛开复杂的安装部署,深入到 Kubernetes 的核心理论模型,帮你理解这套“操作系统”到底是如何设计和运转的。理解了这些,无论是日常排错、性能调优还是架构设计,你都能做到心中有数。

2. 核心架构:Master 与 Node 的职责分离

Kubernetes 集群采用经典的主从(Master-Node)架构,这种清晰的责任分离是其能够稳健管理大规模集群的基石。你可以把 Master 节点看作是集群的“大脑”和“指挥中心”,而 Node 节点(也叫 Worker 节点)则是负责干活的“四肢”。

2.1 大脑:Master 节点组件详解

Master 节点是集群的管理平面,它不运行用户的应用容器,只负责做出全局决策(比如调度),以及检测和响应集群事件。为了保证高可用,生产环境通常会部署多个 Master 节点。它主要由以下几个核心组件构成:

API Server ( kube-apiserver ) : 这是整个系统的唯一入口,是所有组件交互的中枢。它提供了一套 RESTful API,我们通过 kubectl 命令行工具或者各种客户端库发送的所有请求,最终都到达这里。API Server 负责认证、授权、校验请求,并将资源对象(如 Pod、Service)的期望状态持久化到后端存储(etcd)中。你可以把它理解为一个高度安全的“前台接待”和“任务分发中心”,所有指令都必须通过它。

etcd : 一个分布式、高可用的键值存储数据库。Kubernetes 集群的所有配置数据、状态数据都存储在这里,包括节点信息、Pod 信息、Secrets、ConfigMaps 等。etcd 保证了数据的一致性和可靠性,是集群的“记忆中枢”。它的重要性不言而喻,因此必须做好备份和高可用部署。

Scheduler ( kube-scheduler ) : 集群的“调度器”。它的职责很简单:为新创建的、还没有被分配到任何 Node 的 Pod 选择一个最合适的 Node 去运行。这个选择并非随机,而是基于一系列复杂的策略和算法,包括资源需求(CPU/内存)、硬件/软件约束(节点亲和性)、数据局部性、干扰策略等。Scheduler 只做决策,不负责实际把 Pod 拉到节点上运行。

Controller Manager ( kube-controller-manager ) : 可以理解为集群的“自动控制中心”。它内部运行着多种控制器(Controller),每个控制器都是一个独立的控制循环,持续地监控集群中某一类资源的状态,并努力使其当前状态向用户声明的期望状态靠拢。例如:

  • Node Controller :负责监控 Node 节点的状态,当节点不可用时,负责标记并驱逐其上的 Pod。
  • Replication Controller :确保 Pod 的副本数量始终与期望值一致(注:现在更常用的是 Deployment ,它管理的是 ReplicaSet )。
  • Endpoint Controller :负责维护 Service 与 Pod 的对应关系(即 Endpoints 对象)。
  • Service Account & Token Controllers :为命名空间创建默认的账户和 API 访问令牌。

这些控制器是 Kubernetes “声明式 API” 和 “自愈能力” 得以实现的关键。

Cloud Controller Manager ( cloud-controller-manager ) : 这是一个可选组件,当你的 Kubernetes 集群运行在公有云(如 AWS、Azure、GCP)或私有云平台上时才会用到。它将一部分与特定云平台交互的逻辑(如负载均衡器配置、节点管理、路由管理)从 kube-controller-manager 中解耦出来,使得核心的 Kubernetes 代码与云提供商的具体实现分离,提升了可维护性。

2.2 四肢:Node 节点组件详解

Node 节点是容器真正运行的地方,是集群的“工作负载平面”。每个 Node 上都必须运行以下三个关键组件:

Kubelet : 这是 Node 节点的“代理”和“管家”。它是 Master 节点和 Node 节点之间的桥梁,负责与 API Server 通信,接收指令。它的核心职责包括:

  • 管理 Pod 的生命周期:确保在它这个节点上运行的 Pod 都处于健康状态。它会按照 PodSpec(Pod 定义文件)的描述,通过容器运行时(如 Docker)来启动、停止容器。
  • 定期向 Master 报告本节点的状态,如资源使用情况、Pod 运行状态等。
  • 执行容器健康检查(liveness/readiness probes)。

Kube Proxy : 负责节点上的网络代理和负载均衡。它维护节点上的网络规则,实现了 Kubernetes Service 的概念。当你在集群内创建一个 Service(比如一个负载均衡器)时, kube-proxy 会通过配置 iptables/IPVS 等机制,确保发往该 Service 虚拟 IP(ClusterIP)的流量,能够被正确地转发到后端的一组 Pod 上。它是实现服务发现和负载均衡的关键。

容器运行时 (Container Runtime) : 负责真正运行容器的软件,最经典的就是 Docker,但现在更流行的是符合 containerd CRI-O 标准的运行时。Kubelet 通过容器运行时接口(CRI)与它们交互,来拉取镜像、创建和运行容器。

注意 :在理解了架构之后,一个常见的困惑点是“我该从哪里开始学操作?”我的建议是,初期不要在搭建高可用集群上耗费过多精力。完全可以利用 minikube kind 或各大云平台的托管 Kubernetes 服务(如 EKS, AKS, GKE)快速创建一个可用的集群,把精力集中在理解和使用其核心 API 对象上。搭建和维护生产级集群是另一个专业领域。

3. 核心对象模型:用“乐高积木”构建应用

Kubernetes 的所有功能都是通过一系列 API 对象(Resources)来暴露的。这些对象就是你用来描述应用“期望状态”的“乐高积木”。你通过 YAML 或 JSON 文件定义它们,并提交给 API Server。理解这些核心对象及其关系,是掌握 Kubernetes 的关键。

3.1 Pod:可部署的最小单元

Pod 是 Kubernetes 中最基本、不可分割的调度单元。一个 Pod 包含一个或多个紧密相关的容器,这些容器共享相同的网络命名空间、IPC 命名空间,并且可以通过 localhost 互相通信。它们也共享存储卷(Volumes)。你可以把 Pod 想象成一个“逻辑主机”,里面的容器就像是这个主机上运行的几个进程。

为什么是 Pod 而不是单个容器?为了支持紧密耦合的“辅助容器”模式。例如,一个主 Web 服务容器可能需要一个伴生的容器来定期从远端同步配置文件,或者处理日志转发。这两个容器生命周期一致,需要直接通过本地网络通信,共享一部分文件系统,将它们放在同一个 Pod 里就非常合适。

Pod 的生命周期 是短暂的、一次性的。当 Pod 被调度到某个节点后,除非被驱逐或删除,否则会一直运行在该节点。如果节点故障或 Pod 本身异常退出,Kubernetes 会基于控制器(如 Deployment)的配置,创建一个全新的 Pod 来替换它,而不是“修复”旧的 Pod。这个新 Pod 会获得新的 IP 地址、新的主机名(如果设置了)。这是理解 Kubernetes 中服务发现为何重要的基础。

3.2 Controller:Pod 的管理者

由于 Pod 本身是脆弱的,我们很少直接创建独立的 Pod。而是通过各种控制器(Controller)来创建和管理 Pod,以实现扩缩容、滚动更新、故障恢复等高级功能。

ReplicaSet : 确保在任何时候都有指定数量的、完全相同的 Pod 副本在运行。它是实现高可用的基础。如果某个 Pod 挂了,ReplicaSet 会立刻创建一个新的来替代。你也可以手动调整副本数量来实现水平扩缩容。但通常我们不直接操作 ReplicaSet。

Deployment : 这是管理无状态应用最常用、最高级别的控制器。它管理 ReplicaSet,并为 Pod 和 ReplicaSet 提供声明式的更新能力。你只需要描述应用的期望状态(使用什么镜像、需要几个副本、更新策略是什么),Deployment 控制器就会以受控的方式(例如滚动更新)将实际状态变更到期望状态。它完美地实现了“应用发布”这个场景。

StatefulSet : 用于管理有状态的应用,如数据库(MySQL、MongoDB)、消息队列(Kafka)等。与 Deployment 创建的 Pod 是匿名、可随意替换的不同,StatefulSet 创建的 Pod 具有稳定的、唯一的标识符(按序编号的 Pod 名称)、稳定的网络标识(DNS 主机名)和稳定的持久化存储。即使 Pod 被重新调度,它也能挂载到相同的持久化存储上,这对于有状态服务至关重要。

DaemonSet : 确保集群中所有(或部分)节点上都运行一个 Pod 副本。常用于运行集群级别的守护进程,如日志收集器(Fluentd)、监控代理(Node Exporter)、网络插件(Calico)等。

Job/CronJob : 用于运行一次性任务或定时任务。Job 创建一个或多个 Pod 并确保它们成功运行完成。CronJob 则基于时间表(Cron 表达式)周期性地创建 Job。

3.3 Service 与 Ingress:服务的暴露与发现

Pod 是动态的、会消亡和重建的,因此直接使用 Pod IP 来访问服务是不可靠的。Service 和 Ingress 就是用来解决这个问题的。

Service : 定义了一组 Pod 的逻辑集合和一个访问这组 Pod 的策略。Service 有几种类型:

  • ClusterIP (默认):为服务分配一个集群内部的虚拟 IP(VIP),只能在集群内部访问。这是最常用的类型。
  • NodePort :在 ClusterIP 基础上,在每个 Node 节点上开放一个静态端口(NodePort),这样集群外部可以通过 : 来访问服务。
  • LoadBalancer :在 NodePort 基础上,利用云提供商的负载均衡器,创建一个外部负载均衡器并将流量导向服务。这是向公网暴露服务的最直接方式(云环境下)。
  • ExternalName :将服务映射到外部 DNS 名,用于集成集群外部的服务。

Service 通过 selector 标签选择器与 Pod 关联。 kube-proxy 负责实现 Service 的负载均衡。当 Pod 需要访问另一个 Service 时,只需使用其服务名(如 my-svc.my-namespace.svc.cluster.local ),Kubernetes 内置的 DNS 服务(CoreDNS)会自动将其解析为对应的 ClusterIP。

Ingress : Service 主要工作在 TCP/IP 第 4 层(传输层)。而 Ingress 是管理外部访问集群内服务的 第 7 层(应用层,通常是 HTTP/HTTPS)路由规则 的 API 对象。你可以通过 Ingress 配置基于域名、URL 路径的流量路由、SSL/TLS 终止等。Ingress 本身不会处理流量,它需要配合一个 Ingress Controller (如 Nginx Ingress Controller, Traefik)来生效,后者会监听 Ingress 规则的变化,并动态配置一个真正的负载均衡器或反向代理服务器。

实操心得 :对于初学者,一个容易混淆的点是 Service 和 Ingress 的关系。可以这样简单理解: Service 是内部的、四层的负载均衡和稳定访问点;Ingress 是外部的、七层的流量路由入口 。通常,外部流量路径是:用户 -> (DNS) -> Ingress Controller (负载均衡器) -> Ingress 规则 -> 后端 Service -> Pod。

3.4 ConfigMap 与 Secret:配置与敏感信息管理

将配置硬编码在容器镜像里是糟糕的做法。Kubernetes 提供了 ConfigMap 和 Secret 来将配置数据与镜像解耦。

ConfigMap : 用于存储非机密的、键值对形式的配置数据。你可以将环境变量、命令行参数或者整个配置文件(如 application.properties )存入 ConfigMap,然后在 Pod 定义中将其挂载为容器的环境变量或文件卷。这样,修改配置只需更新 ConfigMap,然后重启或滚动更新 Pod 即可,无需重新构建镜像。

Secret : 功能与 ConfigMap 类似,但专门用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥等。Kubernetes 会以更安全的方式(如非明文存储)处理 Secret。但请注意,默认的存储方式( etcd 未加密)仍可能存在风险,生产环境应考虑启用 etcd 加密或使用外部 Secret 管理方案(如云厂商的密钥管理服务、HashiCorp Vault)。

3.5 Volume 与 PersistentVolume:持久化存储

容器内的文件系统是临时的,容器重启后数据会丢失。Volume(卷)提供了在 Pod 生命周期内持久化存储数据的能力。但 Pod 消亡后,Volume 也可能随之清理。

为了持久化存储数据,Kubernetes 引入了 PersistentVolume (PV) PersistentVolumeClaim (PVC) 的抽象。

  • PersistentVolume (PV) :是集群中的一块网络存储资源,由管理员预先配置,或者由 StorageClass 动态供应。它独立于 Pod 的生命周期,就像一块物理硬盘。
  • PersistentVolumeClaim (PVC) :是用户对存储的“申请”。用户通过 PVC 声明需要的存储大小和访问模式(如 ReadWriteOnce, ReadOnlyMany)。Kubernetes 会寻找一个匹配的 PV 与之绑定。Pod 再通过引用 PVC 来使用这块持久化存储。

这种将存储供应(管理员负责 PV)和存储消费(用户负责 PVC)分离的模式,给了用户极大的灵活性,也简化了存储管理。

3.6 Namespace:虚拟集群

Namespace(命名空间)用于在同一个物理集群中创建多个虚拟集群,实现资源的多租户隔离。不同的团队、项目或环境(如 dev, staging, prod)可以分配到不同的命名空间。资源(如 Pod, Service)的名字在同一个命名空间内必须唯一,但在不同命名空间中可以重复。大部分资源都属于某个命名空间,但一些底层资源(如 Node, PersistentVolume)是集群全局的。

4. 核心工作原理:声明式 API 与控制循环

理解了对象模型,我们再来看看 Kubernetes 是如何让这些对象“活”起来的。其核心哲学是 声明式 API 控制循环

4.1 声明式 vs. 命令式

  • 命令式 :你告诉系统每一步具体要做什么。“先启动 A,再复制文件 B,然后修改配置 C”。如果中间某步失败,系统就停在那里,你需要手动干预。
  • 声明式 :你告诉系统你期望的最终状态是什么。“我需要一个运行着镜像 X、拥有 3 个副本的应用”。系统(Kubernetes)会持续地观察当前状态,并自动驱动实际状态向你的声明状态无限逼近,无论中间过程如何。

Kubernetes 完全采用声明式模型。你提交一个 YAML 文件(声明期望状态)给 API Server,它被保存到 etcd。随后,相关的控制器(控制循环)被触发,它们读取期望状态,对比当前状态,计算出需要执行的操作(创建、更新、删除某些资源),并执行这些操作。这个“观察-对比-执行”的循环会一直运行,确保系统始终符合你的声明。

4.2 控制循环详解

以 Deployment 控制器为例,它的控制循环大致如下:

  1. 观察 :Deployment 控制器通过 API Server 的 Watch 机制,持续监听两类对象的变化:a) 它自己管理的 Deployment 对象;b) 由它创建的 ReplicaSet 对象。
  2. 对比 :当监听到变化时,控制器将 Deployment 对象中声明的期望状态(如 replicas: 3 , image: nginx:1.20 )与当前关联的 ReplicaSet 的实际状态进行对比。
  3. 执行
    • 如果副本数不符,它会调整 ReplicaSet 的期望副本数。
    • 如果镜像版本不符(发生了更新),它会创建一个新的 ReplicaSet(例如 nginx-deployment-5d59d67564 ),并将其期望副本数逐步设为 3,同时将旧的 ReplicaSet 期望副本数逐步降为 0。这就是滚动更新的实现。
  4. ReplicaSet 控制器也有自己的控制循环,它监听 ReplicaSet 对象和 Pod 对象,确保 Pod 的实际数量与 ReplicaSet 声明的数量一致。如果少了就创建 Pod,多了就删除 Pod。
  5. Kubelet 也在运行控制循环,它监听分配给其节点的 Pod 的期望状态,并通过容器运行时确保这些 Pod 的容器被正确地创建和运行。

这一层层的控制循环,像齿轮一样精密咬合,共同维护着整个集群的稳定状态。这种设计使得系统异常健壮,某个控制器的暂时故障通常不会导致灾难性后果,因为当它恢复后,会再次进入循环,将状态修正。

5. 网络与存储模型深度解析

5.1 网络模型:每个 Pod 一个 IP

Kubernetes 对网络有一个基本要求: 每个 Pod 都拥有一个唯一的、可路由的 IP 地址(Pod IP),并且所有 Pod 之间可以直接通信,无需 NAT 。这个 IP 地址在 Pod 生命周期内是固定的,直到 Pod 被销毁。

这个模型带来了巨大的好处:

  • 简化应用配置 :应用无需处理复杂的端口映射,可以像在传统网络中一样使用固定的 IP:Port 进行通信。
  • 便于服务发现 :Service 的负载均衡可以基于稳定的 Pod IP 进行。
  • 网络策略基础 :为基于 Pod 或 Namespace 的网络隔离(NetworkPolicy)提供了可能。

实现这一模型的是 CNI(容器网络接口)插件 ,如 Calico、Flannel、Cilium 等。它们负责在节点间构建一个覆盖网络(Overlay Network)或利用主机路由,确保跨节点 Pod 的通信。选择 CNI 插件时,需要综合考虑性能、功能(如网络策略支持)、运维复杂度等因素。

Service 网络 是另一个虚拟层。Service 的 ClusterIP 是一个虚拟 IP,只在集群内部有意义。 kube-proxy 通过 iptables 或 IPVS 规则,将发往 ClusterIP 的流量拦截并负载均衡到后端真实的 Pod IP 上。这是一个纯四层的转发。

5.2 存储模型:抽象与供给

如前所述,PV/PVC 体系实现了存储的抽象。这里重点讲一下 StorageClass

StorageClass 是动态卷供应的关键。管理员可以定义多种 StorageClass,每个都对应一种存储类型(如 fast-ssd, slow-hdd)和供应者(如 AWS EBS, GCP PD, Ceph RBD)。当用户创建一个 PVC 时,可以指定所需的 StorageClass。这时,集群中如果没有现成的 PV 能满足需求,就会触发 动态供应 :一个与 StorageClass 关联的 provisioner 插件会自动在对应的后端存储系统上创建一块真正的存储(如云硬盘),并自动创建一个 PV 与之绑定,最后将 PV 绑定到用户的 PVC 上。整个过程完全自动化,无需管理员手动干预。

6. 安全模型:RBAC 与 ServiceAccount

安全是生产环境的生命线。Kubernetes 提供了多层次的安全机制。

认证 (Authentication) :确认用户身份。支持多种方式:客户端证书、静态令牌、引导令牌、OpenID Connect 令牌等。托管服务或企业内部通常与 LDAP/OAuth2 等系统集成。

授权 (Authorization) :决定用户是否有权限执行某项操作。最主流的方式是 RBAC(基于角色的访问控制)

  • Role / ClusterRole :定义一组权限规则(例如,能对 Pod 执行 get, list, watch 操作)。Role 作用于单个命名空间,ClusterRole 作用于整个集群。
  • RoleBinding / ClusterRoleBinding :将 Role/ClusterRole 绑定到特定的用户、组或 ServiceAccount。Binding 也分命名空间和集群级别。

通过精细的 RBAC 配置,可以实现“最小权限原则”,例如只允许开发团队在 dev 命名空间内创建 Pod,而运维团队可以在所有命名空间查看资源。

ServiceAccount :这是给运行在 Pod 内的进程使用的身份,而不是给真人用户用的。每个命名空间有一个默认的 default ServiceAccount。Pod 启动时,会自动挂载该 ServiceAccount 的令牌,Pod 内的进程可以使用这个令牌来访问 Kubernetes API。你可以创建专用的 ServiceAccount,并为其绑定精确的 Role,来限制 Pod 的 API 访问权限。 永远不要滥用 cluster-admin 权限,也不要将高权限的 ServiceAccount 令牌轻易挂载到 Pod 中。

准入控制 (Admission Control) :在请求通过认证授权后、持久化到 etcd 前,会经过一系列准入控制器。它们可以修改(Mutating)或验证(Validating)请求。例如 ResourceQuota 控制器会检查资源配额, PodSecurityPolicy (已废弃,被 Pod Security Admission 替代)可以强制实施安全策略。

7. 运维与排错核心思路

理解了理论,最终要落到实操。面对一个复杂的 Kubernetes 集群,如何有效运维和排错?

7.1 核心监控维度

  1. 集群组件健康 :API Server、Scheduler、Controller Manager、etcd 等 Master 组件是否健康?Node 节点的 kubelet 是否正常运行?这是基础。
  2. 节点资源 :各 Node 的 CPU、内存、磁盘压力。使用 kubectl top node 和节点监控工具(如 Prometheus Node Exporter)。
  3. 工作负载状态 :Pod 是否都处于 Running 状态? kubectl get pods --all-namespaces 查看是否有 CrashLoopBackOff ImagePullBackOff Pending 等异常。Deployment/StatefulSet 的期望副本数与实际副本数是否一致?
  4. 应用性能 :Pod 内部的 CPU/内存使用率( kubectl top pod ),应用自身的业务指标(如 QPS、延迟、错误率)。这需要将应用与监控系统(如 Prometheus)集成。

7.2 排错命令与日志查看

一套高效的排错命令流:

  1. kubectl get :首先看资源是否存在,状态如何。 kubectl get pods,svc,deploy -n <namespace> -o wide
  2. kubectl describe :当状态异常时,用 describe 查看详细事件和配置。 kubectl describe pod <pod-name> 中的 Events 部分是黄金信息,会告诉你调度失败、镜像拉取失败、启动失败等具体原因。
  3. kubectl logs :查看 Pod 内容器的标准输出和错误日志。 kubectl logs -f <pod-name> [-c <container-name>] 。对于多容器 Pod,务必指定容器名。
  4. kubectl exec :进入运行中的容器进行调试。 kubectl exec -it <pod-name> -- /bin/sh
  5. kubectl apply/delete --dry-run=client -oyaml :在真正执行变更前,用于验证配置或生成配置模板,非常安全。

7.3 常见问题速查表

问题现象 可能原因 排查命令/方向
Pod 状态 Pending 资源不足(CPU/内存)、节点选择器/亲和性不匹配、污点容忍未配置、PVC 未绑定 PV。 kubectl describe pod 看 Events; kubectl get nodes 看资源;检查 PVC 状态。
Pod 状态 ImagePullBackOff 镜像名称错误、私有镜像仓库无访问权限、镜像拉取策略( imagePullPolicy )问题。 kubectl describe pod 看 Events;检查镜像名和 tag;检查 imagePullSecrets
Pod 状态 CrashLoopBackOff 容器启动后立即退出。应用本身启动错误、配置错误、依赖服务未就绪、存活探针失败。 kubectl logs --previous 查看上次崩溃日志; kubectl describe pod ;检查应用配置和依赖。
Pod 状态 Running 但服务不通 容器内进程监听端口错误、就绪探针(readiness)失败、Service 的 selector 与 Pod 标签不匹配、网络策略(NetworkPolicy)阻拦。 kubectl exec 进入容器检查端口; kubectl describe pod 看就绪探针状态; kubectl get svc -o yaml 检查 selector;检查 NetworkPolicy。
Service 无法解析 CoreDNS 服务未运行或异常。 kubectl get pods -n kube-system -l k8s-app=kube-dns ;在 Pod 内执行 nslookup <service-name> 测试。
节点 NotReady Kubelet 进程异常、节点资源(磁盘、内存)耗尽、网络插件故障。 登录节点检查 systemctl status kubelet df -h free -m 检查资源;查看 journalctl -u kubelet 日志。

7.4 配置与变更管理心得

  • 一切皆代码 (GitOps) :将所有的 Kubernetes YAML 清单文件、Helm Charts 纳入版本控制系统(如 Git)。任何对集群的变更都通过提交代码、代码审查、CI/CD 流水线来自动化完成。这保证了环境的一致性、可追溯性和可回滚性。工具如 ArgoCD、FluxCD 是实践 GitOps 的利器。
  • 使用 Helm 管理复杂应用 :对于由多个 Deployment、Service、ConfigMap 等组成的复杂应用,手动管理一堆 YAML 文件是噩梦。Helm 作为 Kubernetes 的包管理器,允许你将相关资源打包成一个 Chart,通过模板和变量实现配置参数化,极大简化了应用的部署、升级和管理。
  • 资源请求与限制 (Requests/Limits) :务必为 Pod 设置合理的 resources.requests resources.limits requests 用于调度决策(确保节点有足够资源), limits 是容器能使用的资源上限(防止单个 Pod 吃光节点资源)。不设置或设置不当是导致集群不稳定(节点压力大、Pod 被驱逐)的常见原因。
  • 优雅终止与就绪探针 :在 Pod 的 spec 中配置 terminationGracePeriodSeconds ,并在容器内处理 SIGTERM 信号,实现优雅关闭。配置有效的就绪探针(readinessProbe),确保流量只被导到真正准备好的 Pod,这对于实现零停机滚动更新至关重要。

理论是实践的灯塔。深入理解 Kubernetes 的这些核心概念和模型,能让你在遇到问题时不再盲目搜索,而是能够系统地分析、推断并快速定位根因。从理解 Pod 和 Controller 的关系,到掌握声明式 API 的控制循环思想,再到厘清网络、存储、安全模型的脉络,每一步都是在构建你对于这套云原生“操作系统”的认知地图。剩下的,就是在具体的项目中,去反复运用和验证这些理论,积累属于你自己的实战经验了。

更多推荐