跬步 On Coding

云原生开发入门

作为一名在云原生领域摸爬滚打了一段时间的开发者,我时常会遇到一些刚接触这个领域的朋友,他们面对 Kubernetes (K8s)、容器这些概念时,常常感到有些迷茫,不知道从何学起。这篇文章,我想结合自己的一些学习体会,为想要入门云原生开发的同学提供一个相对清晰的指引。

我自己并非科班出身,从最初接触软件测试写 Lua 脚本,到后来学习 Python 做后端,再到进入腾讯接触 Golang 和 K8s 相关开发,一路走来也踩了不少坑。云原生技术栈确实庞大,但核心的理念是利用容器、微服务、声明式 API 等方式,去构建更可靠、更具弹性的分布式系统。而 K8s 作为这个生态的核心编排引擎,可以说是我们必须掌握的关键技能。

这篇文章,我会从基础概念聊起,分享几本我学习过程中觉得非常有帮助的书籍,一个不错的社区文章集合,以及两个可以动手实践的代码项目。最后,还会结合实际工作经验,聊聊 K8s 运维实践中一些重要的事情。希望这些能帮助大家在学习云原生的路上少走一些弯路。


一、云原生与 Kubernetes:从基础概念开始

云原生到底是什么?

我理解的云原生(Cloud Native),它不是指某一个具体的技术,更像是一种面向云环境的应用设计、开发和部署的最佳实践集合。它鼓励我们使用像容器、微服务、不可变基础设施、声明式 API 这些技术和方法,目标是让我们的应用能更好地利用云计算的弹性、分布式、自动化等优势。根据 CNCF(云原生计算基金会)的定义,这些是关键要素。简单说,就是让应用为云而生,能在云上运行得更好。

为什么 Kubernetes 这么重要?

容器技术(比如 Docker)解决了环境一致性的问题,但当你有成百上千个容器需要管理时,手动操作就变得不现实了。Kubernetes 就是来解决这个问题的。它是一个开源的容器编排平台,最初由 Google 开发,现在由 CNCF 维护。它可以自动化地完成应用的部署、扩缩容、服务发现、负载均衡、故障恢复等一系列复杂工作。在我看来,掌握 K8s 是进入现代后端开发、特别是平台工程领域的一张重要门票。

我的学习路径建议:

回顾我自己的学习过程,我建议可以按以下步骤来:

  1. 先搞懂容器:理解 Docker 的基本概念,比如镜像(Image)、容器(Container)、Dockerfile,能自己动手构建、运行一个简单的容器化应用。
  2. 再深入 K8s 核心:学习 K8s 的核心组件(比如 Pod、Service、Deployment、StatefulSet、Namespace 等)都是做什么的,它们之间是如何协作的。了解控制平面(Master)和数据平面(Node)的基本工作原理。
  3. 动手实践是关键:理论学习后,一定要动手实践。尝试编写 YAML 文件部署应用,使用 kubectl 与集群交互。然后可以去探索存储(Volumes, PV, PVC)、网络(Ingress, CNI)、配置(ConfigMap, Secret)等更深入的主题。
  4. 理解运维视角:开发的应用最终要跑在生产环境。了解 K8s 集群的监控、日志、告警、排错等运维实践,对于写出更健壮、更易于维护的应用非常有帮助。

接下来,分享一些我在学习过程中用过且觉得不错的资源。

从《软件设计的哲学》谈代码的复杂性与应对

几个月前读完了《软件设计的哲学》这本书,在结合自己多年的工作体会,对于代码的可读性,可维护性有了系统性的体会,然后基于我记录的读书笔记然后经过AI的润色,形成了这篇笔记。希望对你也有所帮助。

读完《软件设计的哲学》,感觉像经历了一次代码的“深度体检”。这本书没有讲解具体的编码技巧,而是从更高的维度帮助我们重新审视代码复杂性的问题,并提出了许多实用的建议。今天,我想结合自己的理解,分享这本书带来的启发。

什么是代码的复杂性?

简单来说,复杂性就是那些让系统难以理解和修改的因素。它不仅仅指代码的行数或逻辑深度,还包括:

  • 难以理解:即便是自己写的代码,过一段时间可能也看不懂,更别提其他人。
  • 修改成本高:一个小改动需要改动多个地方,甚至引发新的问题。
  • 模糊的改动范围:不知道该修改哪些模块才能实现目标,或者不确定修改后是否会引发其他问题。
  • 难以修复的错误:修复一个 bug 可能需要大量时间,还可能引入新的问题。

如何快速上手项目

职业生涯中接手过很多项目了,各种项目都接触过,一个对新人友好的项目一般具备如下特征:

  1. 完备的安装/功能文档
  2. 完备的技术方案,架构设计文档
  3. 合理的分层,清晰的代码目录结构
  4. 可读,可维护性高的代码

但是往往我们会忽略一个一个简单的指引性的文档:Quick Start,这个文档不需要很详细,只需要说明,如何快速上手的过程,具体的步骤链接到对应的文档即可。一般我们会在Quick Start上写明:

  1. 最简安装的步骤
  2. 主流程功能的使用
  3. 开发环境的搭建
  4. 开发注意事项
    1. 包含组件的架构图
    2. 包含代码的分层目录说明

这个文档需要由项目的负责人编写,在后续由项目的新人实践的过程中逐步完善。

当然这都是比较理想的情况,实际情况中,我们可能遇到的项目可能根本就没有文档,然后只有一个代码仓库的情况,那怎么才能快速上手呢?其实还是按照Quick Start的思路,只不过需要自己来摸索来了。

我的2024

今天是2024年的最后一天,我有这一下午的空闲时间,所以就让我来絮絮叨叨的写写我这神奇的2024年吧。

我是龙年出生的,所以2024年是我的本命年,年初的时候,老婆还有姐姐就给我准备了红内裤,红袜子。由于红袜子太过显眼了,所以这一年我的内裤都是红色的,哈哈。本命年,犯太岁,这一年工作上,心态上,都有一些变化,就让我在本命年的最后一天瞎写写吧。

我自己

我是80年代末生人,出生在一个小镇,是标准的小镇做题家。从高中开始基本就不怎么回家了,然后上大学,跑去了云南,双非一本,学的是热能与动力工程。我的同学大都找到了水电厂,火电厂的工作。工作好的去了三峡,一般就去了云南一些比较偏僻的电厂。而我呢毕业就失业了,后来找到一个海南的小电厂。工作2年后,我就来到了深圳,在躺了好几个月后,经一个亲戚的介绍到一个华为的软件外包公司学习做软件测试。

从Pingora到API网关:总结

前言

https://github.com/zhu327/pingisx

经过一个多月的开发,终于完成了使用Rust实现一个API网关的目标,通过这个项目,我基本上把Pingora的核心功能都摸透了,然后也再次加深了对APISIX的理解。总的来说PingSIX基于Pingora实现了APISIX的核心功能,是APISIX功能的一个子集。

开发这个项目本身也是为了学习Rust的使用,在开发的过程中确实也遇到了很多的问题,在ChatGPT的帮助下,这些问题得到了解决,也让我对Rust有了更深刻的理解。下面我通过4个方面来总结一下在这个项目中我的收获。