标签 Golang 下的文章

Kubernetes 2.0 畅想:告别 YAML、etcd 束缚与 Helm 之痛,K8s 的下一站是什么?

本文永久链接 – https://tonybai.com/2025/06/21/kubernetes-2-0

大家好,我是Tony Bai。

自 2014 年首次提交以来,Kubernetes 已走过辉煌的十年。它从一个“没人能念对名字”的希腊词汇,成长为容器编排领域无可争议的事实标准,深刻地改变了我们构建、部署和管理应用的方式。我们不再满足于在服务器层面“管理基础设施”,一切都变得声明式、可扩展、可恢复,甚至(如果你足够幸运的话)能够自我修复。

然而,正如任何伟大的技术旅程一样,Kubernetes 的发展也并非一帆风顺。尽管它带来了巨大的生产力提升,但其陡峭的学习曲线、某些领域“不够固执己见 (not opinionated enough)”导致的常见错误和配置失误、以及生态系统中持续的“变动”,仍然让许多开发者和运维者“痛并快乐着”。我们依然会踩到那些文档早已记录的“地雷”。

站在十年的重要节点,回望过去,展望未来,一个有趣的问题自然而然地浮现:如果我们有机会基于今天的认知和经验,重新构想一个 Kubernetes 2.0,它会是什么样子?我们能做哪些改变,让这个伟大的工具更普惠、更强大、更易用?

最近,一篇题为《What Would a Kubernetes 2.0 Look Like》的博文,就针对这个问题提出了一系列大胆而深刻的畅想,直指当前 K8s 生态中的核心痛点。今天,我们就来一起探讨这些引人深思的观点。

注:本文观点主要源自上述博文,并结合我个人的一些思考,希望能为大家带来启发。

Kubernetes 的十年功与过:为何我们需要畅想“2.0”?

在畅想未来之前,我们必须承认 Kubernetes 取得的巨大成功。它之所以能成为云原生时代的基石,离不开其核心价值:

  • 大规模容器化: 将容器从本地开发环境无缝推向数千台服务器的生产集群,赋予了组织前所未有的灵活性,催生了微服务架构的繁荣。
  • 低维护性: 推动了基础设施从“宠物 (Pets)”到“牛群 (Cattle)”再到“UUID时代”的演进。服务器变得完全可替代,运维模式从手动修复转向“销毁节点,让K8s重组”。
  • 改进的作业系统: 提供了比传统“孤岛式 cron01 服务器”更可靠、更灵活的批处理作业和消息队列任务执行方案。
  • 简化的服务发现与负载均衡: 通过 Service API 提供了稳定的内部 DNS 和 IP,极大地简化了服务间的调用和依赖管理。

然而,正如文章作者所言,“旅程并非没有问题”。“默认值是技术中最强大的力量 (defaults are the most powerful force in technology)”,而 Kubernetes 在某些方面的“默认”或“缺失”,恰恰是许多痛点的根源。 这正是我们畅想“K8s 2.0”的出发点——通过设定更优的“快乐路径 (happy path)”,提升整个生态的健康度和用户体验。

畅想一:抛弃 YAML,拥抱 HCL——配置语言的救赎?

“YAML 之所以吸引人,是因为它既不是 JSON 也不是 XML,这就像说你的新车很棒,因为它既不是马也不是独轮车一样。” 文章作者对 YAML 的这句犀利点评,道出了许多 K8s 用户的心声。

YAML最初凭借其看似简洁的格式在 Kubernetes 中胜出,但其在实践中暴露的问题也日益突出:

  • 模糊性与易错性: 缩进敏感、类型不明确(著名的“挪威问题”——NO 被解析为布尔值 false)、缺乏引用的数字可能被误解等。
  • 难以扩展和调试: 超长的 YAML 文件令人望而生畏,调试错误往往如同大海捞针。
  • 表达能力不足: 缺乏内置的变量、函数、条件逻辑等,导致大量依赖外部模板工具(如 Helm templates, Kustomize)。

