# 云计算

# 简介

  • 云计算(Cloud Computing)是 21 世纪兴起的一种计算机使用模式。
    • 特点:
      • 网络服务:用户自己不持有计算机,而是通过网络,使用某些公司提供的计算机。这些公司统称为云计算公司。
      • 按需计费:云计算公司通常将计算机租给大量用户,按小时或按月计费,而不是买断制。
      • 虚拟化:云计算公司通常不直接提供计算机裸机,而是通过 Hypervisor 技术提供不同规格的虚拟计算机,从而满足用户的不同需求。例如 1vCPU+1G 内存的小机型,64vCPU+128G 内存的大机型。
      • 云计算公司除了提供计算机,通常还提供数据库、CDN 等多种类型的产品服务,统称为云服务。
      • 云计算公司内部,通常使用 OpenStack 平台或自研平台来管理大量云服务,统称为云平台。一个云计算公司可能拥有多个云平台。
      • 云计算公司对外,通常提供一个 Web 网站,供用户在上面选购云服务。
    • 例:
      • 按传统模式,如果用户想部署一个 Web 网站,则需要自己购买服务器裸机,然后安装操作系统、Web 软件。
      • 按云计算模式,用户可以在云平台上租一台服务器,然后安装 Web 软件。甚至可以不用服务器,通过 FaaS 模式部署 Web 网站。
    • 优点:
      • 用户不必买断计算机等设备,可按需计费,适合短时需求。
      • 用户不必自建机房,节省了场地、电力、维护等大量成本。
      • 云平台通常在世界多个位置搭建了机房,允许用户在这些机房租用服务器,方便用户部署国际性的 Web 服务。
    • 缺点:
      • 长时间租用云服务,可能成本比自建机房还高。

# 云服务

云平台可能提供很多种云服务,按自动化程度分为几类:

  • IaaS
    • :基础设施即服务(Infrastructure as a Service),云平台只提供一些基础设施,比如服务器裸机、虚拟服务器、VPC 。
  • PaaS
    • :平台即服务(Platform as a Service),提供一个平台,用户在上面编写代码,然后平台会自动构建、部署、监控,并提供数据库等依赖软件。
    • 例如 GitHub 平台允许用户编写代码,然后由 GitHub Actions 自动构建、部署,属于功能较少的 PaaS 产品。
  • SaaS
    • :软件即服务(Software as a Service),云平台提供一些软件供用户使用,例如已部署的 MySQL、Redis 。
    • 优点:
      • 用户不必亲自部署、运维这些软件,节省了学习成本、人力。
    • 缺点:
      • 成本更高,不如用户亲自创建服务器、部署软件。
      • 通常只允许用户访问这些软件的 TCP/UDP 端口,不允许用户修改这些软件的部署配置。
    • SaaS 比 PaaS 的自动化程度更高,不过通常都会使用。例如用 PaaS 模式开发业务程序,调用 SaaS 模式的数据库。
  • BaaS
    • :后端即服务(Backend as a Service),云平台提供一些常用的后端服务,比如身份认证、消息通知,不必用户编写这些后端代码。
  • FaaS
    • :函数即服务(Function as a Service),与 PaaS 相似,但用户可以只编写一个函数的代码,不必编写整个程序的代码。
    • 例如云平台提供一个部署在容器中的 Flask 模板项目,用户在其中增加一个函数的代码,即可增加一个 HTTP API 。
    • 与 PaaS 相比,FaaS 偏向单个 API ,粒度更小,更灵活,但只能满足 HTTP API 等少量需求。

# 云平台

# 分类

租用云服务的用户,可能是一个人,也可能是一个公司。

  • 一个公司内可能有多个人需要使用云服务,通常这样划分权限:
    • 首先创建一个主账号,负责付费,并担任管理员。
    • 主账号之下可以创建多个子账号,权限较小,分配给不同员工使用。
    • 主账号及其子账号,属于同一个租户(tenant)。
    • 云平台通常支持创建 APIKEY 类型的子账号,不供人类使用,而是供程序调用云平台的 API 。

