Kubernetes(K8S)使用PV和PVC做存储安装mysql

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Kubernetes(K8S)使用PV和PVC做存储安装mysql

环境准备

首先你需要一个k8s环境,可以参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122

什么是PV和PVC

我们可以简单看一下官网的描述:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#introduction

持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。

持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。

本篇文章就用上面提到的nfs来搭建pv和pvc并部署mysql

环境准备

首先我们需要搭建一个k8s集群,并且准备一台nfs服务器,为了方便我就使用k8s的主节点作为nfs服务器,服务器列表如下表:

IP地址 服务器用途
192.168.1.160 k8s-master,k8s的主节点和nfs服务器
192.168.1.161 k8s-node01,k8s的第一个工作节点
192.168.1.162 k8s-node02,k8s的第二个工作节点

配置nfs

安装nfs

首先我们需要在三台服务器单中都需要安装nfs软件包,使用如下命令进行安装:

yum install -y nfs-utils
• 1

如图三台服务器都需要安装:

配置nfs服务端

然后我们需要在nfs的主服务器暴露一个 /data/nfs/mysql 目录,我们需要修改 /etc/exports 配置文件,需要将这一行加在里面:

/data/nfs/mysql *(rw,sync,no_root_squash)

可以直接执行这行命令,第一行为创建这个目录,第二行为修改文件

mkdir -p /data/nfs/mysql
cat >> /etc/exports << EOF
/data/nfs/mysql *(rw,sync,no_root_squash)
EOF

然后我们需要启动nfs服务,只需要在nfs服务器上执行:

systemctl enable --now nfs-server

然后我们执行这行命令,看目录是否暴露:

showmount -e nfs服务器地址

可以看到目录暴露成功:

创建命名空间

我们需要创建一个命名空间,当然也可以越过这一步,这里创建命名空间的目的只是为了更接近生产环境,创建命名空间的yaml文件:

apiVersion: v1
kind: Namespace
metadata:
  name: deploy-test
spec: {}
status: {}

上面的yaml文件创建了一个名为 deploy-test 的命名空间,可以查看创建结果:

配置pv和pvc

pv的yaml文件

注意按照提示修改内容:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: deploy-mysql-nfs-pv # pv的名字
  namespace: deploy-test # 这里为命名空间的名字
spec:
  capacity:
    storage: 1Gi # 申请的硬盘大小为1GB,可修改
  accessModes:
    - ReadWriteMany # 权限为多节点读写
  nfs:
    # 注意修改nfs服务器地址
    server: 192.168.1.160
    # 注意修改目录的地址
    path: /data/nfs/mysql
  storageClassName: "nfs" # 存储类型选择nfs

pvc的yaml文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: deploy-mysql-nfs-pvc # 为pvc取一个好听的名字
  namespace: deploy-test # 命名空间名字
spec:
  accessModes:
    - ReadWriteMany # 权限为多节点读写
  storageClassName: "nfs" # 存储类型为nfs
  resources:
    requests:
      storage: 1Gi # 申请大小容量为1GB
  volumeName: deploy-mysql-nfs-pv # 绑定的pv名字

执行后我们可以查看创建的状态:

部署mysql

创建mysql的root密码的secret

前面准备工作都做好了,接下来我们就可以开始部署mysql了,但是之前我们还需要创建一个secret,执行命令获取yaml文件内容:

# 命令说明
kubectl create secret generic mysql-password --from-literal=mysql_root_password=mysql的root密码 -n 命名空间 --dry-run=client -o=yaml
# 命令示例
kubectl create secret generic mysql-password --from-literal=mysql_root_password=root -n deploy-test --dry-run=client -o=yaml

生成如图所示:

创建mysql部署的yaml

apiVersion: v1
kind: Service
metadata:
  name: deploy-mysql-svc # mysql暴露服务的名字
  namespace: deploy-test # 命名空间
  labels:
    app: mysql
spec:
  ports:
  - port: 3306 # 暴露给外部3306端口
    name: mysql
    targetPort: 3306 # 内部目标3306端口
    nodePort: 30306 # 外部访问集群nodeport的30306端口
  selector:
    app: mysql
  type: NodePort
  sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet # 创建一个StatefulSet有状态的控制器