文章大胆提议,Kubernetes 2.0 应该用 HCL (HashiCorp Configuration Language) 替换 YAML。 HCL 作为 Terraform 的配置语言,早已被广大云原生开发者所熟悉。其核心优势在于:

  • 强类型与显式类型: 从源头上避免了 YAML 的许多类型相关错误。
  • 内置变量、引用、函数和表达式: 能够动态生成配置,减少重复,提高可维护性。
  • 条件逻辑与循环: 支持更灵活的环境特定配置和重复性配置的简化。
  • 更好的注释、错误处理和模块化能力。

作者通过对比简单的 YAML 和 HCL 示例,直观地展示了 HCL 在类型安全和动态配置生成方面的优越性:

# YAML doesn't enforce types
replicas: "3"  # String instead of integer
resources:
  limits:
    memory: 512  # Missing unit suffix
  requests:
    cpu: 0.5m    # Typo in CPU unit (should be 500m)

vs.

# HCL 

replicas = 3  # Explicitly an integer

resources {
  limits {
    memory = "512Mi"  # String for memory values
  }
  requests {
    cpu = 0.5  # Number for CPU values
  }
}

尽管 HCL 可能略显冗长,且其 MPL-2.0 许可证与 K8s 的 Apache 2.0 许可证的整合需要法律审查,但作者认为,为了大幅改善配置体验,这些障碍值得克服。

畅想二:开放后端存储,etcd 不再是唯一选择——灵活性的追求

etcd 作为 Kubernetes 集群状态的权威存储,一直以来都扮演着至关重要的角色。然而,文章指出,etcd 作为唯一的默认后端存储,也带来了一些局限:

  • 资源消耗: 对于小型集群或资源受限的边缘环境,etcd 可能显得过于“庞大”和资源密集。
  • “强绑定”关系: Kubernetes 几乎是 etcd 现存唯一的“大客户”,这种高度绑定可能不利于双方的独立发展和技术选择的灵活性。

因此,文章建议 Kubernetes 2.0 应该官方化 kine (k3s-io/kine) 等项目的工作,提供可插拔的后端存储抽象层。 这将允许:

  • 根据硬件和集群规模选择更合适的后端: 例如,对于小型或边缘集群,可以使用像 dqlite (基于 Raft 的分布式 SQLite) 这样的轻量级方案,它们资源占用小,升级维护可能更简单。
  • 促进存储技术的创新与竞争: 开放后端接口,可以鼓励更多针对 K8s 优化的存储方案涌现。
  • 降低对单一项目的依赖。

此外,Go 语言在构建分布式一致性存储方面拥有优秀的库(如 hashicorp/raft,etcd 本身也是 Go 编写的)。这些技术积累能否为 Kubernetes 构建更灵活、更高效的可插拔存储后端提供更多思路?

畅想三:超越 Helm,构建原生包管理器——生态治理的进化

Helm 作为 Kubernetes 事实上的包管理器,为社区贡献了标准化的应用分发和管理方式。文章作者首先感谢了 Helm 维护者的辛勤工作。但紧接着,便毫不留情地指出了 Helm 在实践中的诸多“噩梦”:

  • Go模板的复杂性与调试困难: 复杂的模板逻辑、令人困惑的错误场景、以及难以理解的错误信息。
  • 依赖管理能力的孱弱: 难以优雅地处理传递性依赖和版本冲突,尤其在多个应用依赖同一子 Chart 的不同版本时。
  • 其他痛点: 跨命名空间安装不便、Chart 验证过程繁琐且少有人用(作者甚至吐槽了 Artifact Hub 上官方 Chart 的验证状态)、元数据搜索能力弱、不严格执行语义化版本控制、以及卸载/重装包含 CRD 的 Chart 可能导致用户数据丢失的严重安全隐患。

作者断言:“没有办法让 Helm 足够好地完成‘管理地球上所有关键基础设施的包管理器’这项任务。”