按租户数量,将云平台分为几类:

  • 公共云(Public Cloud)
    • :多个租户共用一个云平台。
    • 缺点:不同租户使用的云服务,在逻辑上、网络上进行了隔离,但可能共用同一台物理服务器,可能相互影响。不过大客户也可申请专用服务器。
  • 私有云(Private Cloud)
    • :单个租户独享一个云平台。
    • 缺点:通常比公有云的功能少,软件版本也不会及时更新。
    • 例:
      • 公司 A 原本有一个自建机房,按传统模式使用。然后搭建云平台,改造为云计算模式,就算一个私有云。
      • 公司 A 搭建一个云平台(可以位于自建机房、其它公司的机房),给自己使用,这属于私有云。
      • 公司 A 搭建一个云平台,卖给公司 B 单独使用,这属于公司 B 的私有云,只是由公司 A 托管。
      • 公司 A 搭建一个云平台,卖给多个公司共用,这属于公有云。
  • 混合云(Hybrid Cloud)
    • :指单个租户,混合使用一个私有云(通常是自建机房)和一个公有云。
    • 例:
      • 公司 A 正在将自建机房中的服务,迁移部署到公有云,所以暂时处于混合云模式。
      • 公司 A 将大部分服务部署在公有云,但一些私密数据必须存储在私有云,所以长期处于混合云模式。
    • 缺点:同一个云内的服务,通常采用内网通信,而跨云通信只能采用公网,成本高、速度低。
  • 多云(Multicloud)
    • :指单个租户混合使用多个云平台。
    • 例:
      • 公司 A 追求更高的服务可用性,于是在多个云平台上部署了服务。当一个云平台故障时,其它云平台依然能工作。
      • 公司 A 追求更高的性价比,于是同时使用多个云平台。哪个云平台打折促销、性价比更高,就暂时将服务部署在那里。
    • 缺点:为了将服务迁移部署到不同云平台,需要对每个云平台解耦,只使用 VPS 等通用的云服务。

公有云举例:

  • 亚马逊云(Amazon Web Services,AWS)
    • AWS 公司是 Amazon 的子公司。2006 年,AWS 公司推出云服务 S3、EC2 ,开启了云计算时代,此后世界上出现了许多云计算公司。
    • 2022 年,全球市场份额最大的公有云依次是 AWS、Azure、GCP 。
  • 微软云(Azure)
    • 优点:适配微软公司的产品,比如 Windows 系统、Office 软件、.net 语言。
    • 缺点:Web UI 简陋,不方便用户使用。
  • 谷歌云(Google Cloud Platform,GCP)
  • 阿里云(Alibaba Cloud)
    • 公司成立于 2009 年,是中国最早成立的公有云,占据的中国市场份额最大。
  • 腾讯云(Tencent Cloud)
  • 华为云(Huawei Cloud)

