Apr 17, 2026
云计算

Kubernets 工具详解

一篇文章讲清楚 kubernetes 的工具以及为什么会存在

Kubernets 工具详解
Posted by
SYSTEM· 35 次阅读

Kubernetes 生态系统背后有着一段故事。每一个工具之所以存在,都是因为仅凭 Kubernetes 本身还远远不够。

你通过 kubectl 来管理一切:获取 Pod 列表、查看详情(describe)、查看日志、进入容器执行命令(exec)、删除资源、应用配置——每天在 5 个不同的命名空间(namespace)中重复操作 50 次。这确实行得通,但过程缓慢且令人痛苦,尤其是需要在每一条命令后面都加上 -n namespace 参数。

于是,你开始使用 K9s 或 Lens。这是一种终端用户界面(TUI),能让你在一个视图中概览整个集群的状态。通过它,你可以轻松切换命名空间或不同的集群,实时追踪日志(tail logs),进入 Pod 内部执行命令,以及完成你所需的一切操作。

你通过笔记本电脑执行 kubectl apply 命令来部署应用。然而,有人直接在集群内部手动修改了某个 Deployment(部署),导致当前运行的实际状态与 Git 仓库中的配置不再一致。这就是所谓的“配置漂移”(Drift);这种漂移往往悄无声息,直到生产环境发生故障时才会暴露出来。

于是,你开始使用 ArgoCD。Git 仓库成为了“单一事实来源”(Single Source of Truth):任何配置变更都会自动同步到集群中;如果有人试图手动修改 Deployment,ArgoCD 会自动将其回滚(覆盖)至 Git 仓库中的标准状态。

你的 Kafka 消费者(Consumer)积压了 20 万条待处理消息,但其 CPU 利用率仅为 5%,导致 HPA(水平 Pod 自动扩缩容)机制判定无需进行扩容。消息队列持续膨胀,而终端用户却在焦急地等待响应。

于是,你开始使用 KEDA。它能够基于消息队列深度、SQS 消息数量或 Prometheus 监控指标来进行 Pod 扩缩容,而不仅仅局限于 CPU 利用率这一单一维度。积压的消息队列随即被迅速清空。

当流量激增时,HPA 机制会新增 Pod 副本;但如果此时集群节点资源已满,新创建的 Pod 就会一直滞留在“Pending”(待调度)状态。虽然 HPA 已经完成了它的本职工作,但集群却苦于没有足够的物理空间来容纳这些新增的 Pod。

于是,你开始使用 Karpenter。一旦有 Pod 陷入“Pending”状态,它能在数秒内自动创建并接入一个新的集群节点;当负载回落时,该节点又会自动销毁并移除。你只需为你实际使用的资源付费。

默认情况下,集群内的每一个 Pod 都可以与任何其他 Pod 进行通信。你的支付服务可以直接访问数据库,内部工具也能直接调用日志服务;除非你主动设置阻断规则,否则所有的网络流量都是畅通无阻的。

于是,你开始使用“网络策略”(Network Policies)。通过配置策略,你的数据库将仅接受来自应用服务(App)的流量,拒绝一切其他来源的访问请求;这样一来,一旦某个 Pod 遭到入侵,其可能造成的破坏范围(Blast Radius)将被大幅度缩小。

假设你拥有 20 个微服务,其中某一个服务开始响应迟缓,导致另外 4 个服务因重试请求堆积而陷入瘫痪。一场连锁故障(Cascade Failure)就此爆发,而你却无法准确定位故障的源头,因为所有的服务间流量在默认状态下都是“不可见”的。

于是,你开始使用“服务网格”(Service Mesh)。 Istio 或 Linkerd 会在每个 Pod 旁边放置一个 sidecar 代理,为每个服务之间提供 mTLS 加密、重试机制、熔断机制以及流量指标,而无需修改任何应用程序代码。

您的密钥在 Kubernetes 中以 Base64 编码存储在 etcd 中,任何拥有 kubectl 访问权限的人都可以读取。您希望将它们存储在 Vault 或 AWS Secrets Manager 中,但您不想重写应用程序来获取它们。

因此,您使用 Secrets Store CSI 驱动程序。密钥存储在 Vault 或 AWS Secrets Manager 中,并作为文件直接挂载到您的 Pod 中。密钥永远不会存在于 Kubernetes 中。

一位开发人员发布了一个以 root 权限运行的容器,另一位开发人员发布了一个没有资源限制的容器,而您每次都是在事故发生后才发现问题。

因此,您使用 Kyverno。在任何资源进入集群之前,都会强制执行准入策略,禁止 root 容器、没有摘要的镜像以及没有限制的部署。