因此,文章畅想了一个名为 KubePkg 的 Kubernetes 原生包管理系统,其核心设计理念借鉴了成熟的 Linux 包管理系统,并充分利用了 Kubernetes CRD 的能力:

  • 一切皆为 Kubernetes 资源: 包定义、仓库、安装实例等都通过 CRD 管理,拥有标准的 status 和 events。
  • 一流的状态管理: 内置对有状态应用备份、恢复、升级策略的支持。
  • 增强的安全性: 强制的包签名、验证机制和安全扫描集成。
  • 声明式配置,告别模板: 使用结构化的配置(可能基于 HCL 或类似带有 Schema 的语言),而非难以调试的文本模板。
  • 完善的生命周期管理: 提供全面的 pre/post-install/upgrade/remove 钩子。
  • 强大的依赖解析: 类似 Linux 包管理器的、基于语义化版本的依赖管理和冲突解决能力。
  • 完整的审计追踪: 记录所有变更的“who, what, when”。
  • 策略执行与简化的用户体验。

加分项:默认拥抱 IPv6——未雨绸缪的网络升级

除了上述三大核心变革,文章还提出了一个颇具前瞻性的建议:Kubernetes 2.0 应将默认网络模式切换到 IPv6。

其理由在于,IPv4 带来的 NAT 穿透复杂性、IP 地址耗尽焦虑(即使在私有网络中,大规模集群也可能迅速耗尽 /20 这样的网段)等问题,已经浪费了全球开发者和运维者大量的时间和精力。

在 K8s 内部默认使用 IPv6,可以:

  • 极大简化集群内部网络拓扑。
  • 在组织层面,如果使用公网 IPv6 地址,可以更容易地忽略多集群之间的界限。
  • 提升网络流量的可理解性。
  • 更好地利用 IPv6 内置的 IPSec 等安全特性。

作者强调,这并非要求整个互联网立即切换到 IPv6,而是 Kubernetes 自身可以主动进化,以解决其在当前规模下面临的 IP 地址管理和网络复杂性问题。

小结:“默认即王道”,Kubernetes 的未来在于更优体验

“Kubernetes is an open platform, so the community can build these solutions.” (K8s 是一个开放平台,所以社区可以构建这些解决方案。)这是对类似“2.0”畅想的常见反驳。但文章作者一针见血地指出,这种说法忽略了一个关键点:“默认值是技术中最强大的力量。” 核心项目定义的“快乐路径”将主导 90% 用户的交互方式。

如果 Kubernetes 2.0 能够在配置语言、后端存储、包管理乃至网络模型这些核心体验上,提供更简洁、更安全、更强大、更易用的“默认选项”,那么整个生态系统都将因此受益。

这无疑是一份雄心勃勃的畅想清单。但正如作者所言:“如果我们打算做梦,那就做个大梦。毕竟,我们是那个认为将一项技术命名为‘Kubernetes’也能流行起来的行业,而且不知何故它确实做到了!”

Kubernetes 的第一个十年,奠定了其在云原生领域的王者地位。下一个十年,它需要在保持核心优势的同时,勇于直面和解决用户在实践中遇到的真实痛点,不断进化,提供更极致的用户体验。这些“2.0”的畅想,无论最终能否完全实现,都为我们指明了值得努力的方向。

参考文章地址:https://matduggan.com/what-would-a-kubernetes-2-0-look-like


聊一聊,也帮个忙:

  • 对于文中提出的 Kubernetes 2.0 的三大核心变革(HCL替换YAML、可插拔etcd、原生包管理器KubePkg),你最期待哪一个?为什么?
  • 你认为当前使用 Kubernetes 最大的痛点是什么?这些“2.0畅想”是否触及了你的痛点?
  • 关于默认使用 IPv6,你认为在实际推行中会遇到哪些挑战?

欢迎在评论区留下你的真知灼见。如果你觉得这篇文章引发了你的思考,也请转发给你身边的云原生同道们,一起畅想 Kubernetes 的未来!


精进有道,更上层楼