# 原理

  • OpenStack

    • :一个开源的云平台框架,采用 Python 语言开发,常用于搭建云平台并管理 CVM 等资源,提供 IaaS 服务。
    • OpenStack 只是一个框架,用户需要自行实现计算、存储、网络等组件。例如存储后端通常采用 Ceph 。
  • VPS(Virtual Private Server ,虚拟专用服务器)

    • :又称为 CVM(Cloud Virtual Machine ,云虚拟机)、ECS(Elastic Compute Service ,弹性计算服务器)。
    • 云平台通常在物理服务器上通过 Hypervisor 技术创建多个虚拟服务器,分配给多个租户使用。每个租户单独使用一组虚拟服务器,在逻辑上、网络上进行了隔离。
  • VPC(Virtual Private Cloud ,虚拟私有云)

    • :云平台在 IaaS 层创建的一种逻辑网络分区,包含一组子网。
    • 一个租户可在一个公有云中创建多个 VPC 。
      • 一个 VPC 中可以划分多个子网,这些子网属于同一个内网,没有网络隔离,但可以通过防火墙阻断流量。
      • 不同 VPC 之间默认网络隔离,但允许连通网络,比如添加路由规则。
    • VPC 本质上是一层虚拟网络,只能模拟 OSI 网络层及以上的功能,不能模拟数据链路层、物理层的大部分功能,在这方面不如物理机房。
      • 公有云平台一般不支持传播 ARP、BGP 消息。用户需要调用公有云的 API ,才能分配自定义 IP 、修改路由规则。
      • 有的云平台将所有 VPS 的 IP 地址,在数据链路层都解析到网关的 Mac 地址,由网关转发流量。
  • VDC(Virtual Data Center ,虚拟数据中心)

    • :云平台在 IaaS 层创建的一种大型逻辑分区,包含一组 VPC、CPU、内存、硬盘等资源。
  • 安全组(Security Group)

    • :类似于主机防火墙规则,用于过滤出、入方向的网络流量。但安全组不位于某个主机上,而是在主机外部生效。因此流量需要先经过安全组过滤,然后才到达主机,被主机防火墙过滤。
    • 一个安全组可以作用于多个 VPS 。一个 VPS 可以绑定多个安全组。

# AWS

这里以 AWS 为例,介绍公有云的用法。

# EC2

  • AWS 提供的 VPS 产品称为 EC2 ,有多种托管模式:

    • 共享实例(Shared Instance)
      • :提供一台虚拟服务器,专供一个租户使用。但不同租户的虚拟服务器,可能共用一个物理服务器,可能相互影响。
      • AWS 提供的 EC2 默认为共享实例,如果租户想改为专用实例、专用主机,则需要加钱。
    • 专用实例(Dedicated Instance)
      • :提供一台虚拟服务器,专供一个租户使用。并且保证一个租户的所有专用实例,不会与其它租户共用一个物理服务器。
    • 专用主机(Dedicated Host)
      • :提供一台物理服务器,专供一个租户使用。
  • AWS 提供的 EC2 有多种付费模式:

    • 按需实例(On-Demand Instance)
      • :AWS 声明每台服务器的每小时单价。租户租用一台服务器之后,按使用的时长计费。
      • 优点:租户可随时增加、减少服务器,适合短期、经常变化的需求。
      • 缺点:价格高于预留实例、竞价实例。
    • 竞价实例(Spot Instance)
      • :AWS 机房创建了大量 EC2 资源,而租户以共享实例等方式租用的 EC2 有时多、有时少,经常会剩下一些空闲的 EC2 未被租用。于是 AWS 将这些空闲 EC2 以更便宜的价格出租,称为竞价实例。
      • 优点:与按需实例相比,打折 -80% 左右。
      • 缺点:只适合几小时的短期使用,因为 AWS 随时可能终止并回收竞价实例,会提前 2 分钟通知租户。
    • 预留实例(Reserved Instance)
      • :租户承诺长期使用服务器,并预付费 1 或 3 年的费用,从而获得 -40% 至 -70% 的折扣。时间越久,折扣越大。
      • 优点:适合一年以上的长期使用。
      • 缺点:预留实例在购买之后,不能修改机型。如果租户创建可转换的预留实例,则允许修改机型,但折扣较小。
    • Savings Plans
      • 这是 AWS 于 2019 年新增的付费模式,用法如下:
        • 租户打算长时间使用一些 EC2 按需实例,预计每小时费用 n 美元。于是创建 Savings Plans 订单,预付费 1 或 3 年的费用,从而获得 AWS 的大幅折扣。
        • 如果实际每小时费用低于 n 美元,则 AWS 不会退还费用,因为已经预付费了。
        • 如果实际每小时费用超过 n 美元,则超出的部分不享受 Savings Plans 折扣,采用按需实例的价格。
      • 细分为多个付费模式:
        • Compute Savings Plans :租户承诺每小时费用。
        • EC2 Instance Savings Plans :租户承诺每小时费用,并承诺只使用某个 region 、某个系列的 EC2 。这样折扣可能比 Compute Savings Plans 更低。
      • 优点:
        • Savings Plans 与预留实例相似,折扣差不多,但更灵活,因此可取代预留实例。
        • Savings Plans 只要租户消费了就能打折,可修改机型、实例数量。
        • Savings Plans 可以只预付费一个月,但是折扣略低于预付费 1 年。
  • AWS 提供的 EC2 服务器有几百种机型,主要分为几类:

    • 通用型(General Purpose)
      • 主要是 m 系列、t 系列。
    • 计算优化型(Compute Optimized)
      • :主机的 CPU 核数更多、性能更高。
      • 主要是 c 系列。
    • 内存优化型(Memory Optimized)
      • :主机的内存容量更大。
      • 主要是 r 系列。
    • 存储优化型(Storage Optimized)
      • :主机的磁盘 IOPS 速度更快、延迟更低。
      • 主要是 i 系列。
    • GPU 型
      • :主机加装了 GPU 显卡。
      • 主要是 g 系列。
  • 参考:

  • 例如 r6a.2xlarge 机型,名称含义如下:

    • 第 1 位表示该机型属于 r 系列。
    • 第 2 位表示该机型是 r 系列的第 6 代。
    • 第 3 位表示 CPU 类型。取值 a 表示 AMD CPU ,取值 i 表示 Inter CPU ,取值 g 表示 AWS Graviton CPU (采用 ARM 架构)。
    • 小数点后的字符串表示机型的规格。例如 small、medium、large 。

