---
menu: Kubernetes（K8s）
title: Kubernetes——软件定义计算
taxonomy:
    category: docs
---

在详细介绍了容器技术的发展历程和技术特性之后，我们现在正式进入容器编排领域。

容器技术彻底改变了软件的分发方式，它使得软件不再仅仅分发二进制文件，而是直接分发整个虚拟化环境。这种变革使得软件交付更加便捷、精确和可控。而以 Kubernetes 为代表的容器编排工具，则通过软件对分散在世界各地的各种不同硬件配置的物理服务器进行逻辑上的“标准化”和“虚拟化”，进而将跨数据中心甚至跨时区的海量服务器的运维从杂乱无章的状态转变为全局统一协调的状态，让它们百依百顺，如臂指使——容器编排是一种更加优秀的基础设施并发技术。

### Kubernetes 为何会在 2014 年出现

Kubernetes 和 iPhone 出现的原因一样：人类科技的发展恰好到了这个阶段。

Kubernetes 作为软件定义的快速启动、高速伸缩、流量全动态管理的新时代的“虚拟机”技术，它的出现其实是和整个 Web 服务端生态息息相关的，确切地说是 Kernel、硬件和用户需求都发展到了变革的临界点。

### Kernel 的进步

由于 Kernel 中容器能力的进步，一个新时代轻量化的“虚拟机”技术出现了。

容器镜像比虚拟机镜像小很多，这带来了两大优势：快速启动和高速伸缩。

1. 传统虚拟机技术需要每个节点白白浪费 5GB 的磁盘空间，仅仅为了部署 200MB 的后端代码，容器的基础大小可以只有 5MB。
2. 镜像体积的下降，还带来了启动时间的大幅缩短。
3. 传统的服务发现需要应用代码来做，例如 Spring Cloud，而 Kubernetes 在平台层面直接实现了一套服务发现和负载均衡，让一分钟新增数千个节点成为可能。

#### 网络的进化

除了容器技术，Linux 网络的进步其实才是技术突变的真正“奇点”。笔者认为容器编排超越虚拟机靠的并不是所谓的标准化可迁移的运行环境，虚拟机也是标准化可迁移的，Kubernetes 真正在“能力”上超越虚拟机，靠的其实是软件定义的容器网络。

#### 传统虚拟机的时代，几乎只有二层 Overlay 网络可用

AWS 在 2009 年 8 月推出了 VPC 网络，第一次把虚拟机用户的虚拟机在网络层面隔离开来，而阿里云直到 2015 年 7 月才发布了 VPC 网络。在那之前，云服务商的租户都是跑在同一个二层网络下的，这十分的不安全，而且虚拟机之间还容易相互影响。

VPC 就是用 Overlay 网络实现的，而直到今天，这还是云虚拟机最新一代的网络技术。虚拟机网络的发展十分缓慢，很多看起来很普通的二层网络应用至今都无法很好地支持，例如 Keepalived 赖以生存的多播技术。

有了二层 Overlay 网络，不同租户的虚拟机之间终于是实现网络隔离了，而服务发现、负载均衡、全三层网络、Sidecar 等复杂后端架构所需要的特性就只能自己用应用代码来实现了。

#### Linux 生态中网络的巨大进步

从 iptables 到 Open vSwitch，从 Netfilter 到 veth，从 IP in IP 到 VxLAN 再到 BGP 路由，Linux 生态在 21 世纪的前十五年取得了飞跃式的进步，软件定义网络也从软件领域走向了硬件领域——当下主流的硬件网络设备供应商大多数的商品都已经是基于 Linux Kernel 来运行的了，这足以证明 Linux 网络生态的性能、稳定性和可扩展性。

最开始 Docker 上面只有简单的 Overlay 网络，只能在本机的 pod 之间进行标准二层通信，跨节点只能使用端口映射把端口代理出去。后来 k8s 生态带来了 flannel 网络插件，使用 IP in IP 技术让所有 pod 进入了同一个二层网络，可以跨机器通信了。随后有人把把用户态的 IP in IP 改成内核态的 VxLAN 来实现了，进一步提升了网络性能。

在网络基础设施发展的过程中，Istio 横空出世，以边车模式（Sidecar）运行架构改变了半个 Kubernetes 生态，促成了今天服务网格的流行。Sidecar 能够以应用无感知的形式实现熔断、认证、度量、 监控、负载均衡等各种高级功能，成功地将流量全部管理了起来。

再往后，就是 calico 带来了基于 BGP 路由协议的全三层网络，配合 Istio，“流量全动态管理”这个目标终于实现了，分布式后端架构的“完全可观测”畅想终于成为了现实。