极客时间《Go语言进阶课》上架刚好一个月,受到了各位读者的热烈欢迎和反馈。在这里感谢大家的支持。目前我们已经完成了课程模块一『语法强化篇』的 13 讲,为你系统突破 Go 语言的语法认知瓶颈,打下坚实基础。

现在,我们已经进入模块二『设计先行篇』,这不仅包括 API 设计,更涵盖了项目布局、包设计、并发设计、接口设计、错误处理设计等构建高质量 Go 代码的关键要素。

这门进阶课程,是我多年 Go 实战经验和深度思考的结晶,旨在帮助你突破瓶颈,从“会用 Go”迈向“精通 Go”,真正驾驭 Go 语言,编写出更优雅、更高效、更可靠的生产级代码!

扫描下方二维码,立即开启你的 Go 语言进阶之旅!


如果你对Go语言的底层原理和高级技巧充满好奇,渴望构建更坚实的技术壁垒,我诚挚地邀请您关注我的微专栏系列。在这里,我们拒绝浮光掠影,只做深度挖掘:



商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

RedMonk最新排行出炉:Go语言稳居Top 12,AI 冲击下 Stack Overflow 权重生变?

本文永久链接 – https://tonybai.com/2025/06/20/redmonk-index-2025-jan

大家好,我是Tony Bai。

编程语言的江湖,总是风起云涌,新旧更迭。而 RedMonk 编程语言排行榜,以其独特的视角(结合 GitHub 的代码活跃度和 Stack Overflow 的讨论热度),长期以来都是我们观察这片江湖风向的重要参考。

就在最近,RedMonk发布了其2025年1月的编程语言排行榜。榜单本身波澜不惊,Top 20 的名单几乎与上一期如出一辙,这似乎预示着编程语言领域正进入一个相对“固化”的时期。然而,在这份看似平静的榜单背后,却潜藏着一个巨大的变量,一个足以让 RedMonk 自身都开始反思其排行方法论的“房间里的大象”——那就是 AI 的崛起,及其对 Stack Overflow 数据源的颠覆性冲击。

今天,我们就来解读这份最新的 RedMonk 排行榜,看看 Go 语言在其中表现如何,更重要的是,探讨在 AI 时代,我们该如何看待这类排行榜,以及 Go 语言的未来又将走向何方。

RedMonk 排行榜:方法论回顾与本次看点

在解读具体排名之前,我们有必要简单回顾一下 RedMonk 排行榜的方法论。它并非统计当前“谁用得多”,而是试图通过两个维度的数据来预测语言的未来采用趋势

  1. GitHub 数据: 主要通过 GitHub Archive 拉取数据,分析代码提交中使用的语言,代表了语言在实际项目开发中的活跃度和受开发者青睐的程度。
  2. Stack Overflow 数据: 通过其 Data Explorer 查询,分析特定语言标签下的问题和讨论数量,代表了语言在开发者社区中的关注度和开发者在学习、使用过程中遇到的问题量(间接反映了活跃度)。

RedMonk 强调,榜单的“分层 (Tiering)”比具体的数字名次更重要,因为精确排名本身就存在误差。同时,对于排名靠后的语言,由于数据量较小,其排名的波动性和不确定性会更大。

本次 2025 年 1 月的排行,最大的看点莫过于 RedMonk 博客作者 Stephen O’Grady 对 Stack Overflow (以下有时简称SO)数据有效性的公开疑虑。他明确指出,随着 ChatGPT、GitHub Copilot 等 AI 工具的普及,开发者遇到问题时,直接向 AI 提问的比例越来越高,而去 Stack Overflow 搜索或提问的需求显著下降。这导致 Stack Overflow 整体流量和特定语言标签下的讨论量都在萎缩,从而可能扭曲了基于 StackOverflow 数据的排名。RedMonk 甚至在考虑未来是否要调整 SO 数据的权重,甚至完全放弃使用它。

这无疑为我们解读本次榜单,尤其是观察那些 SO 数据占比较重的语言,提供了一个全新的、也是更具挑战性的视角。