metadata:
  name: deploy-mysql # 部署的名字
  namespace: deploy-test # 命名空间
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "deploy-mysql-svc" # 注意指定上面的那个服务名称
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args: # 新增一些启动参数
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:5.7.43
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43 # 因为dockerhub上镜像经常拉取失败,所以使用此镜像
        ports:
        - containerPort: 3306 # 容器内部暴露3306端口
          name: mysql
        volumeMounts:
        - name: mysql-data # 引用pvc挂载的名字
          mountPath: /var/lib/mysql # 这个是容器内部存放数据的文件夹目录,需要挂在到pvc当中
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom: # mysql的密码引用上面创建的secret
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data # pvc的挂载名称
        persistentVolumeClaim:
          claimName: deploy-mysql-nfs-pvc # 指定使用那个pvc

部署mysql

整体的yaml文件内容为:

apiVersion: v1
kind: Namespace
metadata:
  name: deploy-test
spec: {}
status: {}
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: deploy-mysql-nfs-pv
  namespace: deploy-test
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.1.160
    path: /data/nfs/mysql
  storageClassName: "nfs"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: deploy-mysql-nfs-pvc
  namespace: deploy-test
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: deploy-mysql-nfs-pv
---
apiVersion: v1
data:
  mysql_root_password: cm9vdA==
kind: Secret
metadata:
  name: mysql-password
  namespace: deploy-test
---
apiVersion: v1
kind: Service
metadata:
  name: deploy-mysql-svc
  namespace: deploy-test
  labels:
    app: mysql
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql
  type: NodePort
  sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: deploy-mysql
  namespace: deploy-test
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "deploy-mysql-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:5.7.43
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: deploy-mysql-nfs-pvc

执行以下命令部署:

kubectl apply -f deploy-mysql.yaml

创建结果:

执行下面这行命令监控部署:

watch kubectl get all -o wide -n deploy-test

看到下面这个代表创建成功:

当我们查看nfs当中挂在出来的mysql目录的时候:

ll /data/nfs/mysql/

文件夹内容:

链接mysql

外部链接

在我们创建mysql的时候我们就规定了一个NodePort端口,如图:

我们直接使用集群当中任意一个节点的30306端口即可链接这个数据库:

mysql -uroot -h192.168.1.160 -p -P30306

查看结果:

内部链接

在集群里面访问我们可以通过主机名,主机名格式如下:

<pod名称>.<service名称>.<命名空间名称>.svc.cluster.local

执行命令查看:

kubectl get all -o wide -n deploy-test

各类名称如图所示:

所以我们此次访问mysql的主机名如下:

deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local

我们此次就不建立其他的pod来验证是否能够安装上了,我们直接检查集群内的dns解析是否正常就知道这个域名是否正常了,使用以下命令查看k8s集群当中的dns服务的地址:

kubectl get svc -o wide -n kube-system | grep dns

查看dns服务地址:

直接通过 nslookup 尝试解析查看是否解析到正确的IP地址上:

# 安装nslookup命令所在的软件包
yum install -y bind-utils
# 解析域名
nslookup deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local 10.96.0.10

发现域名解析是正常的:

好了,k8s上部署mysql完成了,下课

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
29天前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
117 21
|
11天前
|
存储 缓存 关系型数据库
MySQL原理简介—5.存储模型和数据读写机制
本文介绍了MySQL中InnoDB存储引擎的物理存储结构和读写机制。主要内容包括: 1. 为什么不能直接更新磁盘上的数据 2. 数据页的概念 3. 一行数据的存储 4. 数据头的内容 5. 行溢出和溢出页 6. 数据页的物理结构 7. 表空间的物理结构 8. InnoDB存储模型及读写机制总结 这些机制共同确保了InnoDB在高并发场景下的高效运行和数据一致性。
|
26天前
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
50 13
|
1月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
2月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
232 19
|
2月前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
686 10
|
3月前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
71 1
|
3月前
|
Kubernetes Cloud Native 持续交付
深入理解Kubernetes:容器编排的基石
深入理解Kubernetes:容器编排的基石
|
3月前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
141 4

热门文章

最新文章