# EBS

  • EBS :弹性块存储(Elastic Block Store),是 AWS 提供的虚拟硬盘设备,可挂载到 EC2 主机上。
  • EBS 分为几类:
    • General Purpose SSD
      • :通用型 SSD 硬盘。
      • 例如 gp2、gp3 ,其中 gp3 更便宜。
      • AWS 规定 EC2 的系统盘必须是 SSD ,数据盘可以是 SSD 或 HDD 。
    • Provisioned IOPS SSD
      • :在创建 SSD 硬盘时,允许指定更高的 IOPS 速度。
      • 例如 io1、io2 。
    • Throughput Optimized HDD
      • :吞吐量优化型 HDD 硬盘。
      • 例如 st1 ,IOPS 较低,价格较低。
    • Cold HDD
      • 例如 sc1 ,比 st1 的 IOPS 更低,价格更低,适合存储冷数据。
    • Magnetic volume
      • :磁性介质,通常是磁带。
      • IOPS 最低,价格最低。

# VPC

  • 租户初次创建 EC2 时,需要先创建 VPC 。步骤如下:

    1. 选择一个地域(region),比如巴黎、新加坡。之后购买的云服务,都会位于该地域的机房。
    2. 在上述 region 创建一个 VPC ,并配置其的内网 CIDR ,比如 10.1.0.0/16
    3. 在上述 VPC 创建一个子网,并配置其内网 CIDR 。
    4. 创建一个 EC2 主机,位于上述子网,自动分配一个该子网 CIDR 中的内网 IP 。
  • EC2 默认只支持内网通信,可通过以下方式访问公网:

    • 创建一个 igw ,绑定到一个 VPC 。然后编辑子网的路由表,将发向 0.0.0.0/0 的流量默认路由到 igw 。最后给该子网的每个 EC2 绑定一个公网 IP ,使得该主机能访问公网,也能被公网访问。
      • 云平台提供的公网 IP 通常能随时解绑、绑定到任意 EC2 ,因此称为弹性公网 IP 。
    • 创建一个仅出口网关,让 EC2 通过 IPv6 地址访问公网,不允许被公网访问。
      • 互联网网关支持 IPv4、IPv6 协议。
      • 仅出口网关只支持 IPv6 协议。
      • NAT 网关只支持 IPv4 协议。
    • 创建一个 NAT 网关,绑定一个公网 IP 。然后添加 SNAT 规则:让某个子网内的所有 EC2 都能访问公网,但不能被公网访问。此时流量方向为:EC2 → NAT 网关 → 公网 。
      • NAT 网关可作用于任何子网,包括私有子网、公网子网。
      • 用户可修改多个子网的路由表,将它们发向 0.0.0.0/0 的流量路由到 NAT 网关。
  • 互联网网关(Internet Gateway,igw)是一个虚拟路由器,负责路由转发 VPC 与公网之间的流量。

    • 如果子网的路由表没有指向 igw ,则该子网与公网隔离,称为私有子网(private subnet)。否则称为公有子网(public subnet),存在被公网入侵的风险。
  • 可通过以下方式,允许 EC2 被公网访问:

    • 给公有子网中的 EC2 绑定一个公网 IP ,使得该主机能访问公网,也能被公网访问。
    • 创建负载均衡器(Load Balancer),在公网监听一个端口,反向代理到 EC2 的子网端口。
  • Load Balancer 分为多种:

    • Application Load Balancer(ALB):工作在 OSI 第七层,监听 HTTP/HTTPS 端口。
    • Network Load Balancer—(NLB):工作在 OSI 第四层,监听 TCP/UDP/TLS 端口。
    • Gateway Load Balancer :按访问次数计费。如果访问次数较少,则费用低于按小时计费。