Go语言:稳坐 Top 12,GitHub 根基深厚

在这样的背景下,我们来看看Go语言的表现:

  • 排名: Go 语言在此次排行中位列 第 12 位,与统计语言 R 并列。
  • 稳定性: Top 20 的榜单几乎“纹丝不动”,Go 的排名也保持了稳定。回顾历史,Go 从 2015 年的第 17 位,稳步上升,并在近几年持续超越了曾经在 JVM 生态中势头强劲的 Scala 和 Kotlin。
  • 解读 Go 的“稳”: 在 Stack Overflow 数据可能“失真”、整体排行趋于“凝固”的大环境下,Go 语言能够牢牢占据 Top 12 的位置,这本身就充分说明了其在 GitHub 上的代码活跃度和开发者基础的极端稳固。这与 Go 在云原生、后端服务、基础设施等领域的深厚积累和广泛应用密不可分。

关键语言动态:Go 在比较中更显价值

RedMonk 的博文还特别点出了一些值得关注的语言动态,通过与这些语言的对比,我们可以更清晰地看到 Go 的独特价值和发展趋势。

  • TypeScript (第 6) 的“平台期”与 Go 的“幕后英雄”角色

尽管 TypeScript 在 JavaScript 生态中不可或缺,其排名也高居第 6,但博文指出它似乎进入了一个“增长平台期”,难以再向上突破。

RedMonk 提到了 TypeScript 在可扩展性 (scalability) 方面可能遇到的挑战,并直接点名了微软决定使用 Go 语言重写 TypeScript 的编译器 (tsc) 和相关工具链这一标志性事件。

当然,这无疑是对 Go 语言在构建大规模、高性能开发工具和基础设施方面能力的最好背书。当连 TypeScript 这样的语言工具自身都遇到扩展性瓶颈时,他们选择了 Go 作为解决方案。这充分证明了 Go 在工程效率、编译速度、并发处理和静态二进制部署等方面的核心优势,使其成为构建下一代开发工具(编译器、Linter、语言服务器等)的优选语言。Go,正在成为越来越多关键技术的“幕后英雄”。

  • Kotlin (并列 14) / Scala (并列 14) 的“增长天花板”

这两位 JVM 生态的“优等生”排名稳定,但向上突破的动力似乎不足。Go 早已在排名上超越它们。

随着 Go 在微软等传统“非 Go”大厂中找到新的应用场景(如上述 TypeScript 工具链),以及 Rust 在对安全和性能有极致要求的服务端负载中逐渐蚕食地盘,Kotlin 和 Scala 的增长路径面临着不小的挑战。

Go 凭借其简洁的语法、高效的并发模型、出色的网络性能、以及与云原生生态的无缝集成,在现代后端服务开发领域,对传统的 JVM 语言形成了持续且强劲的竞争压力。对于追求快速迭代、高并发、低资源占用的新项目,Go 往往是更具吸引力的选择。

  • 新兴语言 (Ballerina, Bicep, Zig 等) 的“SO 困境”

许多被 RedMonk 关注的新兴语言,在本次排名中大多出现了下滑,并且呈现出 GitHub 排名远好于 Stack Overflow 排名的特点。

这很可能就是前文提到的 AI 对 Stack Overflow 数据冲击的直接体现。新兴语言本身在 SO 上的讨论基数就小,当整体 SO 流量下降时,它们受到的负面影响会更加不成比例。

这再次提醒我们,在评估语言趋势时,需要警惕单一数据源(尤其是易受外部因素干扰的数据源)的局限性。Go 之所以能在榜单中保持稳定,更多是依赖其在 GitHub 上庞大且活跃的真实代码贡献和项目应用,这比社区讨论热度更能反映语言的实际生命力。

AI 时代,编程语言排行榜的挑战与 Go 的新机遇

