背景

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

基本概念

CNCF:即Cloud Native Computing Foundation。中文直接翻译为”云原生计算基金会“为许多增长最快的开源项目(包括Kubernetes、Prometheus和Envoy)提供了供应商中立的组织.
云原生:云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。云原生既包含技术(微服务,敏捷基础设施),也包含管理(DevOps,持续交付,康威定律,重组等),可以说是一系列云技术、企业管理方法的集合

CNCF全景图

上图可以说囊括了所有云原生的重要项目了,但是对于我们了解学习起来成本有点高,下面列举一下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数据库集群可以实现无限水平扩展,同时无需为应用添加分片逻辑。

  • vtgate: 是一组无状态节点,它们充当用户的前端
  • vtctld: 与集群元数据交互的 服务器
  • etcd: 存储少量元数据的强一致性存储。Vitess 设计者将此组件设计为插件,它在Zookeeper、etcd和Consul之上有实现。
    shared:
  • vttablet:VTTablet 是 Vitess 组件,负责监视本地 MySQL属于伴生进程。VTablet 可以终止查询,确保 MySQL 实例健康,对查询实施限制并向
Tikv: 云原生版本的KV存储

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

  • 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 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢复、监控以及资源管理。

  • 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 剥离的镜像管理和容器执行技术

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

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

总结

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

备注

标题链接
CNCFhttps://www.cncf.io/projects
什么是云原生?这回终于有人讲明白了https://juejin.cn/post/6844904197859590151
什么是云原生http://dockone.io/article/10581
云原生的定义https://www.huaweicloud.com/zhishi/edu-arc-yys101.html
京东如何基于Vitess管理大型MySQL实例集群https://developer.jdcloud.com/article/1159
TiKV简介https://docs.pingcap.com/zh/tidb/stable/tikv-overview/
vitess架构https://vitess.io/docs/overview/architecture/
CNCF’s Vitess Scales MySQL with the Help of Kuberneteshttps://thenewstack.io/cncf-host-vitess/
rook源码分析之一:rook架构解析https://zhuanlan.zhihu.com/p/169531996
The Design of Rookhttps://ilovett.github.io/docs/rook/master/
Containerd Githubhttps://github.com/containerd/containerd
docker、containerd的关系https://blog.csdn.net/x356982611/article/details/106683238

更多推荐