详解 Kubernetes StatefulSet 实现原理

在 Kubernetes 的世界中,Deployment 和 ReplicaSet 主要用于处理无状态的服务,无状态服务的需求往往非常简单并且轻量,每一个无状态节点存储的数据在重启之后就会被删除,虽然这种服务虽然常见,但是我们仍然需要有状态的服务来实现一些特殊的需求,StatefulSet 就是 Kubernetes 为了运行有状态服务引入的资源,例如 Zookeeper、Kafka 等。这篇文章会介绍 Kubernetes 如何在集群中运行有状态服务,同时会分析这些有状态服务 StatefulSet 的同步过程以及实现原理。 »

详解 Kubernetes Deployment 的实现原理

如果你在生产环境中使用过 Kubernetes,那么相信你对 Deployment 一定不会陌生,Deployment 提供了一种对 Pod 和 ReplicaSet 的管理方式,每一个 Deployment 都对应集群中的一次部署,是非常常见的 Kubernetes 对象。我们在这篇文章中就会介绍 Deployment 的实现原理,包括它是如何处理 Pod 的滚动更新、回滚以及支持副本的水平扩容。 »

Go 语言数组和切片的原理

数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是非常重要的,除了数组之外,Go 语言引入了另一个概念 — 切片,切片与数组有一些类似,但是它们的不同之处导致使用上会产生巨大的差别。这里我们将从 Go 语言编译期间的工作和运行时来介绍数组以及切片的底层实现原理,其中会包括数组的初始化以及访问、切片的结构和常见的基本操作。 »

详解 Kubernetes 垃圾收集器的实现原理

垃圾收集器在 Kubernetes 中的作用就是删除之前有所有者但是现在所有者已经不存在的对象,例如删除 ReplicaSet 时会删除它依赖的 Pod,虽然它的名字是垃圾收集器,但是它在 Kubernetes 中还是以控制器的形式进行设计和实现的。在 Kubernetes 引入垃圾收集器之前,所有的级联删除逻辑都是在客户端完成的,kubectl 会先删除 ReplicaSet 持有的 Pod 再删除 ReplicaSet,但是垃圾收集器的引入就让级联删除的实现移到了服务端,我们在这里就会介绍垃圾收集器的设计和实现原理。 »

详解 Kubernetes ReplicaSet 的实现原理

Kubernetes 中的 ReplicaSet 主要的作用是维持一组 Pod 副本的运行,它的主要作用就是保证一定数量的 Pod 能够在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障重启数量减少时重新运行新的 Pod 副本。这篇文章会介绍 ReplicaSet 的工作原理,其中包括在 Kubernetes 中是如何被创建的、如何创建并持有 Pod 并在出现问题时重启它们。 »

Elixir 从入门到放弃

过去将近一年的时间里,作者在日常工作中需要经常与 Elixir 这门编程语言打交道,在使用 Elixir 的过程中,发现这门编程语言有很多非常有趣的概念和设计,但是也遇到了更多很难甚至无法解决的问题,最终种种原因最终选择使用 Golang 替换掉生产环境中全部的 Elixir 项目,随着作者将主要编程语言逐渐迁移到 Go,觉得还是有必要对 Elixir 比较独特的语言谈一谈作者的经历和看法。我们将在这篇文章中为各位读者介绍 Elixir 这门编程语言、作者和它相处的体验和经历、最终为什么选择放弃这门编程语言以及不推荐各位工程师在生产环境中使用的原因。 »

指令集架构、机器码与 Go 语言

Go 语言编译的最后一个阶段就是根据 SSA 中间代码生成机器码了,这里谈的机器码生成就是在目标 CPU 架构上能够运行的代码,中间代码生成一节简单介绍的从抽象语法树到 SSA 中间代码的处理过程,处理 SSA 的将近 50 个步骤中有一些过程严格上来说其实是属于机器码生成阶段的。这一节将介绍 Go 编译器将 SSA 中间代码转换成汇编语言和机器码的过程,除此之外也会介绍指令集架构以及硬件相关的一些知识。 »

