MySQL 和 Kubernetes 共享术语。例如,节点可以是 Kubernetes 节点或 MySQL 节点,集群可以是 MySQL InnoDB 集群或 Kubernetes 集群,而 ReplicaSet 是 MySQL 和 Kubernetes 中的功能。本文档倾向于使用长名称,但这些重载的术语仍然可能导致混淆;上下文很重要。
Kubernetes
Kubernetes 系统使用控制器,通过在 Kubernetes 系统中以Pod的形式运行容器化工作负载,来管理其生命周期。控制器是通用工具,为广泛的服务提供功能,但复杂的服务需要额外的组件,这包括 Operator。 Operator是在 Kubernetes 集群中运行的软件,它与 Kubernetes API 交互以观察资源和服务,从而协助 Kubernetes 进行生命周期管理。
适用于 Kubernetes 的 MySQL Operator
适用于 Kubernetes 的 MySQL Operator 是一个专注于管理一个或多个由一组 MySQL 服务器和 MySQL Router 组成的MySQL InnoDB 集群的 Operator。MySQL Operator 本身在 Kubernetes 集群中运行,并由Kubernetes Deployment控制,以确保 MySQL Operator 保持可用并运行。
MySQL Operator 默认部署在“mysql-operator”Kubernetes 命名空间中;并监视 Kubernetes 集群中的所有 InnoDB 集群和相关资源。为了执行这些任务,Operator 订阅 Kubernetes API 服务器以更新事件,并根据需要连接到托管的 MySQL 服务器实例。在 Kubernetes 控制器之上,Operator 配置 MySQL 服务器、使用 MySQL 组复制的复制和 MySQL Router。
MySQL InnoDB 集群
将 InnoDB 集群 (InnoDBCluster) 资源部署到 Kubernetes API 服务器后,适用于 Kubernetes 的 MySQL Operator 将创建以下资源,包括:
-
用于 MySQL 服务器实例的Kubernetes StatefulSet。
这将管理 Pod 并分配相应的存储卷。此 StatefulSet 管理的每个 Pod 都运行多个容器。其中几个容器提供了一系列初始化步骤,用于准备 MySQL 服务器配置和数据目录,然后两个容器保持活动状态以供操作模式使用。其中一个容器(名为“mysql”)运行 MySQL 服务器本身,另一个容器(名为“sidecar”)是一个 Kubernetes Sidecar,负责与 Operator 本身协调管理节点的本地管理。
-
用于 MySQL Router 的Kubernetes Deployment。
MySQL Router 是无状态服务,根据应用程序的选择将应用程序路由到当前的主节点或副本节点。Operator 可以根据集群工作负载的需要向上或向下扩展 Router 的数量。
MySQL InnoDB 集群部署会创建以下Kubernetes 服务
-
一个服务是 InnoDB 集群的名称。它充当应用程序的主要入口点,并将传入连接发送到 MySQL Router。它们以“{clustername}.svc.cluster.local”的形式提供稳定的名称,并公开特定的端口。
另请参阅第 3.4 节“MySQL InnoDB 集群服务说明”和第 5 章“连接到 MySQL InnoDB 集群”。
名为“{clustername}-instances”的第二个服务为各个服务器提供稳定的名称。通常不应直接使用这些名称;而是使用主服务根据需要可靠地访问当前的主节点或辅助节点。但是,出于维护或监控目的,可能需要直接访问实例。每个 Pod 实例都安装了 MySQL Shell。
适用于 Kubernetes 的 MySQL Operator 会创建和管理不应手动修改的其他资源,包括:
-
名为“{clustername}-initconf”的Kubernetes ConfigMap,其中包含 MySQL 服务器的配置信息。
要修改生成的
my.cnf
配置文件,请参阅第 3.3 节“InnoDBCluster 的清单更改”。 -
一系列具有系统不同部分凭据的Kubernetes Secret;名称包括“{clustername}.backup”、“{clustername.privsecrets}”和“{clustername.router}”。
有关 Operator 创建的 MySQL 帐户(和关联的 Secret)的列表,请参阅第 3.5 节“由 InnoDBCluster 部署创建的 MySQL 帐户”。