kubernetes使用nfs创建pvc部署mysql stateful的方法

kubernetes创建的pod默认都是无状态的,换句话说删除以后不会保留任何数据。

所以对于mysql这种有状态的应用,必须使用持久化存储作为支撑,才能部署成有状态的stateful.

最简单的方法就是使用nfs作为网络存储,因为nfs存储很容易被所有节点所共享。

首先安装nfs

安装nfs非常简单。一条命令就可以完成

yum install nfs-utils

nfs-utils必须在所有节点都安装,因为除了nfs-server, 其他node节点需要nfs客户端才能访问nfs存储。

然后创建nfs共享的目录,比如/nfs-mysql

mkdir /nfs-mysql

接着配置/etc/exports把上面的目录写进去, vim /etc/exports

/nfs-mysql 192.168.10.0/24(rw,no_root_squash)

备注:

192.168.10.0/24表示nfs存储共享的ip段,

rw表示可读写,

no_root_squash表示允许nfs客户端保留跟它原来客户端主机上一样的身份权限,这么说有点拗口,简单说:就是nfs客户端可以通过chown命令切换/nfs-mysql目录的身份和权限

为什么要这样设置: 因为nfs默认会将nfs客户端的身份映射为匿名用户,这样一来像mysql一旦chown切换身份就会失败。

man exports就可以看到root_squash和no_root_squash的作用

 然后启动nfs-server,这样nfs存储就搞好了

systemctl start nfs-server

nfs增加共享资源,使其生效的命令是:

 exportfs -fr

nfs客户端通过showmount -e ${nfs服务器ip} 就可以查看到远程nfs服务器共享的资源:

然后下面讲重点,怎么利用nfs创建pvc存储。

首先第一步创建pv存储卷:


# 创建pv存储卷

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-mysql 
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "nfs-mysql"
  nfs:
    path: /nfs-mysql  # nfs服务器上定义的挂载地址, 也就是/etc/exports里面定义的
    server: 192.168.10.20 # nfs服务器的地址

 

 第二步: 向上面创建的pv存储卷申请存储空间

# 向pv申请空间
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc-mysql  这个pvc的名称就是后面stateful要使用到的,非常重要
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs-mysql"
  resources:
    requests:
      storage: 1Gi

 注意: 上面两个storageClassName的值必须是一样的。

然后pv和pvc就创建好了。

 上面pvc状态显示Bound,表示pvc跟pv已经绑定成功。

你可以理解为pv就是一个存储池, 而pvc就是从里面拿出来的存储资源

mysql就是使用这个创建好的pvc来做持久化存储的。

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: mysql-db-deploy
  namespace: default
  labels:
    k8s-app: mysql-db-app
spec:
  replicas: 1
  serviceName: mysql-db-app-service  #此字段必须有,stateful规定的
  selector:
    matchLabels:
      k8s-app: mysql-db-app
  template:
    metadata:
      labels:
        k8s-app: mysql-db-app
        name: mysql-db-app
    spec:
      containers:
      - image: registry.myharbor.com/library/mysql:5.7
        name: mysql-db-app
        ports:
        - name: admin
          containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
        volumeMounts:
        - name: data-pv
          mountPath: /var/lib/mysql

      volumes:
      - name: data-pv
        persistentVolumeClaim:
          claimName: nfs-pvc-mysql # 使用已存在的 PVC 的名称

---
kind: Service
apiVersion: v1
metadata:
  name: mysql-db-svc
  namespace: default
spec:
  selector:
    k8s-app: mysql-db-app
  ports:
    - protocol: TCP
      port: 3306
      name: admin
      nodePort: 30306
  type: NodePort

 

重点在我标红的地方: 主要就是volumeMounts和volumes配置这两个地方

claimName的值就是上面已经创建好的pvc的名字

volumeMounts选项是containers二级子配置

volumes跟containers字段是同级关系

serviceName字段必须有

这样mysql stateful就配好了,你可以测试一下: 就是删除了mysql pod,然后重新自动创建mysql pod, mysql的数据也不会丢失, 这就是stateful的作用

注意点 

1. 创建pv时,nfs下path必须是提前存在的,而且是远程nfs设置的挂载路径

否则会报错:

mounting xxx:/nfs_share failed, reason given by server: No such file or directory

2.  mysql stateful配置中volumes.persistentVolumeClaim.claimName字段的值必须是已创建pvc的名称,不能是pv的名称, 否则会报错: MountVolume.SetUp failed for volume "nfs-pv" : mount failed

3. nfs exports中的配置必须要有no_root_squash选项,否则创建mysql pod就会报错:

chown: changing ownership of '/var/lib/mysql/': Operation not permitted

4. mysql所使用的pvc的挂载目录必须是空的,否则mysql pod会报错:

[ERROR] --initialize specified but the data directory has files in it. Aborting.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/187276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…

激活函数与非线性化:探索神经网络中的关键元素

随着人工智能领域的迅猛发展&#xff0c;神经网络成为实现各种复杂任务的有力工具。其中&#xff0c;激活函数及其非线性化特性扮演着至关重要的角色。本文将深入探讨激活函数的基本概念、作用原理以及常见的几种激活函数&#xff0c;并介绍它们在神经网络中发挥的重要作用。 …

Odoo:行业领先的免费开源生产制造管理系统

产品生命周期管理 用 Odoo 产品数据管理解决方案加速产品开发 研究、开发和设计新产品或者重新设计现有产品是所有制造企业的活力之源&#xff0c;但很多企业的设计部门和工程部门却完全脱离 ERP 系统。这导致工程师需要耗费大量时间来回答企业中其他部门就产品状态、修改级别…

