龙空技术网

K8s—使用 PersistentVolume 部署 MySQL

杨同学编程 274

前言:

现在我们对“mysql模板”可能比较看重,我们都想要了解一些“mysql模板”的相关文章。那么小编也在网络上搜集了一些有关“mysql模板””的相关知识,希望咱们能喜欢,兄弟们快快来了解一下吧!

每天一点K8s知识!

在我之前的文章中,我向您展示了如何动态使用 AWS EFS 作为您的应用程序持久存储,“ K8s — 使用 AWS EFS 作为持久卷”。在本文中,让我们实际部署一个常见的有状态应用程序并模拟节点故障。

此MySQL应用程序部署演示了如何为MySQL数据库提供持久存储。步骤是:

为. PersistentVolumeClaim_MySQL部署MySQL(部署和服务)。将数据添加到MySQL.模拟一个节点故障,K8s 自动迁移MySQL到其他节点。验证数据一致性。先决条件安装了 AWS EFS CSI 驱动程序的 K8s 集群即用型 AWS EFS 文件系统

您可以按照我在此处的说明了解如何配置 AWS EFS CSI 驱动程序。

创建存储类

要动态创建持久卷,您需要先定义一个StorageClass。在示例 YAML 文件下方:

# storage_class.yml种类:StorageClass apiVersion:storage.k8s.io/v1元数据:  名称:efs-sc provisioner:efs.csi.aws.com参数:  provisioningMode:efs-ap   fileSystemId:fs-09dabf86bedf2b332   directoryPerms:“700”   gidRangeStart : "1000" # 可选  gidRangeEnd: "2000" # 可选  basePath: "/dynamic_provisioning" # 可选

创建上述StorageClass

$ kubectl 创建 -f storage_class.yml$ kubectl get storageclass kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEPANSION AGE efs-sc efs.csi.aws.com Delete Immediate false 40m gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 91m
为 MySQL 创建 PVC

MySQLYAML 文件的 PVC如下所示:

# mysql-pvc.ymlapiVersion:v1种类:PersistentVolumeClaim元数据:  名称:mysql-pvc规范:  accessModes:-ReadWriteMany storageClassName     :  efs-sc  资源:    请求:      存储:5Gi

创建 PVC:

$ kubectl create -f mysql-pvc.yml persistentvolumeclaim/mysql-pvc created$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pvc Bound pvc-8f91e720-0a5a-436e-98cd-4471b0e7e099 5Gi RWX efs-sc 3s
部署 MySQL 应用

现在,让我们部署MySQL应用程序,YAML 定义如下:

# mysql-deployment.ymlapiVersion:apps/v1种类:部署元数据:  名称:mysql规格:  副本:1  选择器:    matchLabels:      app:mysql  模板:    元数据:      标签:        app:mysql    规格:      容器:      -名称:mysql        图像:mysql:5.7         securityContext:          runAsUser :1000           allowPrivilegeEscalation:false         env:        -名称:MYSQL_ROOT_PASSWORD          值:密码        端口: -containerPort         :3306          名称:mysql         volumeMounts:        -名称:mysql-persistent-storage           mountPath:/var/lib/mysql      卷:      -名称:mysql-persistent-storage         persistentVolumeClaim:          claimName:mysql-pvc

部署它:

$ kubectl create -f mysql-deployment.yml deployment.apps/mysql created$ kubectl get po NAME READY STATUS RESTARTS AGE mysql-5c4c8b7c65-fbx22 1/1 Running 0 7s$ kubectl 记录 mysql-5c4c8b7c65-fbx222022-05-22 20:54:51+00:00 [注意] [入口点]: MySQL 服务器 5.7.38-1debian10 的入口点脚本已启动。2022-05-22 20:54:51+00:00 [Note] [Entrypoint]:初始化数据库文件... 2022-05-22T20:55:07.862958Z 0 [Note] 事件调度程序:加载 0 个事件2022-05 -22T20:55:07.863250Z 0 [注意] mysqld:准备连接。版本:'5.7.38' 套接字:'/var/run/mysqld/mysqld.sock' 端口:3306 MySQL 社区服务器(GPL)

请注意,如果遇到chown: changing ownership of ‘/var/lib/mysql/’: Operation not permitted问题,您需要securityContext为您的容器配置:

安全上下文:  runAsUser:1000   allowPrivilegeEscalation:假

ID来自runAsUserEFS 配置,您可以从 AWS EFS 控制台获取它:

部署 MySQL 服务

该mysql-service.yml文件如下所示:

apiVersion:v1种类:服务元数据:  名称:mysql规格:  端口:  - 端口:3306  选择器:    应用程序:mysql

并部署它:

$ kubectl create -f mysql-service.yml服务/mysql 创建
模拟节点故障

现在MySQL部署到节点ip-192–168–79–130.us-east-2.compute.internal,我们可以MySQL通过客户端访问服务mysql:

$ kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-client -- mysql -h mysql -ppassword如果您没有看到命令提示符,请尝试按 Enter。mysql>

让我们更新数据库并添加一些数据:

mysql> 使用 mysql读取表信息以补全表名和列名可以使用 -A 关闭此功能以获得更快的启动数据库更改mysql> create table my_id( id int(4) ); 查询正常,0 行受影响(0.09 秒)mysql> 插入 my_id 值(111);查询正常,1 行受影响(0.01 秒)mysql> select * from my_id     -> ; +--------+ | 编号 | +--------+ | 111 | +-----+ 1 行(0.00 秒)mysql>退出;再见pod “mysql-client” 已删除

现在让我们关闭 node ip-192–168–79–130.us-east-2.compute.internal,您可以看到 K8s 自动MySQL在另一个节点上启动了一个新 pod 并将数据迁移到新实例:

$ kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-5c4c8b7c65-fbx22 1/1 Terminating 0 4m53s 192.168.85.201 ip-192-168-79-130.us-east-2.compute.internal <none> <none> mysql-5c4c8b7c65-rrchb 1/1 Running 0 32s 192.168.53.130 ip-192-168-51-116.us-east-2.compute.internal <none> <none> mysql-client 0/ 1 终止 0 49s <none> ip-192-168-79-130.us-east-2.compute.internal <none> <none>

几秒钟后,新MySQLPod 启动并在新节点上运行ip-192–168–51–116.us-east-2.compute.internal:

$ kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-5c4c8b7c65-rrchb 1/1 Running 0 4m54s 192.168.53.130 ip-192-168-51-116.us-east-2.compute.internal   <无> <无>

让我们验证数据,连接到MySQL服务器:

$ kubectl run -it --rm --image=mysql:5.7 --restart=从不 mysql-client -- mysql -h mysql -ppassword

并运行select * from my_id;SQL 命令:

可以看到数据是一致的。至此,MySQL服务从节点故障中成功恢复。

标签: #mysql模板