使用 Kubernetes 管理容器化的有状态应用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

 

编者按:本文转载自“才云 Caicloud”,作者 Josh Berkus。

目前,几乎所有关于容器和微服务的谈论都跟“无状态”的应用挂钩。这完全可以理解,因为无状态应用程序更简单。而且容器和编排技术已经成熟到能够承工作负载的程度:即有状态的应用。

Kubernetes 是一个用于自动部署、扩展和管理容器化应用程序的开源系统,我之前做过两次关于 Kubernetes、数据库以及容器的演讲。

什么是“无状态”应用?

无状态服务,即 Web 服务器、代理和应用程序代码这样的应用程序,它们可以处理数据但不进行存储。编排过程中,开发者比较喜欢使用它们,因为它们易于部署且易于扩展。如果流量上升,则只需添加更多的负载平衡。更重要的是,它们是“不变动的”;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别。这意味着它们可以随时被替代,而且容器实例切换过程中几乎不需要耗费“切换成本”。

什么是有状态应用?

有状态的服务,即路由器、CDN(内容传送网络)、streaming 服务器和认证服务器。从部署开始,这些容器就开始与上游镜像不同了,时间越长它们的差异越大。这种差异就被称为“state(状态)”。事实上,每个运行的应用程序都至少有一个小状态(差异),但对于“无状态”应用程序来说,状态(差异)很小,而且可以进行快速替换。

对于有状态的,那就不是这样的情况了。虽然状态可以通过状态节点进行同步或复制,但是这必须通过应用程序专用的一些方法在业务流程系统之外完成。总之很麻烦。

数据库和有状态应用程序

当然,鉴于我在 PostgreSQL 工作18年的历史,我真正关心的有状态应用程序是交易型数据库。数据库对于大多数应用程序堆栈而言至关重要,而且对于状态支持来说也是一个很好的测试用例,因为它们可以用有效方式进行状态化,包括: 

Storage

Identity

Session

Cluster Role 

例如,PostgreSQL 需要将数据和交易存储在每个 PostgreSQL 容器(存储)持久和特有的文件中。每个容器需要被识别为特定的数据库节点,我们需要能够通过名称或地址将流量路由到它。数据库客户端连接或会话也有一个状态,打破它们需要付出一定的代价,所以我们不想随意移动数据库节点。最后,每个数据库节点在其数据库集群中都有一个角色,集群角色例如 master、replica、shard 等。这些集群角色将持续存在,直到数据库特定 event 更改它们为止。

在流行的容器云堆栈上实现这些类型的状态一直是具有挑战性的。 Docker 和编排框架将大多数类型的状态视为发生在容器堆栈之外的状态,迫使数据库架构师管理存储、身份、路由以及很多其他的东西。你没有办法将数据库移动到帮助您的容器。因此,尽管很多网页应用程序已经容器化,但几乎没有数据库或其他有状态的应用程序能够容器化。那么,我们在哪里存储数据?一般来说,可以使用 Amazon RDS。

使用 Kubernetes StatefulSet 的数据库 

Kubernetes 项目一直致力于一个对象和一组功能,去年称为 StatefulSet 来处理数据库和其他状态服务。开发人员最初以“PetSet”的工作名称发布了此功能,但是他们进行了更改,然后发布到1.5版本中,并且有了一个更合适的名字:StatefulSet。此时,StatefulSet 实现 Storage 和 Identity 有状态质量。其他两个可以使用最小粘合代码使用 Kubernetes 作为资源实现。换句话说,你不必等待部署协调的容器化数据库。

现在,你可以在 Kubernetes 上的容器中运行数据库,但是为什么要这样做呢?答案与容器无关,但是都与编排的好处有关。

我们期望再现代数据库平台中高可用性(HA),希望它能够脱颖而出,但这光靠数据库软件是提供不了的。引入群集,替换故障机器上的数据库节点,重新路由应用程序流量到迁移的节点,以及其他 HA 注意事项需要大量的代码和许多数据库外部以及其内部的实用程序。

这样的代码很难写,因为它需要先实现分布式系统。

像其他业务流程系统一样,Kubernetes 提供了一个简单易用的分布式系统。数据库(如 PostgreSQL和MySQL)如果没有内置的 HA,很容易变成这样,已经是 HA 的数据库(如 Cassandra 和 RethinkDB),那就可以实现全自动。从经验来说,这是比自己从头开始做更容易。

我创建了一些例子,展示如何在我的 atomicdb 演示 repo 上使用 StatefulSet 来部署 PostgreSQL。以上这些是为了说明如何使用功能,并非完整的生产部署。 Zalando 是 Patroni 集群管理项目的领导者发布了 Helm Chart,它基于 Kubernetes 的群集 PostgreSQL。

(欲了解更多关于作者的演讲信息,请点击“查看原文”

作者简介:

Josh Berkus 供职于 RedHat 的 Project Atomic,这个项目需要跟Kubernetes,AtomicHost,Docker,Fedora 以及其它项目近距离接触。 他之前在 PostgreSQL 核心团队拥有十几年工作经验,为流行的开源数据库做出贡献。 


  

本文转自d1net(转载)

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
12天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
14天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
151 77
|
1天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
16 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
13天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
13天前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
53 13
|
13天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
13天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
23天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
30 5
|
23天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
53 4
|
25天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
44 1

相关产品

  • 容器服务Kubernetes版