blog | 2017-05-16 linux lsof 命令使用指南 lsof 简介lsof 是 list open files 的简称,正如名字所示,它的作用主要是列出系统中打开的文件。乍看起来,这是个功能非常简单,使用场景不多的命令,不过是 ls 的另一个版本。但是因为 unix 系统的 everything is a file 的哲学,基本上 *nix 系统所有的对象都可以看做对象,再加上这个命令提供的各种参数,使得它其实非常强大,能够轻松地获得很多非常有用的信息,有些用其他工具会非常麻烦。 lsof 可以知道用户和进程操作了哪些文件,也 ...
blog | 2017-04-27 使用 sysdig 进行监控和调试 linux 机器 sysdig 简介sysdig 官网 上对自己的介绍是: Open Source Universal System Visibility With Native Contaier Support. 它的定位是系统监控、分析和排障的工具,其实在 linux 平台上,已经有很多这方面的工具 strace、tcpdump、htop、iftop、lsof、netstat,它们都能用来分析 linux 系统的运行情况,而且还有很多日志、监控工具。为什么还需要 sysdig 呢?在我 ...
blog | 2017-04-11 kubernetes 简介:kube-dns 和服务发现 服务发现kubernetes 提供了 service 的概念可以通过 VIP 访问 pod 提供的服务,但是在使用的时候还有一个问题:怎么知道某个应用的 VIP?比如我们有两个应用,一个 app,一个 是 db,每个应用使用 rc 进行管理,并通过 service 暴露出端口提供服务。app 需要连接到 db 应用,我们只知道 db 应用的名称,但是并不知道它的 VIP 地址。 最简单的办法是从 kubernetes 提供的 API 查询。但这是一个糟糕的做法,首先每个应用都 ...
blog | 2017-04-11 使用 curl 命令分析请求的耗时情况 最近工作中遇到一个问题,某个请求的响应特别慢,因此我就希望有一种方法能够分析到底请求的哪一步耗时比较长,好进一步找到问题的原因。在网络上搜索了一下,发现了一个非常好用的方法,curl 命令就能帮你分析请求的各个部分耗时。 curl 命令提供了 -w 参数,这个参数在 manpage 是这样解释的: -w, --write-out <format> Make curl display information on stdout after a ...
blog | 2017-04-07 kube-proxy 源码解析 kube-proxy 功能简介我们在之前的文章中介绍过 kube-proxy 和 service的工作原理,以及它们的使用方法和功能。我们再来总结一下,kube-proxy 运行在 kubernetes 集群中每个 worker 节点上,负责实现 service 这个概念提供的功能。kube-proxy 会把访问 service VIP 的请求转发到运行的 pods 上,实现负载均衡。 当用户创建 service 的时候,endpointController 会根据 ser ...
blog | 2017-03-30 kubernetes 简介:service 和 kube-proxy 原理 简介在 kubernetes 集群中,网络是非常基础也非常重要的一部分。对于大规模的节点和容器来说,要保证网络的连通性、网络转发的高效,同时能做的 ip 和 port 自动化分配和管理,并让用户用直观简单的方式来访问需要的应用,这是需要复杂且细致设计的。 kubernetes 在这方面下了很大的功夫,它通过 service、dns、ingress 等概念,解决了服务发现、负载均衡的问题,也大大简化了用户的使用和配置。 这篇文章就讲解如何配置 kubernetes 的网络,最终 ...
blog | 2017-03-28 编写 Dockerfile 的最佳实践 简介我之前写过一篇文章介绍 docker 的镜像基本原理和概念,这篇文章是公司内部培训的一个总结文字,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法。 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题: docker 镜像太大。如果你经常使用镜像或者构建镜像,一定会遇到那种很大的镜像,甚至有些能达到 2G 以上 docker 镜像的构建时间过长。每个 build ...
blog | 2017-03-27 kubernetes 简介:controller manager 和自动扩容 controller manager 简介在配置了调度器之后,我们的 kubernetes 集群已经能够实现计算资源(容器或者 pod)自动选择合适的节点去运行,看起来很不错,但是 kubernetes 还提供另外一个很重要的特性——保证特定副本的 pod 在运行。为什么呢? 因为在大规模的集群中,总会出现各种各样想不到的错误,某个运行的 pod 会因为各种问题无法运行(代码有 bug、内存泄漏、磁盘满了、权限问题甚至是宿主机故障),而我们希望 kubernetes 能提供一 ...
blog | 2017-03-22 HTTP 隧道代理原理和实现 HTTP 隧道代理简介在上一篇文章中我们介绍了 HTTP 普通代理的原理和 golang 简单实现,也提到过普通代理的局限,比如无法代理 HTTPS 的报文,此外普通代理也只能代理 HTTP 协议报文,无法支持其他协议的数据转发。当然有问题就有解决方案,对于这些问题 HTTP 可以通过隧道(tunnel)代理来解决。 隧道代理的原因也可以用一句话来总结: 代理服务器和真正的服务器之间建立起 TCP 连接,然后在客户端和真正服务器端进行数据的直接转发。 《HTTP 权威指南 ...
blog | 2017-03-21 HTTP 代理原理和实现 代理的核心功能可以用一句话概括:接受客户端的请求,转发到后端服务器,获得应答之后返回给客户端。下图是 《HTTP 权威指南》一书中给出的图例,可以很清晰地说明这一流程: 代理的功能有很多,事实上整个互联网到处都充斥着代理服务器。如果所有的 HTTP 访问都是客户端和服务器端直接进行的话,我们的网络不仅会变得缓慢,而且性能会大打折扣。 代理服务器根据不同的配置和使用,可能会有不同的功能,这些功能主要包括: 内容过滤:代理可以根据一定的规则限制某些请求的连接。比如有些公司会设 ...
blog | 2017-03-15 容器生态系统简介 很少有技术能够像 docker 这样一出来就收到关注,并在很短的时间里发展壮大,而且几乎所有的技术公司都开始使用或者希望使用。随着 docker 的出现,配置管理、微服务、数据中心自动化、devops 多个领域都重新焕发新机,好像 IT 行业的整个架构都要重新定义一样。 这篇文章我会介绍一下目前(2017年 3月)容器圈子(主要还是 docker) 一些主要的参与者,它们共同组成了繁荣的容器生态圈。 容器引擎容器引擎(Engine)或者容器运行时(Runtime)是容器系统 ...
blog | 2017-03-10 kubernetes 简介:调度器和调度算法 简介scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题: 公平:如何保证每个节点都能被分配资源 资源高效利用:集群所有资源最大化被使用 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作 灵活:允许用户根据自己的需求控制调度的逻辑 sheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName 为空的 pod ...
blog | 2017-03-09 virtualbox 常用网络模式解释和配置 介绍默认情况下,virtualbox 创建的虚拟机网络为 NAT 模式,这样虚拟机就可以通过主机的网络连接到外部网络。如果需要直接访问虚拟机网络,可以通过端口转发机制。 但是除了默认的网络配置,virtualbox 还提供了其他网络选项来实现用户各种各样的需求。创建网络的时候,有两类配置要做: 网卡的硬件类型 网卡的网络模式 virtualbox 每台虚拟机支持多块虚拟网卡,每块网络都可以配置不同的网络模式。 网卡类型virtualbox 支持多种虚拟网卡类型,选择对应的 ...
blog | 2017-03-08 flask 源码解析:session 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session session 简介在解析 session 的实现之前,我们先介绍一下 session 怎么使用。session 可以看做是在不同的请求之间保存数据的方法,因为 HTTP 是无状态的协议,但是 ...
blog | 2017-02-17 linux 网络虚拟化: ipvlan 简介IPVlan 和 macvlan 类似,都是从一个主机接口虚拟出多个虚拟网络接口。一个重要的区别就是所有的虚拟接口都有相同的 macv 地址,而拥有不同的 ip 地址。因为所有的虚拟接口要共享 mac 地址,所有有些需要注意的地方: DHCP 协议分配 ip 的时候一般会用 mac 地址作为机器的标识。这个情况下,客户端动态获取 ip 的时候需要配置唯一的 ClientID 字段,并且 DHCP server 也要正确配置使用该字段作为机器标识,而不是使用 mac 地址 ...
blog | 2017-02-14 linux 网络虚拟化: macvlan macvlan 简介macvlan 是 linux kernel 比较新的特性,可以通过以下方法判断当前系统是否支持: $ modprobe macvlan $ lsmod | grep macvlan macvlan 19046 0 如果第一个命令报错,或者第二个命令没有返回,则说明当前系统不支持 macvlan,需要升级系统或者升级内核。 macvlan 允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 ma ...
blog | 2017-02-10 linux 网络虚拟化: network namespace 简介 network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。这篇文章介绍 network namespace 的基本概念和用法,network namespace 是 linux 内核提供的功能,这篇文章借助 ip 命令来完成各种操作。ip 命令来自于 iproute2 安装包,一般系统会默认安装,如果没有的话,请读者自行安装。 NOTE:ip 命令因为需要修改系 ...
blog | 2017-01-22 flask 源码解析:响应 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session response 简介在 flask 应用中,我们只需要编写 view 函数,并不需要直接和响应(response)打交道,flask 会自动生成响应返回给客户端。 The return v ...
blog | 2017-01-18 flask 源码解析:请求 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session 简介对于物理链路来说,请求只是不同电压信号,它根本不知道也不需要知道请求格式和内容到底是怎样的;对于 TCP 层来说,请求就是传输的数据(二进制的数据流),它只要发送给对应的应用程序就行了;对 ...
blog | 2017-01-13 flask 源码解析:上下文 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session 上下文(application context 和 request context)上下文一直是计算机中难理解的概念,在知乎的一个问题下面有个很通俗易懂的回答: 每一段程序都有很多外部变量。 ...
blog | 2017-01-12 flask 源码解析:路由 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session 构建路由规则一个 web 应用不同的路径会有不同的处理函数,路由就是根据请求的 URL 找到对应处理函数的过程。 在执行查找之前,需要有一个规则列表,它存储了 url 和处理函数的对应关系。最 ...
blog | 2017-01-11 flask 源码解析:应用启动流程 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session WSGI所有的 python web 框架都要遵循 WSGI 协议,如果对 WSGI 不清楚,可以查看我之前的介绍文章。 在这里还是要简单回顾一下 WSGI 的核心概念。 WSGI 中有一个非 ...
blog | 2017-01-10 flask 源码解析:简介 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解析:响应 flask 源码解析:session flask 简介Flask 官网上对它的定位是一个“微” python web 开发框架。 Flask is a micro web development framework for Py ...
blog | 2017-01-09 pxe 自动安装系统流程分析 TL;DR 本文介绍 pxe 安装 linux 系统过程中,每个阶段用到网络协议的作用和它们的数据格式。不会介绍 pxe 安装系统的原理和配置,而是假设读者已经了解这方面的信息(如果不了解的话,可以查看这篇文章: CentOS 6.4 PXE+Kickstart unattended installation operating system,或者网络上其他的教程)。 简介 机器从网络启动,触发 pxe 相关的固件模块发送 DHCP 请求,请求以广播方式向整个网段传播 DH ...
blog | 2017-01-03 让 CPU 告诉你硬盘和网络到底有多慢 简介经常听到有人说磁盘很慢、网络很卡,这都是站在人类的感知维度去表述的,比如拷贝一个文件到硬盘需要几分钟到几十分钟,够我去吃个饭啦;而从网络下载一部电影,有时候需要几个小时,我都可以睡一觉了。 最为我们熟知的关于计算机不同组件速度差异的图表,是下面这种金字塔形式:越往上速度越快,容量越小,而价格越高。这张图只是给了我们一个直观地感觉,并没有对各个速度和性能做出量化的说明和解释。而实际上,不同层级之间的差异要比这张图大的多。这篇文章就让你站在 CPU 的角度看这个世界,说说到底 ...
blog | 2016-12-19 Go 语言 JSON 简介 简介JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,因为易读性、机器容易处理而变得流行。 JSON 语言定义的内容非常简洁,主要分为三种类型:对象(object)、数组(array)和基本类型(value)。基本类型(value)包括: string 字符串,双引号括起来的 unciode 字符序列 number 数字,可以是整数,也可以是浮点数,但是不支持八进制和十六进制表示的数字 true,false 真值和假值,一般对应语 ...
blog | 2016-12-12 跟着 Github 学习 Restful HTTP API 设计 近几年提供 HTTP API 服务的公司越来越多,许多公司都把 API 作为产品重要的一部分,作为服务提供出去。而微服务的兴起,也让企业内部开始重视和频繁使用 HTTP API 。好的 HTTP API 设计容易理解、符合 RFC 标准、提供使用者便利的功能,其中经常被拿来作为教科书典范的当属 Github API。这篇文章就通过 Github API 总结了一些非常好的设计原则,可以作为以后要编写 HTTP API 的参考。 注意:这篇文章只讨论设计原则,不是强制要求(AP ...
blog | 2016-11-22 使用 coreos 运行 docker 的 netns 问题 背景知识docker 把所有的 network namespace 放在 /var/run/docker/netns 目录下面,要进入到 network namespace 有两种方法: 使用 nsenter:nsenter --net=/var/run/docker/netns/<uuid> ip addr ,可以使用 nsenter --net=/var/run/docker/netns/<uuid> sh 进入到该 ns 的 shell 中,后 ...
blog | 2016-11-07 kubernetes 简介:API Server 和 node 简介这篇文章是整个系统的第二篇,上一篇文章讲解了 kubelet 的功能和使用。 在 kubernetes 集群中,API Server 有着非常重要的角色。API Server 负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),是整个 kubernetes 集群的数据中心,所有的交互都是以 API Server 为核心的。简单来说,API Server 提供了一下的功能: 整个集群管理的 API 接口:所有对集群进行的查询和管理 ...
blog | 2016-10-25 kubernetes 简介: kubelet 和 pod 简介kubernetes 是一个分布式的集群管理系统,在每个节点(node)上都要运行一个 worker 对容器进行生命周期的管理,这个 worker 程序就是 kubelet。 简单地说,kubelet 的主要功能就是定时从某个地方获取节点上 pod/container 的期望状态(运行什么容器、运行的副本数量、网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。 集群状态下,kubelet 会从 master 上读取信息,但其实 kubelet 还可以从其他 ...