#### 用户需求的变化

传统机房托管时代，各家的设备从防火墙、交换机到路由器、存储都是物理隔离的，各家的服务器之间几乎都是在一个大二层网络之中，没有任何的流量管控和高级安全措施，全靠系统里安装的 iptables 防火墙，而 iptables 甚至当初被发明出来都不是为了当防火墙用的。

最近十年，规模暴增的头部互联网公司的服务器数量开始爆炸，必须开发一种软件定义的新时代虚拟机技术了，于是谷歌便把自己内部了多年的 Borg 容器编排工具使用 Go 语言重写以后开源了，而这个开源软件就是 Kubernetes。

而在今天这个云计算时代，中小公司在用惯了云服务之后，也不喜欢运维岗位了，软件工程师逐步取代了运维工程师，以编写代码为手段，承担起了企业服务器的运维工作，K8s 生逢其时，扶摇直上，迅速占领了各种规模的市场，成为了新时代的服务器标准运维环境。

### Kubernetes 使用软件定义一切的哲学

Kubernetes 平台使用软件接口重新定义了什么是 CPU，什么是内存，什么是磁盘，什么是网卡，它直接接管了物理机的全部资源，以软件接口的形式对外暴露资源，这其实是天马行空的架空软件架构对海量服务器运维领域的一次降维打击：Google 善于开发和使用软件，服务器太多管不过来？一样也可以开发软件来解决啊。

#### Kubernetes 相对于虚拟机的优势

Kubernetes 是人类面对暴增的物理服务器和上面数不清的虚拟机的管理难题时想出的一种解决方案，正如设计模式是面向对象编程思想对现实问题的一种妥协。

以 Kubernetes 为代表的容器编排技术，就是一种更容易被软件自动化管理的“虚拟机”，它可以实现虚拟机一样的功能——资源隔离、降低运维复杂度和性能氮泵，而且，它还可以在裸金属环境下快速部署出一个数千台服务器的集群。虽然虚拟化技术研发出了很多像 SR-IOV 一样的硬件直通技术，但无论是物理网卡性能还是虚拟网卡性能，都不如容器技术：五年前笔者在一台非常老的服务器上做过超过一天的压力测试，Docker 的反向代理进程又快又稳，可以实现超过万兆的带宽，并持续 24 小时一个包都不丢。

传统虚拟机镜像巨大、启动缓慢、多个操作系统同时运行带来了资源浪费、迁移缓慢、管理困难，而 Kubernetes 镜像很小，启动迅速，资源损耗低，管理 API 丰富，更是可以轻易实现“单机多实例部署”和“目录共享”，可以轻松管理海量服务器，是新时代的优秀基础架构。

Kubernetes 就是云时代的宿主机虚拟化软件和虚拟机内操作系统的集合体。

### “云原生”迷思

在 Kubernetes 发布的前一年，2013 年，EMC 选择和它的子公司 VMware 以及外部投资者通用电气共同成立了`Pivotal Software, Inc.`公司，这家公司是由 EMC 2012 年收购的 Pivotal Labs 公司一套人马两块牌子摇身一变而来，而这家公司后来成为了云原生第一股，他们致力于“改变世界建造软件的方式”（We are transforming how the world builds software）。

2014 年 6 月，谷歌将其内部使用了数年的容器管理平台 Borg 使用 Go 重写之后开源，命名为 Kubernetes，瞬间成为了当红炸子鸡，不知道是业界苦秦久矣还是觉得谷歌的软件质量更高，随后的一年 Kubernetes 高歌猛进，迅速成为了容器编排领域的事实标准。

2015 年，当时和 Docker 公司合作的并不愉快的红帽调转枪口，迅速和谷歌合作成立了“云原生基金会”即“CNCF 基金会”（Cloud Native Computing Foundation），谷歌为 Kubernetes 发布了 1.0 版，成为了 CNCF 的第一个开源项目。笔者不想再去介绍精彩的容器编排战争，我们只需要知道最终的结果：Kubernetes 生态已经剥离了所有 Docker 专属代码，今天如果你想搭建一个 Kubernetes 集群的话，没有 Docker 的环境才是你的第一选择。Docker 公司的云计算业务早已经倒闭，而面向开发者的业务也变成收取桌面客户端使用费这一种惨淡的营生。

CNCF 成立的这八年来，云原生的定义改过两次，作为学习者我们无需关心今天的云原生到底是什么定义，你只需要知道：Kubernetes 就是云原生，云原生就是 Kubernetes。
