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.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派上使用Nginx通过内网穿透实现无公网IP访问内网本地站点

前言 安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Nginx 的内存占用率非常低,可以在树莓派等资源受限的设备上运行。同时结合c…

Unity Android FireBase bugly报错查询

报错如下图,注意,标红的三处 使用的il2cpp和架构是arm64-v8a 那我们就可以根据这些去找对应的符号表,在unity安装目录下 Unity2020.3.33f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Symbols\arm64-v8a 找到l…

应用场景丨社区燃气管网监测系统建设

燃气作为现代社会的重要能源,燃气被广泛应用于居民生活、工业生产、商业服务等领域。然而,燃气泄漏事故时有发生,不仅给人们的生命财产安全带来严重威胁,也给燃气行业的发展带来不良影响。因此,对于燃气管道的监测和管…

能量不够,AI帮助

问CHAT:有关工程管理的中文参考文献 CHAT回复: 1. 余庆麟. (2009). 工程项目管理[M]. 北京: 机械工业出版社. 2. 刘宁. (2013). 工程建设管理[M]. 北京:清华大学出版社. 3. 谈刚,陈嘉春,尚雅凡. (2014).…

安防系统智能视频监控中出现画面异常该如何自检?

大家都知道,在当今社会,摄像头无处不在,除了常见的生活与工作场景中,在一些无法人员无法长期驻点场景,如野生动物监测、高空作业监控、高压电缆监控等场景,在这些地方安装摄像头就是为方便日常监控。但是由…

maven 将Jar包安装到本地仓库

window系统: 注意事项:在windows中,使用mvn指令将jar安装到本地仓库时,一定要将相关资源使用“"”包裹上,不然会报下面的错: mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…

喜讯!云起无垠成为国家信息安全漏洞库(CNNVD)技术支撑单位

近日,云起无垠凭借其在漏洞挖掘、漏洞检测以及漏洞修复等领域的卓越表现,荣获“国家信息安全漏洞库(CNNVD)技术支撑单位等级证书(三级)”,正式成为CNNVD技术支撑单位。 中国国家信息安全漏洞库&…

Vatee万腾科技的数字化奇迹:Vatee创新力量的前瞻探讨

在数字化的潮流中,Vatee万腾科技以其独特而强大的创新力量,创造了一系列数字化奇迹,引领着科技的前沿发展。这不仅是对技术的突破,更是对未来的深刻探讨,为整个数字化时代描绘出一幅充满奇迹的画卷。 Vatee万腾以创新为…

【GCC】1:chatgpt:NetworkControllerInterface、GoogCcNetworkController

代码基于 mediasoup-sfu-cpp 中的m77版本。使用chatgpt辅助学习。网络状态估计器:开发中 D:\XTRANS\soup\mediasoup-sfu-cpp\deps\libwebrtc\libwebrtc\api\transport\network_control.h NetworkControllerInterface 网络控制器 此类,使用 网络状态和 通信状态 以 估计网络参…

mysql 更改密码

由于两台设备的mysql数据库的密码不一样,开发时每次连接数据库都需要更改配置文件,所以想修改一下mysql数据库的密码。 mysql 修改密码千万不要直接修改,直接修改的话会出现两种情况: 1,修改成功,无法登录。…