AI 代码助手(如 ChatGPT, GitHub Copilot)的普及,正在深刻改变开发者的工作习惯。遇到问题,许多人可能首先想到的是“问 AI”,而不是去 Stack Overflow 搜索或提问。这对依赖 SO 数据的 RedMonk 排行榜方法论构成了前所未有的挑战。Stephen O’Grady 的坦诚,也预示着未来编程语言趋势的观察方法可能需要革新。

在这样的背景下,Go 语言的机遇何在?

  1. GitHub 数据权重可能提升: 如果 SO 数据权重下降或被弃用,那么更能反映语言实际使用和生态发展的 GitHub 数据将变得更加重要。Go 在这方面一直表现强劲,拥有大量高质量的开源项目和活跃的贡献者。
  2. AI 基础设施的构建者: 正如我在之前的文章中多次提到的,Go 语言凭借其高性能、高并发、易部署的特性,非常适合构建支撑 AI 大模型训练、推理服务的底层基础设施(如分布式计算框架、模型服务平台、向量数据库、数据管道等)。许多流行的 AI 开源项目(如 Ollama)也选择使用 Go。
  3. AI 应用的工程化落地: AI 模型最终需要被集成到实际的应用和服务中才能产生价值。Go 的简洁性、强大的网络库、以及出色的工程化特性(如编译速度、静态部署),使其成为将 AI 模型快速、可靠地工程化、产品化的优秀选择。
  4. “工具的工具”: Go 在构建开发工具方面的优势,在 AI 时代将更加凸显。无论是构建 AI 代码分析工具、模型部署工具,还是 AI 辅助开发平台的后端,Go 都能胜任。
  5. 对 LLM 的“友好性”探索: 虽然目前 Go 在 LLM 训练数据中的占比可能不如 Python,但 Go 语言相对简单的语法、明确的类型系统、以及强大的标准库,是否可能在未来使其更容易被 LLM 理解、分析和生成高质量代码?这是一个值得探索的方向。

小结:喧嚣之中,坚守价值,拥抱未来

RedMonk 的最新编程语言排行榜,在 AI 席卷技术圈的当下,给我们带来了新的思考。Stack Overflow 讨论热度的“失真”,或许只是 AI 改变我们工作和学习方式的一个缩影。

对于 Go 语言而言,其在榜单中的稳定表现,特别是在 GitHub 维度上的持续强势,证明了其深厚的开发者基础和旺盛的生态活力。像微软选择用 Go 重写 TypeScript 工具链这样的行业案例,更是对其核心竞争力的有力印证。

面对 AI 带来的不确定性,Go 语言凭借其在构建高性能网络服务、云原生基础设施、以及高效开发工具等领域的明确价值定位,依然展现出强大的韧性和广阔的前景。未来,它不仅将继续作为这些领域的中流砥柱,更有望在 AI 基础设施和工程化领域扮演越来越重要的角色。

作为 Gopher,我们既要看到排行榜数据的变化,更要理解变化背后的深层逻辑。坚守 Go 语言的核心价值,持续学习和实践,同时对新技术保持开放和探索的心态,这或许才是我们在这个快速变化的时代中,最稳妥的前行之道。

你对这份 RedMonk 榜单有什么看法?AI 的出现改变了你获取技术信息的习惯吗?欢迎在评论区分享你的观点!


精进有道,更上层楼

极客时间《Go语言进阶课》上架刚好一个月,受到了各位读者的热烈欢迎和反馈。在这里感谢大家的支持。目前我们已经完成了课程模块一『语法强化篇』的 13 讲,为你系统突破 Go 语言的语法认知瓶颈,打下坚实基础。

现在,我们已经进入模块二『设计先行篇』,这不仅包括 API 设计,更涵盖了项目布局、包设计、并发设计、接口设计、错误处理设计等构建高质量 Go 代码的关键要素。

这门进阶课程,是我多年 Go 实战经验和深度思考的结晶,旨在帮助你突破瓶颈,从“会用 Go”迈向“精通 Go”,真正驾驭 Go 语言,编写出更优雅、
更高效、更可靠的生产级代码!

扫描下方二维码,立即开启你的 Go 语言进阶之旅!

感谢阅读!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats