云原生在京东丨如何在 Kubernetes 上部署有状态的云原生应用?(上)

image.png
Kubernetes 的出现使得广大开发同窗也能运维复杂的分布式系统,它大幅下降了容器化应用部署的门槛,用户经过它提供的 Deployment、ReplicaSet 控制器能够方便地部署一套高可用、可扩展的分布式无状态服务,这类应用的特色是不在本地存储数据,经过简单的负载均衡策略可实现请求分发。可是愈来愈多的开发人员但愿把项目中依赖的数据库这类有状态服务也部署到Kubernetes里面,经过其进行编排部署,使应用与所依赖的后端存储尽可能靠近一些,由于有状态服务的复杂性,这一过程并不容易。git

在 Kubernetes 中有多种运行有状态应用程序的技术,每种技术各有优缺点。本文试图介绍在 Kubernetes 中运行有状态应用程序的关键方法,并探讨了在 Kubernetes 上部署有状态的服务的几种可行方案。github

image.png

第一种方法是将 Kubernetes 集群与 Samba、NFS 或 GlusterFS 等传统的存储基础设施集成在一块儿,这种方法能够轻松扩展到基于云的共享文件系统,例如 Amazon EFS、Azure 文件和 Google Cloud Filestore,在这种架构中,存储层与 Kubernetes 管理的计算层彻底脱钩。因为底层存储的持久性,工做负载彻底与其分离,这使得 Pod 能够在任何节点上进行调度,而无需定义节点亲和性。数据库

可是,这种方法对于须要高 I/O 吞吐量的有状态工做负载并不理想。共享文件系统并不是旨在提供关系型数据、NoSQL 数据库和其余写入密集型工做负载所需的 IOPS。此方法的典型应用场景应该是内容管理系统,机器学习系统和数字资产管理系统等。后端

image.png

第二种方法是经过 Kubernetes 的控制器来维护所需的配置状态,Deployment、ReplicaSet、DaemonSet 和 StatefulSet 是一些经常使用的控制器, 其中 StatefulSet 是一种特殊的控制器。集群工做负载一般能够具备一个或多个主服务器和多个从服务器,大多数数据库都设计为在集群模式下运行,以提供高可用性和容错能力,有状态的集群工做负载持续在主服务器和从服务器之间复制数据。为此,集群基础架构但愿参与的实体(主从)具备一致暴露的端点,借以可靠地同步状态。可是在 Kubernetes 中,Pod 被设计为临时的,不能保证具备固定的名称和 IP 地址。有状态集群工做负载的另外一个要求是持久的存储后端,该后端具备容错能力而且可以知足 IOPS 的需求。服务器

_Kubernetes 中引入 StatefulSet 控制器来运行有状态的集群工做负载,保证属于 StatefulSet 的 Pod 具备稳定的惟一标识符,它们遵循可预测的命名约定,还支持有序、便捷的部署和扩展。_StatefulSet 中的每一个 Pod 都有一个对应的持久卷声明(PVC),该声明遵循类似的命名约定。当 Pod 终止并在其余节点上从新调度时,Kubernetes 控制器将确保 Pod 与同一 PVC 关联,以此来保证集群的状态。架构

因为 StatefulSet 中的每一个 Pod 都有专用的 PVC 和 PV,所以使用共享存储没有特别的规定。可是能够预期 StatefulSet 能得到快速、可靠、持久的存储层(例如基于 SSD 的块存储设备)的支持,在确保将写操做彻底提交到磁盘后,能够从块存储设备中获取常规备份和快照。典型的应用场景如 Apache ZooKeeper,Apache Kafka,MySQL,PostgreSQL 等。负载均衡

image.png

虽然用户能够基于 StatefulSet 在 Kubernetes 中部署运维一套高可用有状态服务,如高 MySQL,PostgreSQL 等。但过程相对复杂,用户既要熟悉各类 Kubernetes 资源对象,又要学习不少应用相关的操做细节,同时还需维护一套复杂的管理脚本,为了下降在 Kubernetes 中部署复杂应用的门槛 CoreOS 公司推出了 Operator。运维

Operator 是用来打包、部署和管理须要运行在 Kubernetes 之上复杂应用的一种方法,Operator将运维人员对软件操做的知识代码化,同时综合运用 Kubernetes 中的各类资源对象来实现复杂应用的部署和运维。Operator 经过  CustomResourceDefinition(CRD)为服务定义了新的资源对象,同时经过自定义控制器来保证应用处于预期状态。机器学习

image.png

Operator 的工做流程可抽象成如下三个步骤:分布式

  • Observe - 经过 Kubernetes API 观察目标对象的状态;
  • Analyze - 分析当前状态与指望状态的差异;
  • Act - 执行编排操做,将当前状态调整为指望状。

因为开源社区的推动,Operator 愈来愈普及。可是应用于各类常规服务的 Operator 成熟度各不相同,具体细节请参考 github 开源项目 awesome-operators。Operator 典型的应用场景有 MySQL 高可用集群、TiDB 集群、 TensorFlow 集群、Hadoop 生态相关集群等。

image.png

预告

下一篇咱们将以最早进的开源数据库 PostgreSQL 为例,介绍如何在 Kubernetes 上部署运维有状态云服务,敬请期待!

相关文章
相关标签/搜索