blog |

etcd go 语言 v2 客户端开发介绍

etcd 介绍很久之前写过一篇 etcd 的介绍文章,主要是讲 etcd 的概念和使用方式,这篇文章介绍如何使用 go 语言进行 etcd 的开发工作。 etcd 目前最新版 API 是 v3 版本,之前被广泛使用的 API 为 v2 版本。这篇文章会介绍 v2 版本 go 语言客户端的使用,涉及了最常见的增删查改和监听操作。 v2 版本使用之前的文章 已经对 etcd v2 版本的概念和 API 介绍得很详细了,这里再总结一下。 作为分布式的键值存储,etcd v2 存储 ...

  • Cizixs Wu
    Cizixs Wu
14 min read
blog |

OCI 和 runc:容器标准化和 docker

OCI 和容器标准容器技术随着 docker 的出现炙手可热,所有的技术公司都积极拥抱容器,促进了 docker 容器的繁荣发展。容器一词虽然口口相传,但却没有统一的定义,这不仅是个技术概念的问题,也给整个社区带来一个阴影:容器技术的标准到底是什么?由谁来决定? 很多人可能觉得 docker 已经成为了容器的事实标准,那我们以它作为标准问题就解决了。事情并没有那么简单,首先是否表示容器完全等同于 docker,不允许存在其他的容器运行时(比如 coreOS 推出的 rkt); ...

  • Cizixs Wu
    Cizixs Wu
46 min read
blog |

使用 tc netem 模拟网络异常

在某些情况下,我们需要模拟网络很差的状态来测试软件能够正常工作,比如网络延迟、丢包、乱序、重复等。linux 系统强大的流量控制工具 tc 能很轻松地完成,tc 命令行是 iproute2 软件包中的软件,可以根据系统版本自行安装。 流量控制是个系统而复杂的话题,tc 能做的事情很多,除了本文介绍的还有带宽控制、优先级控制等等,这些功能是通过类似的模块组件实现的,这篇文章介绍的功能主要是通过 netem 这个组件实现的。netem 是 Network Emulator 的缩写 ...

  • Cizixs Wu
    Cizixs Wu
20 min read
blog |

docker 容器网络方案:calico 网络模型

calico 简介calico 是容器网络的又一种解决方案,和其他虚拟网络最大的不同是,它没有采用 overlay 网络做报文的转发,提供了纯 3 层的网络模型。三层通信模型表示每个容器都通过 IP 直接通信,中间通过路由转发找到对方。在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。 要想路由工作能够正常,每个虚拟路由器(容器所在的主机节点)必须有某种方法知道整个集群的路由信息,calico 采用的是 BGP 路由协议,全称是 Border Gatewa ...

  • Cizixs Wu
    Cizixs Wu
40 min read
blog |

aufs 简介以及在 docker 中的使用

AUFS 简介AUFS 的全称是 Advanced Multi-layered unification filesytem,它的主要功能是:把多个目录结合成一个目录,对外使用。 把多个目录 mount 成一个,那么读写操作是怎样的呢? 默认情况下,最上层的目录为读写层,只能有一个;下面可以有一个或者多个只读层 读文件,打开文件的时候使用了 O_RDONLY 选项:从最上面一个开始往下逐层去找,打开第一个找到的文件,读取其中的内容 写文件,打开文件时用了 O_WRONLY 或 ...

  • Cizixs Wu
    Cizixs Wu
21 min read
blog |

docker 容器基础技术:linux namespace 简介

1. Linux namespace 简介Linux namespace 是一种内核级别的资源隔离机制,用来让运行在同一个操作系统上的进程互相不会干扰。 namespace 目的就是隔离,要做到的效果是:如果某个 namespace 中有进程在里面运行,它们只能看到该 namespace 的信息,无法看到 namespace 以外的东西。我们来想一下:一个进程在运行的时候,它会知道哪些信息? 看到系统的 hostname 可用的网络资源(bridge、interface、网 ...

  • Cizixs Wu
    Cizixs Wu
56 min read
blog |

docker 容器基础技术:linux cgroup 简介

Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)。 2006 的时候,Google 的一些工程师(主要是 Paul Menage 和 Rohit Seth)启动了这个项目,最初的名字叫 process containers。因为 container 在内核中名字有歧义,2007 的时候改名为 contro ...

  • Cizixs Wu
    Cizixs Wu
