如何使用 Oracle 的 Operator 在 Kubernetes 上运行 MySQL
Kubernetes 对有状态应用程序的支持在过去几年中已经相当成熟。 现在可以将你的数据库定位在你的集群中,使其受益于与你的其他工作负载相同的可扩展性。
MySQL 是最流行的关系数据库引擎之一,现在由官方 Kubernetes Operator 维护开发。 Oracle 主导的开源项目提供了一种在 Kubernetes 中创建托管 MySQL 集群的简单方法。
在本文中,你将学习如何安装 Operator
并开始配置数据库。 Operator
自动创建服务,以便你其他容器中的应用程序可以连接到 MySQL。
什么是 MySQL 运算符?
Oracle 的 MySQL 运算符是一个在集群内部运行的组件,用于自动执行数据库初始化。 你不需要运维人员在 Kubernetes 中使用 MySQL——你可以使用 StatefulSet
自行部署官方容器镜像。 但是这种方法很麻烦,需要你编写和维护长清单文件以创建可靠的环境。
Operator 提供一组可用于创建数据库的自定义资源。 将 InnoDBCluster
对象添加到你的 Kubernetes 集群会提示 Operator 为你设置 StatefulSets、存储和网络。 它还自动升级和备份,大大减轻了管理员的负担。
安装 MySQL Operator
包含的 Helm chart 是在集群中安装 Operator
的最简单方法。 如果你的环境中没有 Helm,可以使用清单文件作为替代。
首先将操作员添加到你的 Helm 存储库列表中:
$ helm repo add mysql-operator https://mysql.github.io/mysql-operator/
接下来更新 Helm 的存储库数据库,以便它发现可用的图表:
$ helm repo update
现在使用以下命令将 Operator 安装到名为 mysql-operator
的新命名空间中:
$ helm install mysql-operator mysql-operator/mysql-operator \
--namespace mysql-operator \
--create-namespace
NAME: mysql-operator
LAST DEPLOYED: Sat Oct 29 15:00:26 2022
NAMESPACE: mysql-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None
该过程可能需要几秒钟才能完成。
创建 Root 用户凭据密钥
你创建的每个数据库集群都必须附带一个 Kubernetes 密钥,其中包含 MySQL root 用户的凭据。 Operator 将使用密钥中提供的用户名和密码创建 root 特权帐户。
复制以下 YAML 清单并将 rootPassword
字段的值更改为安全的值。 如果适用于你的情况,也可以更改用户名和用户主机设置。 请记住,此处命名的帐户将完全控制 MySQL; 稍后应该使用常规的 MySQL shell 为你的应用程序设置单独的用户。
apiVersion: v1
kind: Secret
metadata:
name: mysql-root-user
stringData:
rootHost: "%"
rootUser: "root"
rootPassword: "P@$$w0rd"
将文件另存为 secret.yaml。 现在使用 Kubectl 将密钥添加到集群:
$ kubectl apply -f secret.yaml
secret/mysql-root-user created
创建基本集群
接下来创建一个名为 mysql.yaml 的新 YAML 文件并复制以下内容:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
spec:
secretName: mysql-root-user
instances: 3
tlsUseSelfSigned: true
router:
instances: 1
这使用 MySQL Operator 提供的 InnoDBCluster
自定义资源定义了一个对象。 将清单应用到您的集群将创建一个自动配置复制的新 MySQL 数据库。 在继续之前检查并更改清单中的以下属性:
-
spec.secretName – 这必须与你之前创建的密钥的
metadata.name
相匹配。 将读取引用的密钥以设置 MySQL root 用户帐户。 - spec.instances – 这定义了要运行多少个 MySQL 副本 (Pod)。 目前最多支持 10 个副本。
-
spec.tlsUseSelfSigned – 该字段在此示例中设置为 true 以使用包含的自签名 TLS 证书。 你可以选择通过设置
spec.tlsSecretName/spec.tlsCASecretName
字段通过 Kubernetes 秘密提供你自己的证书。 - spec.router.instances – MySQL Router 组件负责在可用的 MySQL 副本之间引导服务流量。 该字段定义要运行的路由器实例数。 多个实例将提高高流量情况下的性能和弹性。
使用 Kubectl 应用清单并创建数据库集群:
$ kubectl apply -f mysql.yaml
innodbcluster.mysql.oracle.com/mysql-cluster created
MySQL 初始化过程可能需要几分钟才能完成。 Operator 使用多个初始化容器来设置用户帐户和配置 MySQL 的数据目录。 稍等片刻,然后运行 kubectl get pods
检查正在运行的内容:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-cluster-0 2/2 Running 0 2m
mysql-cluster-1 2/2 Running 0 2m
mysql-cluster-2 2/2 Running 0 2m
mysql-cluster-router-6b68f9b5cb-wbqm5 1/1 Running 0 2m
三个 MySQL 副本和单个路由器实例都处于 Running
状态。 数据库现在可以使用了。
连接到你的集群
MySQL Operator 创建一个 Kubernetes 服务,将流量从你的应用程序 Pod 路由到你的数据库。 该服务被分配了一个主机名,格式如下:
<cluster-name>.<namespace-name>.svc.cluster.local
上面显示的示例集群的正确主机名是 mysql-cluster.default.svc.cluster.local
。 配置你的应用程序以使用端口 3306 和你在密钥中定义的用户凭证连接到此地址的 MySQL。
从外部访问你的数据库
你可以使用 Kubectl 的端口转发功能从集群外部访问 MySQL。 运行以下命令打开一个新的端口转发会话:
$ kubectl port-forward service/mysql-cluster 3306
将 mysql-cluster
替换为你要连接的 InnoDBCluster
的名称。 现在你可以使用本地工具与数据库交互:
$ mysql -h127.0.0.1 -u root -p
在运行 kubectl port-forward
命令的终端窗口中按 Ctrl+C 将关闭连接。
自定义 MySQL 服务器设置
你可以通过在 InnoDBCluster
对象的清单中设置 spec.mycnf
字段来提供应用程序所需的任何 MySQL 配置文件选项:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
# ...
mycnf: |
[mysqld]
max_connections=500
innodb_ft_min_token_size=5
Operator 将使用此字段的值将 my.cnf 文件写入数据库 Pod 的文件系统中。
设置存储容量
Operator 会自动创建持久卷 (PV) 和持久卷声明 (PVC) 来存储数据库的数据。 它默认提供 2Gi 的存储空间。
这可以使用 datadirVolumeClaimTemplate
清单字段进行更改,该字段允许你覆盖 Operator 生成的 PVC 资源的属性。 将 resources.requests.storage
属性设置为你需要的容量。
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
# ...
datadirVolumeClaimTemplate:
resources:
requests:
storage: 10Gi
你应该将此值设置得足够高,以便你的数据在未来有足够的增长空间。 Operator 不支持就地调整卷大小,因此如果你将来尝试增加容量,会看到错误。 切换到更大的卷将需要手动迁移步骤。
固定 MySQL 版本
你可以使用 spec.version
和 spec.router.version
字段固定到特定的 MySQL 版本。 这将防止无意的自动升级。 为你的 MySQL Pod 和路由器实例选择相同的版本以保证兼容性。
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
# ...
version: 8.0.31
router:
instances: 1
version: 8.0.31
总结
Oracle 的 MySQL Operator 提供了一种在 Kubernetes 集群中运行 MySQL 数据库的便捷机制。 你可以通过创建 InnoDBCluster
对象来提供新的复制数据库。 这比手动创建公开常规 MySQL 容器的 StatefulSet
和服务要简单得多。
使用 Operator 不会妨碍你控制 MySQL 或 Kubernetes 环境的能力。 你可以通过在 spec.podSpec
字段中提供你自己的清单属性来自定义 Pod,并按照上述步骤使用自己的 MySQL 配置文件。 该 Operator 还提供集成备份支持,让你可以定期将数据库复制到外部存储。
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。