【小技巧】复制一个模块到你的工程(学习阶段很实用)

问题描述&#xff1a; 当我们学习Springboot时&#xff0c;需要创建大量的模块&#xff0c;而这些模块的许多代码都是重复的&#xff0c;只有模块名等相关的信息不一样&#xff0c;现在就教你如何快速创建一个模块。 应用场景&#xff1a; ①进入项目文件夹&#xff1a; ②复…

Java实现—数据结构 1.初识集合框架

一、什么是集合框架 Java集合框架&#xff0c;又被称为容器&#xff0c;是定义在java.util包下的一组接口interfaces和其实现类classes 其主要表现为将多个元素element置于一个单元中&#xff0c; 集合框架是由若干个类组成的&#xff0c;每个类的背后就是一种数据结构&…

webpack 打包优化

在vue.config.js中配置 下载 uglifyjs-webpack-plugin 包 const { defineConfig } require("vue/cli-service"); var path require("path");module.exports defineConfig({transpileDependencies: true,filenameHashing: false, // 去除Vue打包后.cs…

window获取密码工具

工具getpass.exe 运行输出密码到5.txt 工具gethashes.exe 运行之后输入到6.txt,会得到一个$local 再运行gethashes.exe $local 可以看到加密的账户密码&#xff0c;用工具进行解密就可以得到密码 工具pwdump7 还有其他的mimikatz&#xff0c;msf工具都可以获取。

canvas扩展001:利用fabric绘制图形,可以平移,旋转,放缩

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

frp V0.52.3 搭建

下载 https://github.com/fatedier/frp/releases/ 此版本暂时没有windows的&#xff0c;想在windows使用请下载v0.52.2 简易搭建 frps.toml的配置文件&#xff0c;以下12000、8500需要在云服务器中的防火墙中开放tcp # bindPort为frps和frpc通信的端口&#xff0c;需要在防…

Git控制指令

git status查看当前本地分支的修改状态 git diff 文件路径 查看具体文件的修改内容 git log打印用户信息 git remote -v查看远程地址 git checkout -- *还原被删除的文件 git rm -r --force .删除本地所有文件 git commit -m "Remove all files from repositor…

基于C#实现外排序

一、N 路归并排序 1.1、概序 我们知道算法中有一种叫做分治思想&#xff0c;一个大问题我们可以采取分而治之&#xff0c;各个突破&#xff0c;当子问题解决了&#xff0c;大问题也就 KO 了&#xff0c;还有一点我们知道内排序的归并排序是采用二路归并的&#xff0c;因为分治…

crontab 定时检测 Tomcat 状态脚本实现及注意事项

背景 Jenkins 所在的 Tomcat 总是莫名挂掉&#xff0c;虽然任务配置了 NOKILLME 参数&#xff0c;而且并不是总是发生在编译完成后才挂的。怀疑是机器资源不足导致的&#xff0c;没有依据。最简单的办法是创建一个定时任务&#xff0c;检测 Tomcat 状态&#xff0c;不见了就拉…

京东家用电器商品电子说明书在哪里能找到怎么查看产品电子说明书?草柴返利APP如何查询领取京东优惠券拿京东购物返利?

京东商品电子说明书是一种便捷、高效的说明工具&#xff0c;为消费者了解和使用商品提供了重要帮助。京东商品电子说明书是一种以电子文档、图文、视频的形式提供的商品使用说明书。它通常由商家上传至京东平台&#xff0c;以供消费者在购买商品后下载查看。与传统的纸质说明书…

用 VirtualBox 安装 OpenWrt 等 Linux 系统,无法启动的解决办法

用 VirtualBox 安装 OpenWrt 等 Linux 系统&#xff0c;无法启动的解决办法 最近新买了台联想小新 Pro 14 2023 锐龙版&#xff0c;因为有 32GB 的运行内存&#xff0c;所以想安装虚拟机以充分发挥。一开始使用 Hyper-V 来安装可以正常使用&#xff0c;但是后面想使用 Virtual…

【Redis基础】Redis安装及管理详细教程

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 1&#xff0c;UBuntu安装Redis 1&#xff0c;使用su命令切换到root用户 su2&#xff0c;使用se…

小程序项目:node+vue基于微信小程序的校园盲盒小程序的设计与实现

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

openEuler20.03学习01-创建虚拟机

赶个时髦&#xff0c;开始学习openEuler 20.03 (LTS-SP3) 操作系统iso下载地址&#xff1a;https://repo.openeuler.openatom.cn/openEuler-20.03-LTS-SP3/ISO/x86_64/openEuler-20.03-LTS-SP3-x86_64-dvd.iso 公司有现成的vmware环境&#xff0c;创建虚拟机i测试&#xff0c…

Rust UI开发(二):iced中如何为窗口添加icon图标

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇&#xff1a; Rust UI开发&#xff1a;使用iced构建UI时&#xff0c;如何在界面显示中文字符 本篇是系…

webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍

计算一个脉冲响应和输入信号的卷积&#xff0c;除了使用原始的时域卷积以外&#xff0c;还有如下方法&#xff1a; FFT卷积的方法&#xff1a;对输入信号&#xff08;长度M&#xff09;和脉冲响应&#xff08;长度N&#xff09;分别补零到K&#xff08;K>MN-1)&#xff0c;…

电子学会C/C++编程等级考试2021年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:石头剪刀布 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头…