38 min read
blog |

docker 容器网络下 UDP 协议的一个问题

最近在工作中遇到一个 docker 容器下 UDP 协议网络不通的问题,困扰了很久,也比较有意思,所以想写下来和大家分享。 我们有个应用是 UDP 协议的,部署上去发现无法工作,但是换成 TCP 协议是可以的(应用同时支持 UDP、TCP 协议,切换成 TCP 模式发现一切正常)。虽然换成 TCP 能解决问题,但是我们还是想知道到底 UDP 协议在网络模式下为什么会出现这个问题,以防止后面其他 UDP 应用会有异常。 这个问题抽象出来是这样的:如果有 UDP 服务运行在主机上 ...

  • Cizixs Wu
    Cizixs Wu
22 min read
blog |

使用 docker 对容器资源进行限制

在使用 docker 运行容器时,一台主机上可能会运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。 docker 作为容器的管理者,自然提供了控制容器资源的功能。正如使用内核的 namespace 来做容器之间的隔离,docker 也是通过内核的 cgroups 来做容器的资源限制。这篇文章就介 ...

  • Cizixs Wu
    Cizixs Wu
37 min read
blog |

ARP 协议解析

ARP 协议简介ARP 的全称是 Address Resolution Protocol,直译过来是 地址解析协议。对应的 RFC 文档是 RFC826。它的作用是把 IP 地址转换为 MAC 地址。为什么需要做这件事呢? 这是因为 TCP/IP 网络协议栈是分层的,每层负责不同的功能。IP 层(layer 3)负责路由寻路,换句话说,如果目的机器和客户端不在同一个网络,IP 层会穿过错综复杂的中间网络(互联网)找到目的机器所在的网络。 当报文在某一个网络中传播时(可能源机 ...

  • Cizixs Wu
    Cizixs Wu
22 min read
blog |

【翻译】理解 TCP/IP 网络栈

TL;DR [TOC] 译者注:很久没有翻译文章了,最近在网络看到这篇介绍网络栈的文章非常详细,正好最近在看这方面的内容,索性翻译过来。因为很多文章比较长,而且很多内容比较专业,翻译过程中难免会有错误,如果读者发现错误,还望不吝指出。文章中 Linux 内核源码摘自哪个版本原文并没有表明,我也没有找到对应的版本,代码的缩进可能会有问题。 原文地址: cubrid.org/blog/understanding-tcp-ip-network-stack,有删减。 没有 TCP/I ...

  • Cizixs Wu
    Cizixs Wu
67 min read
blog |

kubelet scheduler 源码分析:调度器的工作原理

TL;DR 1. kubernetes Scheduler 简介kubernetes Scheduler 运行在 master 节点,它的核心功能是监听 apiserver 来获取 PodSpec.NodeName 为空的 pod,然后为每个这样的 pod 创建一个 binding 指示 pod 应该调度到哪个节点上。 从哪里读取还没有调度的 pod 呢?当然是 apiserver。怎么知道 pod 没有调度呢?我们在 介绍 APIServer 的文章讲到,可以通过 spec ...

  • Cizixs Wu
    Cizixs Wu
81 min read
blog |

kubelet 源码分析: 事件处理

前几篇源码分析的文章介绍了 kubelet 提供的各种功能,这篇文章继续介绍 kubelet 的源码部分:事件机制。事件并不是 kubelet 对外提供的功能,但是对于 kubernetes 系统却非常重要。 kubelet 事件机制我们知道 kubernetes 是分布式的架构,apiserver 是整个集群的交互中心,客户端主要和它打交道,kubelet 是各个节点上的 worker,负责执行具体的任务。对于用户来说,每次创建资源的时候,除了看到它的最终状态(一般是运行态 ...

  • Cizixs Wu
    Cizixs Wu
40 min read
blog |

kubernetes 权限管理

kubernetes 主要通过 APIServer 对外提供服务,对于这样的系统集群来说,请求访问的安全性是非常重要的考虑因素。如果不对请求加以限制,那么会导致请求被滥用,甚至被黑客攻击。 kubernetes 对于访问 API 来说提供了两个步骤的安全措施:认证和授权。认证解决用户是谁的问题,授权解决用户能做什么的问题。通过合理的权限管理,能够保证系统的安全可靠。 下图是 API 访问要经过的三个步骤,前面两个是认证和授权,第三个是 Admission Control,它也 ...

  • Cizixs Wu
    Cizixs Wu
24 min read
blog |

kubelet 源码分析:statusManager 和 probeManager

简介在 kubelet 初始化的时候,会创建 statusManager 和 probeManager,两者都和 pod 的状态有关系,因此我们放到一起来讲解。 statusManager 负责维护状态信息,并把 pod 状态更新到 apiserver,但是它并不负责监控 pod 状态的变化,而是提供对应的接口供其他组件调用,比如 probeManager。probeManager 会定时去监控 pod 中容器的健康状况,一旦发现状态发生变化,就调用 statusManage ...

  • Cizixs Wu
    Cizixs Wu
23 min read
blog |

kubelet 源码分析:Garbage Collect

kubernetes GC 简介作为 kubernetes 中重要的组件,kubelet 接管了节点上容器相关的所有工作。除了最核心的任务:根据 apiserver 分配的 pod 创建容器之外,它还有其他很多事情要做,其中之一就是 GC(Garbage Collect)。 在运行一段时候之后,节点上会下载很多镜像,也会有很多因为各种原因退出的容器。为了保证节点能够正常运行,kubelet 要防止镜像太多占满磁盘空间,也要防止退出的容器太多导致系统运行缓慢或者出现错误。 GC ...

  • Cizixs Wu
    Cizixs Wu
34 min read
blog |

kubelet 源码分析:pod 新建流程

在上一篇文章中,我们分析了 kubelet 是怎么从命令行进行解析参数、怎么根据配置初始化各种对象、以及最终怎么创建出来 Kubelet并运行的。这篇文章我们就接着分析,当有新的 pod 分配到该节点的时候,kubelet 是怎么处理的。 syncLoopsyncLoop 是 kubelet 的主循环方法,它从不同的管道(文件、URL 和 apiserver)监听变化,并把它们汇聚起来。当有新的变化发生时,它会调用对应的处理函数,保证 pod 处于期望的状态。如果 pod 没 ...

  • Cizixs Wu
    Cizixs Wu
35 min read
blog |

kubelet 源码分析:启动流程

kubelet 简介我在之前的文章介绍过 kubelet 的功能,简言之,kubelet 保证它所在节点的 pod 能够正常工作。它的核心工作是监听 apiserver,一旦发现当前节点的 pod 配置发生变化,就根据最新的配置执行响应的动作,保证运行的 pod 状态和期望的一致。 kubelet 除了这个最核心的功能之外,还有很多其他特性: 定时汇报当前节点的状态给 apiserver,以供调度的时候使用 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不 ...

  • Cizixs Wu
    Cizixs Wu
52 min read
blog |

CNI:容器网络接口

CNI 简介不管是 docker 还是 kubernetes,在网络方面目前都没有一个完美的、终极的、普适性的解决方案,不同的用户和企业因为各种原因会使用不同的网络方案。目前存在网络方案 flannel、calico、openvswitch、weave、ipvlan等,而且以后一定会有其他的网络方案,这些方案接口和使用方法都不相同,而不同的容器平台都需要网络功能,它们之间的适配如果没有统一的标准,会有很大的工作量和重复劳动。 CNI 就是这样一个标准,它旨在为容器平台提供网络 ...

  • Cizixs Wu
    Cizixs Wu
8 min read
blog |

kubernetes 亲和性调度

kubernetes pod 调度简介除了让 kubernetes 集群调度器自动为 pod 资源选择某个节点(默认调度考虑的是资源足够,并且 load 尽量平均),有些情况我们希望能更多地控制 pod 应该如何调度。比如,集群中有些机器的配置更好( SSD,更好的内存等),我们希望比较核心的服务(比如说数据库)运行在上面;或者某两个服务的网络传输很频繁,我们希望它们最好在同一台机器上,或者同一个机房。 这种调度在 kubernetes 中分为两类:node affinity ...

  • Cizixs Wu
    Cizixs Wu
14 min read