这显然有问题。 Pod 不断重启,延迟飙升,内存占用持续攀升,但你却没有任何数据、历史记录,也无法得知故障何时开始。

于是你开始使用 Prometheus 和 Grafana。Prometheus 会抓取每个 Pod、节点和组件的指标,而 Grafana 则将这些数据转化为仪表盘。你可以看到峰值,以及峰值出现的确切时间,还有导致峰值的那个服务。

Grafana 显示了峰值,但却无法告诉你触发峰值的是哪个请求,它首先访问的是哪个服务,以及速度下降的源头在哪里。日志只能提供零散的信息,而指标只能提供总数。两者都无法提供完整的信息。

于是你开始使用 Jaeger。它可以追踪每个请求访问的每个服务,显示每次跳转的延迟以及确切的故障点。就像大海捞针一样,几秒钟就能找到问题所在。

你的外部流量需要进入集群。你配置了 Kubernetes 原生的 Ingress,但它只支持基础的基于主机和路径的 HTTP 路由。当你想要为你的 BFF(Backend for Frontend)层提供统一的 API 聚合,或者需要实现金丝雀发布(Canary Release)、基于 Header 的高级路由规则、以及 gRPC 协议支持时,原生 Ingress 显得力不从心。

于是,你开始使用基于 Kubernetes Gateway API 的现代网关(如 Envoy Gateway 或 Kong)。它不仅接管了所有南北向流量,还直接在网关层处理了复杂的灰度路由、全局限流和统一的身份验证。你的后端 Spring Boot 微服务不再需要去重复处理这些基础切面逻辑。

你的应用对外提供服务需要 HTTPS 加密。最初,你手动生成了 TLS 证书,将其作为 Secret 贴入集群。几个月后,证书过期了,生产环境的 API 突然被拦截,而你甚至不记得上次是在哪台机器上执行的 openssl 命令。

于是,你开始使用 cert-manager。它被配置为集群级别的证书颁发机构(与 Let's Encrypt 或内部的 PKI 系统无缝集成)。每次部署应用时,它会自动为你申请、配置并在过期前自动轮转 TLS 证书。从此,你再也没有因为证书过期而遭遇生产事故。

一次意外的命名空间删除或是可用区(AZ)的硬件故障摧毁了你的部分基础设施。虽然你的代码和声明式配置都在 Git 里(得益于 ArgoCD),但数据库的持久化卷(Persistent Volume)数据和集群内运行状态的快照都丢失了,重建整个系统并恢复数据可能需要耗费几天时间。

于是,你开始使用 Velero。它不仅备份所有的 Kubernetes 资源对象,还能对底层的云盘(如 AWS EBS)进行快照,并将其安全地推送到集群外的 S3 存储桶中。当灾难降临时,你只需一条命令,就能在另一个区域的全新集群中完美复原整个应用生态和历史数据。

你的微服务架构运转良好,但你的某个应用还需要一个外部的托管数据库(如 Amazon RDS)和一个消息队列系统。开发人员不得不离开 Kubernetes 熟悉的 YAML 生态,去求助平台工程团队编写 Terraform 脚本,这打破了以应用为中心的自动化部署体验。

于是,你开始使用 Crossplane。它将 Kubernetes 变成了控制整个云基础设施的控制平面。开发人员只需在集群中应用一个自定义资源(CRD),Crossplane 就会在云端自动配置好 RDS,并将连接凭证直接作为 Secret 注入到该应用的命名空间中。所有基础设施的生命周期都回到了统一的控制平面之下。

随着集群规模的不断扩大,月底的云服务账单翻了三倍。管理层要求你解释“到底是哪个业务模块或团队在疯狂消耗资源?” 你看着混合在一起的底层计算节点账单,根本无法区分这些成本里哪些属于核心交易系统,哪些属于内部工具。

于是,你开始使用 Kubecost。它深入集群内部,将 CPU、内存和存储的成本精确分摊到每一个命名空间、Deployment 甚至特定的标签(Label)上。现在,你可以清晰地生成成本报表,精准定位资源浪费,并推动各团队优化其容器的资源请求(Requests)与限制(Limits)。


最终,你退后一步审视这一切。

你最初只是想要一个能够运行容器的编排工具。但为了让它在企业级的生产环境中真正稳定、安全可用,你引入了一整套生态:GitOps、自动扩缩容、网络隔离、服务网格、安全策略、可观测性以及基础设施代码化。

Kubernetes 早就不仅仅是一个容器编排器了。它是一个构建平台的平台(A platform for building platforms)。它提供了一组标准的、可扩展的 API 核心,而正是这些围绕着它野蛮生长、解决实际痛点的开源工具,共同拼凑出了现代云原生架构的完整拼图。

评论交流
暂无评论,欢迎分享您的见解