# 腾讯云

下图是腾讯云的 VPC 网络架构示例:

  • CVM 默认未绑定公网 IP ,因此不能访问公网,也不能被公网访问。
    • 腾讯云不存在互联网网关的概念,只要给 CVM 绑定一个公网 IP ,该主机就能访问公网,也能被公网访问。
  • 可以创建负载均衡(CLB),在公网监听一个端口,反向代理到 CVM 的子网端口。
  • 可以创建 NAT 网关,然后添加 SNAT 规则:让某个子网内的所有 CVM 都能访问公网。
    • 腾讯云的 NAT 网关还支持端口转发:在公网监听一个 TCP/UDP 端口,反向代理到某个 CVM 的端口。作用与 CLB 类似,只是没有负载均衡的效果。
  • CVM1 与 CVM2 位于同一个 VPC ,默认打通了路由表,能通过内网相互访问。
  • 如果 CVM1 想访问另一个 VPC 内的 CVM ,则需要先通过 "对等连接" 功能将两个 VPC 的网络连通,然后配置两个 VPC 之间的路由表。
  • 给 CVM 绑定公网 IP 时,IP 不收费,网络流量才收费。有两种计费模式:
    • 按带宽计费
      • :限制公网出带宽的最大值,即 CVM 发向公网的流量。
      • 公网入带宽与公网出带宽相等,但至少会分配 10 Mbps ,因为能共享机房的入带宽。
    • 按流量计费
      • :每隔 1 小时,按使用的公网出流量计费,而公网入流量不计费。

# 相关概念

  • Serverless
    • :一种设计模式,又称为无服务器架构。是让软件开发人员专注于代码开发,不必关注如何构建、部署、运维。
    • 例如云计算的 BaaS、FaaS 都属于 Serverless 。
    • 例如微信小程序属于 Serverless ,开发者写好代码之后就可以直接发布。

# 云原生

  • 云原生(Cloud Native)
    • :一种系统架构,旨在充分利用云平台的优势。
    • 比如为了利用 k8s 的优势,要把传统服务改造成容器化部署,最好实现无状态。
    • 特点:
      • 容器化部署
      • 微服务架构
      • 服务网格
      • 不可变基础设施:尽量不修改程序的运行环境,而是根据虚拟机镜像、容器镜像创建运行环境。这样控制运行环境,容易复制、迁移、升级、回滚。
      • 声明式 API :比如用户可通过 YAML 文件声明 k8s 对象的期望状态,k8s 会自动达到期望状态,不需要用户指导过程。
  • CNCF(Cloud Native Computing Foundation,云原生计算基金会)
    • 2015 年,Linux 基金会下属的 CNCF 基金会成立,旨在推动云原生技术的发展。
    • 负责管理 containerd、k8s、CoreDNS、etcd、Prometheus 等项目。