目录

云原生项目初探

云原生项目初探

文章目录

背景

现在云原生越来越重要,成为一个越来越关键的话题,我们大多数人,包括笔者在内对于云原生处于”似懂非懂“的一个状态,最近由于工作需要,也属于自己工作的一项进行梳理。

基本概念

CNCF:即Cloud Native Computing Foundation。中文直接翻译为”云原生计算基金会“为许多增长最快的开源项目(包括Kubernetes、Prometheus和Envoy)提供了供应商中立的组织.

云原生:云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。云原生既包含技术(微服务,敏捷基础设施),也包含管理(DevOps,持续交付,康威定律,重组等),可以说是一系列云技术、企业管理方法的集合

CNCF全景图

https://i-blog.csdnimg.cn/blog_migrate/9a9394cb603aeab525ebfbc73638178f.png 上图可以说囊括了所有云原生的重要项目了,但是对于我们了解学习起来成本有点高,下面列举一下CNCF的毕业项目:

  • 应用定义和开发:数据库 和镜像定义

    • 数据库: TiKV 和 Vitess
    • 镜像定义:HELM
  • 编排和组织:主要包括调度、服务发现、服务代理 和Service Mesh

    • 调度:Kubernates
    • 服务发现: CoreDNS 和 etcd
    • 服务代理:envoy
    • Service Mesh: LINKERD
  • 供给方面:镜像仓库、安全相关

    • 镜像仓库:HARBOR
    • 安全相关:在安全方面主要有 TUF 和 Open Policy Agent
  • 运行时环境:数据存储 & 容器运行时环境

    • 数据存储:Rook
    • 容器运行时环境:ContainerD
  • 可观测分析:监控 & Logging & Traceing

    • 监控:Prometheus
    • Logging:日志记录是使用fluentd
    • Tracing:数据追踪方面是Jaeger

详细解读

由于对于 K8S 、etcd、Prometheus等都是耳熟能详的本次不多做介绍。下面介绍两个个人最感兴趣的议题。

数据库
Vitess: 云原生加强版的Mysql

集MySQL数据库的很多重要特性和NoSQL数据库的可扩展性于一体。其内建拆分分片功能使用户的MySQL数据库集群可以实现无限水平扩展,同时无需为应用添加分片逻辑。

https://i-blog.csdnimg.cn/blog_migrate/4d1f7785de1af20bd2328541db412181.png

  • vtgate: 是一组无状态节点,它们充当用户的前端

  • vtctld: 与集群元数据交互的 服务器

  • etcd: 存储少量元数据的强一致性存储。Vitess 设计者将此组件设计为插件,它在Zookeeper、etcd和Consul之上有实现。

    shared:

  • vttablet:VTTablet 是 Vitess 组件,负责监视本地 MySQL 属于伴生进程 。VTablet 可以终止查询,确保 MySQL 实例健康,对查询实施限制并向

Tikv: 云原生版本的KV存储

是一个分布式事务型的键值数据库,提供了满足 ACID 约束的分布式事务接口,并且通过 Raft 协议保证了多副本数据一致性以及高可用。TiKV 作为 TiDB 的存储层,为用户写入 TiDB 的数据提供了持久化以及读写服务,同时还存储了 TiDB 的统计信息数据。

https://i-blog.csdnimg.cn/blog_migrate/8ba0936fbd910a45f16b24fb28ba468f.png

  • Region: 将数据按照 key 的范围划分成大致相等的切片(下文统称为 Region),每一个切片会有多个副本(通常是 3 个),其中一个副本是 Leader,提供读写服务。
  • Region与RocksDB: 一个Node里面有两个RocksDB 实例:
      1. 数据节点: 一个节点的所有 Region 数据仍然是不加区分地存储于 同一个 RocksDB 实例 上,这样设计的原因是因为随机 I/O 的性能远低于顺序 I/O,所以 TiKV 使用同一个 RocksDB 实例来存储这些数据,以便不同 Region 的 写入可以合并在一次 I/O 中
      1. BinLog信息: 用于 Raft 协议复制所需要的日志则存储于另一个 RocksDB 实例。
  • Region与Raft协议: Raft 协议来维持数据一致性,任何写请求都只能在 Leader 上写入,并且需要写入多数副本后(默认配置为 3 副本,即所有请求必须至少写入两个副本成功)才会返回客户端写入成功
    • 分裂与合并:超过阈值(144m)则分裂, 数据小于阈值则合并
    • Region调度:增加新节点→数据追平→移除老节点
运行时环境
Rook:云原生环境下的存储编排系统

Rook是一款云原生环境下的开源分布式存储编排系统,目前支持 Ceph、NFS、Edegefs、Cassandra、CockroachDB等存储系统。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢复、监控以及资源管理。

https://ilovett.github.io/docs/rook/master/media/rook-architecture.png

  • Rook Operator:rook的大脑,以deployment形式存在

    • 其利用k8s的controller-runtime框架实现了CRD,并进而接受k8s创建资源的请求并创建相关资源(集群,pool,块存储服务,文件存储服务等)。
    • Rook Operate监控存储守护进程,来确保存储集群的健康。
    • 监听Rook Discovers收集到的存储磁盘设备,并创建相应服务(ceph的话就是osd了)。
  • Rook Discover: 以daemonset形式部署在所有的存储机上的,其检测挂接到存储节点上的存储设备。把符合要求的存储设备记录下来,这样Rook Operate感知到以后就可以基于该存储设备创建相应服务了。

  • Rook Agent: 以daemonset形式部署在所有的存储机上的,其处理所有的存储操作,例如挂卸载存储卷以及格式化文件系统等。

ContainerD:从 Docker Daemon 剥离的镜像管理和容器执行技术

https://github.com/containerd/containerd/raw/main/design/architecture.png

Containerd与Docker的关系 :所以containerd是docker的基础组件之一,K8s调用链更短:

  • K8S调用Docker:kubelet → docker shim (在 kubelet 进程中) → dockerd → containerd
  • K8S调用Containerd:kubelet → cri plugin(在 containerd 进程中) → containerd

总结

云原生是一系列技术,也是管理方法的集合。对于技术的同学而言,CNCF的大量优秀的开源项目中,除了很多项目可以在我们实际中复用以外,更重要的是我们从优秀的项目中汲取设计理念和思路,这才是给个人、团队带来更大价值的东西。

备注

标题链接
CNCF
什么是云原生?这回终于有人讲明白了
什么是云原生
云原生的定义
京东如何基于Vitess管理大型MySQL实例集群
TiKV简介
vitess架构
CNCF’s Vitess Scales MySQL with the Help of Kubernetes
rook源码分析之一:rook架构解析
The Design of Rook
Containerd Github
docker、containerd的关系