使用 mariadb-operator 在 Kubernetes 中运行和管理 MariaDB

StatefulSet 资源的引入在 Kubernetes 中运行有状态工作负载方面带来了革命性的变化,引入了广泛的功能,包括

  • 针对每个 Pod 的可预测 DNS 名称,允许在网络中单独寻址它们。
  • 针对每个 Pod 的稳定的持久存储,确保每个 Pod 都绑定到同一个 PersistentVolumeClaim。
  • 有序的平滑部署和自动化的滚动更新。

然而,这还远远不够用于在 Kubernetes 中可靠地运行数据库。我们缺少运维操作,例如配置高可用性和安排备份,这是原生 Kubernetes 不管理的。

MariaDB & K8s:如何在 K8s 中复制 MariaDB

上一篇博客中,我们了解了如何创建一个 StatefulSet MariaDB 应用。此外,我们还在这篇博客中学习了 MariaDB 中的复制是如何工作的。现在,我们将尝试创建一个带复制功能的 StatefulSet 应用。作为撰写本博客的良好参考,我在此鸣谢Kubernetes 文档以及阿里云的一个示例。

配置复制

为了复制一个 MariaDB 应用,我们将创建一个 StatefulSet,它将包含一个init 容器和一个应用容器。

在 K8s 中创建 StatefulSet MariaDB 应用

上一篇博客中,我们创建了一个无状态应用,使用 K8s 的 Deployment 资源进行部署,这允许复制应用,但当 Pod 重启时数据会丢失,这意味着没有数据一致性。在同一篇博客中,我们使用了 PersistentVolumeClaim 来动态配置 PersistentVolume,但我们使用的是 Deployment,它适用于无状态应用。对于每个副本都应该有自己的持久卷的有状态应用(StatefulSet 应用),这种方式是 *不推荐* 的。实现这一点的正确方法是使用StatefulSet 资源,本文将介绍这一点。

在 K8s 中,可以创建一个有状态应用,例如数据库之类的应用,它需要将数据保存到持久磁盘存储中供服务器/客户端/其他应用使用,以跟踪其状态,并能够在分布式系统中进行复制和使用。

MariaDB & K8s:使用持久卷部署 MariaDB 和 WordPress

在上一篇博客MariaDB & K8s:如何在 MariaDB 部署中使用 Secret 资源中,我们使用了 Secrets 资源来隐藏敏感的 root 用户数据;以及该系列之前的博客MariaDB & K8s:容器/部署之间的通信中,我们在一个 Pod 中创建了 2 个容器(即 MariaDB 和 phpmyadmin)。那种部署没有任何持久卷。

在本篇博客中,我们将为 MariaDB 和 WordPress 应用分别创建独立的 Deployment,并为两者都创建一个 Service 以便连接它们。此外,我们将在 MariaDB Deployment 的 Pod 中创建一个 Volume。

MariaDB & K8s:如何在 MariaDB 部署中使用 Secret 资源

上一篇博客中,我们创建了一个无状态应用,并使用 K8s 的 Deployment 资源进行了部署,并暴露了 root 密码,考虑到安全性,这当然是不可取的。K8s 允许使用特定的 K8s 资源来隐藏敏感数据。

让我们看看如何在 K8s 中使用Secrets

K8s 中的 Secrets

为了保存敏感数据,可以使用一个名为Secret的 K8s 资源。

可以通过运行命令行工具创建 Secret:kubectl create secret

这里我们将使用两种方法来创建 Secret。

MariaDB & K8s:容器/部署之间的通信

上一篇博客中,我们从 YAML 文件创建了一个后台 Deployment 资源,它包含一个容器(MariaDB)并作为后台容器运行。

在本篇博客中,我们将继续创建前端容器,以便通过Service和其他资源与后端通信。

关于 Services

当应用通过 Deployment 运行时,Pods 会动态创建和销毁。创建时,它们会在集群中获得内部 IP 地址,而且由于它们是临时的,需要一种稳定的方式来实现 Pod 之间的通信。

在 K8s 中启动 MariaDB

这是本系列博客的第一篇,解释如何在 Kubernetes (K8s) 中使用 MariaDB,以及解释 K8s 和 MariaDB 的一些重要概念。

本篇博客解释了如何在 K8s 中使用命令行工具(CLI)将 MariaDB 作为无状态应用启动,并探讨了您可以在命令行工具上运行的不同命令。

前提条件是您已安装kubectl(它也会安装 Docker 运行时)和minikube(本地 K8s)。

让我们首先启动 minikube

$ minikube start && kubectl get nodes
名称 状态 角色 存活时间 版本
minikube 就绪 control-plane,master 104d v1.22.2

Pod 是 K8s 资源,也是 K8s 中最小的单元。