详解 Golang 中间代码生成

中间代码是一种应用于抽象机器的编程语言,它设计的目的主要是帮助我们分析计算机程序,在编译的过程中,编译器会在将语言的源代码转换成目标机器上机器码的过程中,先把源代码转换成一种中间的表述形式,这里要介绍的就是 Go 语言如何将抽象语法树转换成 SSA 表示的中间代码。 »

Golang 如何进行类型检查

我们在上一节中介绍了 Golang 的第一个编译阶段 — 通过词法和语法分析器的解析得到了抽象语法树,在这里就会继续介绍编译器执行的下一个过程 — 类型检查。Go 语言的编译器使用静态类型检查来保证程序运行的类型安全,当然它也会在编程期引入类型信息,让工程师能够使用反射来判断参数和变量的类型,在这一节中我们还是会重点介绍编译期间的静态类型检查。 »

解析器眼中的 Go 语言

我们在这一节中将介绍词法分析和语法分析这两个非常重要的编译过程,这两个过程的主要作用就是将原本机器看来无序并且不容易理解的源文件转换成机器非常容易理解和分析的抽象语法树,接下来我们就看一看解析器眼中的 Go 语言是什么样的。源代码文件在编译器的眼中其实就是一团乱麻,一个由『无实际意义』字符组成的、无法被理解的字符串,所有的字符在编译器看来并没有什么区别,为了理解这些字符我们需要做的第一件事情就是将字符串分组,这样能够降低理解字符串的成本,简化分析源代码的过程。 »

Go 语言编译过程概述

Golang 是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解 Go 语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。这一节会先对 Go 语言编译的过程进行概述,从顶层介绍编译器执行的几个步骤,随后的章节会分别剖析各个步骤完成的工作和实现原理,同时也会对一些需要预先掌握的知识进行介绍和准备,确保后面的章节能够被更好的理解。 »

2018 年总结 · 初窥门径

一转眼 2018 年就过去了,回想了一下今年确实做了非常多的事情,从零搭建交易所服务到负责基础架构以及微服务治理,整个 2018 年也是作者服务端技术逐渐成熟的一年,对于未来的职业规划和方向也变得越来越清晰,到了年末的时候也确实开始回忆和反思这一年个人到底有哪些提升和进步以及有哪些地方能够做得更好。 »

理解 Golang 中函数调用的原理

函数是 Go 语言中的一等公民,理解和掌握函数的调用过程是深入学习 Golang 时无法跳过的步骤,这里会介绍 Go 语言中函数调用的过程和实现原理并与 C 语言中函数执行的过程进行对比,同时对参数传递的过程进行剖析,让读者能够清楚地知道 Go 在函数的执行过程中究竟都做了哪些工作。本文将从函数的调用惯例和参数的传递方法两个方面分别介绍函数的执行过程。 »

详解 Kubernetes Volume 的实现原理

在 Kubernetes 集群中,虽然无状态的服务非常常见,但是在实际的生产中仍然会需要在集群中部署一些有状态的节点,比如一些存储中间件、消息队列等等。作为 Kubernetes 集群中除了 Pod 和 Service 之外最常见的基本对象,Volume 不仅能够解决 Container 中文件的临时性问题,也能够让同一个 Pod 中的多个 Container 共享文件。这篇文章并不会介绍 Kubernetes 中 Volume 的使用方法和 API,而是会着重介绍 Volume 的工作原理,包含其创建过程、多种 Volume 实现的异同以及如何与云服务提供商进行适配。 »

详解 Kubernetes Service 的实现原理

每一个 Kubernetes 的 Service 都是一组 Pod 的逻辑集合和访问方式的抽象,我也可以把 Service 加上的一组 Pod 称作是一个微服务。在这篇文章中,我们将分两个部分介绍 Kubernetes 中 Service 的实现原理,在第一部分我们将介绍 Kubernetes 如何处理服务的创建,第二部分会介绍它是如何转发来自节点内部和外部的流量。 »