本次实验是以前面的实验为基础,使用的是模拟使用kubernetes集群部署一个企业版的wordpress为实例进行研究学习,主要的过程如下:

1.mysql deployment部署, wordpress deployment部署, wordpress连接mysql时,mysql的 pod ip易变

2.为mysql创建 service,申请固定 service lp

3. wordpress外部可访问,使用 node port类型的 service

4. nodeport类型的 service需要映射端口,不是很优雅

5.使用 ingressl

6.mysq1的pod旦被重新调度,数据就会丢失

7. hostpath将pod数据挂载至本地,然后使用标签选择器将mysq1lpod固定在一个节点上

8.共享存储以持久化数据,即使po挂掉,被重新拉起,也能自动挂载存储

本次实验解决使用共享存储数据持久化的问题实验使用NFS作为共享存储

一 使用NFS共享存储

1.1 安装NFS

再server3和server1上安装nfs

[root@docker-server1 ~]# yum -y install nfs-utils

[root@docker-server3 ~]# yum -y install nfs-utils

[root@docker-server3 ~]# vi /etc/exports

  1. /data *(rw,no_root_squash)

[root@docker-server3 ~]# systemctl restart nfs

[root@docker-server3 ~]# systemctl status nfs

[root@docker-server3 ~]# showmount -e

  1. Export list for docker-server3:
  2. /data *

1.2 到server1上进行挂载测试

[root@docker-server1 ~]# mount -t nfs 192.168.132.133:/data /mnt

[root@docker-server1 ~]# df -hT

  1. 192.168.132.133:/data nfs4 47G 7.3G 40G 16% /mnt

[root@docker-server1 ~]# umount /mnt/

nfs配置成功

1.3 数据库使用共享存储挂载卷

[root@docker-server3 ~]# mkdir /data/mysql

[root@docker-server1 deployment]# vi mysql-deployment.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: mysql
  5. namespace: default
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. app: mysql
  11. template:
  12. metadata:
  13. labels:
  14. app: mysql
  15. spec:
  16. volumes:
  17. - name: mydata
  18. nfs:
  19. server: 192.168.132.133
  20. path: /data/mysql
  21. containers:
  22. - name: mysql
  23. image: mysql:5.7
  24. volumeMounts:
  25. - name: mydata
  26. mountPath: /var/lib/mysql
  27. ports:
  28. - containerPort: 3306
  29. env:
  30. - name: MYSQL_ROOT_PASSWORD
  31. value: RedHat123
  32. - name: MYSQL_DATABASE
  33. value: wordpress

[root@docker-server1 deployment]# kubectl get pods -o wide

  1. mysql-857589b5d4-j65d2 1/1 Running 0 20s 10.244.2.20 192.168.132.133 <none>

[root@docker-server3 ~]# ll /data/mysql

  1. -rw-r----- 1 polkitd ssh_keys 56 Jan 17 22:29 auto.cnf
  2. -rw------- 1 polkitd ssh_keys 1676 Jan 17 22:29 ca-key.pem
  3. -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 ca.pem
  4. -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 client-cert.pem
  5. -rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 client-key.pem
  6. -rw-r----- 1 polkitd ssh_keys 1346 Jan 17 22:29 ib_buffer_pool
  7. -rw-r----- 1 polkitd ssh_keys 79691776 Jan 17 22:29 ibdata1
  8. -rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile0
  9. -rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile1
  10. -rw-r----- 1 polkitd ssh_keys 12582912 Jan 17 22:30 ibtmp1
  11. drwxr-x--- 2 polkitd ssh_keys 4096 Jan 17 22:29 mysql
  12. drwxr-x--- 2 polkitd ssh_keys 8192 Jan 17 22:29 performance_schema
  13. -rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 private_key.pem
  14. -rw-r--r-- 1 polkitd ssh_keys 452 Jan 17 22:29 public_key.pem
  15. -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 server-cert.pem
  16. -rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 server-key.pem
  17. drwxr-x--- 2 polkitd ssh_keys 8192 Jan 17 22:29 sys
  18. drwxr-x--- 2 polkitd ssh_keys 20 Jan 17 22:29 wordpress

这样,房mysql的pod是被删除的时候,数据不会丢失

这种方式,可以满足效果,但是当直接对接不同的存储,需要使用不同的对接格式,对于K8S而言,不方便,所以使用PV的格式挂载,即不管使用哪一种存储方式,最终创建一个PV出来,然后K8S直接挂载PV,不用关心底层是哪一种存储

二 持久化卷(PV)

2.1 PV及PVC介绍

PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供网络存储资源,而 PVC 请求存储资源。这样,设置持久化的工作流包括配置底层文件系统或者云数据卷、创建持久性数据卷、最后创建 PVC 来将 Pod 跟数据卷关联起来。PV 和 PVC 可以将 pod 和数据卷解耦,pod 不需要知道确切的文件系统或者支持它的持久化引擎。

PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源。PV 跟 Volume (卷) 类似,不过会有独立于 Pod 的生命周期

1.为了屏蔽 kubernetes对底层存储的差异,有了个申明称之为pv

2. pod在创建时,只需要声明需要一个pV即可,这

3. 创建pv:

  1. 大小10G
  2. 独享还是共享
  3. 从哪种存储申请

4. 创建pvc:

  1. 大小20G
  2. 独享还是共享

2.2 创建一个PV

基于NFS创建PV

[root@docker-server1 yamls]# mkdir /yamls/storage

[root@docker-server1 yamls]# cd /yamls/storage

[root@docker-server1 storage]# vim pv1.yaml

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv1
  5. spec:
  6. capacity:
  7. storage: 1G
  8. accessModes:
  9. - ReadWriteMany
  10. nfs:
  11. server: 192.168.132.133
  12. path: "/data"

[root@docker-server1 storage]# kubectl apply -f pv1.yaml   

[root@docker-server1 storage]# kubectl get pv

  1. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  2. pv1 1G RWX Retain Available 23s

RECLAIM POLICY回收策略

PV的回收策略(persistentVolumeReclaimPolicy,即PVC释放卷的时候PV该如何操作)也有三种

  • Retain,不清理, 保留Volume(需要手动清理)
  • Recycle,删除数据,即rm -rf /thevolume/*(只有NFS和HostPath支持)
  • Delete,删除存储资源,比如删除AWS EBS卷(只有AWS EBS, GCE PD, Azure Disk和Cinder支持)

2.3 创建一个PVC

[root@docker-server1 storage]# vim pvc1.yaml

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: pvc1
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. resources:
  9. requests:
  10. storage: 1Gi

[root@docker-server1 storage]# kubectl apply -f pvc1.yaml

  1. persistentvolumeclaim/pvc1 created

[root@docker-server1 storage]# kubectl get pvc -n kube-system

  1. No resources found in kube-system namespace. #pvc只有在创建的命名空间看到

[root@docker-server1 storage]# kubectl get pv -n kube-system

  1. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  2. pv1 1G RWX Retain Available 8m56s

[root@docker-server1 storage]# kubectl get pvc

  1. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  2. pvc1 Pending 2m8s

[root@docker-server1 storage]# kubectl describe pvc pvc1

  1. Name: pvc1
  2. Namespace: default
  3. StorageClass:
  4. Status: Pending
  5. Volume:
  6. Labels: <none>
  7. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  8. {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"pvc1","namespace":"default"},"spec":{"accessModes":...
  9. Finalizers: [kubernetes.io/pvc-protection]
  10. Capacity:
  11. Access Modes:
  12. VolumeMode: Filesystem
  13. Mounted By: <none>
  14. Events:
  15. Type Reason Age From Message
  16. ---- ------ ---- ---- -------
  17. Normal FailedBinding 7s (x15 over 3m22s) persistentvolume-controller no persistent volumes available for this claim and no storage class is set #没有完全满足的pv可以绑定

这是因为pv是1G,PVC申请的是1Gi,修改如下

[root@docker-server1 storage]# vi pvc1.yaml

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: pvc1
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. resources:
  9. requests:
  10. storage: 1G

pvc资源只能删除重建

[root@docker-server1 storage]# kubectl delete pvc pvc1

  1. persistentvolumeclaim "pvc1" deleted

[root@docker-server1 storage]# kubectl apply -f pvc1.yaml

  1. persistentvolumeclaim/pvc1 created

[root@docker-server1 storage]# kubectl get pvc

  1. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  2. pvc1 Bound pv1 1G RWX 5s

已经绑定

[root@docker-server1 storage]# kubectl get pv

  1. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  2. pv1 1G RWX Retain Bound default/pvc1 16m

2.4 mysql使用pvc绑定

[root@docker-server3 ~]# mkdir /data/mysql11

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv-rwo.yaml
  5. spec:
  6. capacity:
  7. storage: 10G
  8. accessModes:
  9. - ReadWriteOnce
  10. nfs:
  11. server: 192.168.132.133
  12. path: "/data/mysql11"

[root@docker-server1 storage]# kubectl apply -f pv-rwo.yaml

[root@docker-server1 storage]# vi pvc-rwo.yaml

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: pvc-rwo
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. resources:
  9. requests:
  10. storage: 10G

[root@docker-server1 storage]# kubectl get pvc

  1. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  2. pvc-rwo Bound pv-rwo.yaml 10G RWO 6s
  3. pvc1 Bound pv1 1G RWX 10m

[root@docker-server1 storage]# kubectl get pv

  1. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  2. pv-rwo.yaml 10G RWO Retain Bound default/pvc-rwo 101s
  3. pv1 1G RWX Retain Bound default/pvc1 24m

挂载到数据库

[root@docker-server1 storage]# vim /yamls/deployment/mysql-deployment.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: mysql
  5. namespace: default
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. app: mysql
  11. template:
  12. metadata:
  13. labels:
  14. app: mysql
  15. spec:
  16. # volumes:
  17. # - name: mydata
  18. # nfs:
  19. # server: 192.168.132.133
  20. # path: /data/mysql
  21. volumes:
  22. - name: mydata
  23. persistentVolumeClaim:
  24. claimName: pvc-rwo
  25. containers:
  26. - name: mysql
  27. image: mysql:5.7
  28. volumeMounts:
  29. - name: mydata
  30. mountPath: /var/lib/mysql
  31. ports:
  32. - containerPort: 3306
  33. env:
  34. - name: MYSQL_ROOT_PASSWORD
  35. value: RedHat123
  36. - name: MYSQL_DATABASE
  37. value: wordpress

[root@docker-server1 storage]# kubectl apply -f /yamls/deployment/mysql-deployment.yaml

[root@docker-server3 ~]# ll /data/mysql11

  1. total 188484
  2. -rw-r----- 1 polkitd ssh_keys 56 Jan 18 00:46 auto.cnf
  3. -rw------- 1 polkitd ssh_keys 1676 Jan 18 00:46 ca-key.pem
  4. -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 ca.pem
  5. -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 client-cert.pem
  6. -rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 client-key.pem
  7. -rw-r----- 1 polkitd ssh_keys 1346 Jan 18 00:46 ib_buffer_pool
  8. -rw-r----- 1 polkitd ssh_keys 79691776 Jan 18 00:46 ibdata1
  9. -rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile0
  10. -rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile1
  11. -rw-r----- 1 polkitd ssh_keys 12582912 Jan 18 00:46 ibtmp1
  12. drwxr-x--- 2 polkitd ssh_keys 4096 Jan 18 00:46 mysql
  13. drwxr-x--- 2 polkitd ssh_keys 8192 Jan 18 00:46 performance_schema
  14. -rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 private_key.pem
  15. -rw-r--r-- 1 polkitd ssh_keys 452 Jan 18 00:46 public_key.pem
  16. -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 server-cert.pem
  17. -rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 server-key.pem
  18. drwxr-x--- 2 polkitd ssh_keys 8192 Jan 18 00:46 sys
  19. drwxr-x--- 2 polkitd ssh_keys 20 Jan 18 00:46 wordpress

已经重建数据,则PV和PVC简单学习到这里


博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!

011.Kubernetes使用共享存储持久化数据的更多相关文章

  1. hadoop2.x NameNode 的共享存储实现

    过去几年中 Hadoop 社区涌现过很多的 NameNode 共享存储方案, 比如 shared NAS+NFS.BookKeeper.BackupNode 和 QJM(Quorum Journal ...

  2. Kubernetes的故事之持久化存储(十)

    一.Storage 1.1.Volume 官网网址:https://kubernetes.io/docs/concepts/storage/volumes/ 通过官网说明大致总结下就是这个volume ...

  3. 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)

    课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...

  4. Kubernetes创建挂载共享存储的容器

    原文链接:https://www.58jb.com/html/135.html 在上一次的Mysql容器中,已经使用过了配置宿主机目录挂载的方式,这样虽然方便但是不够安全:一般都是把数据存储在远程服务 ...

  5. velero 备份、迁移 kubernetes 应用以及持久化数据卷

    velero 是heptio 团队开源的kubernetes 应用以及持久化数据卷备份以及迁移的解决方案,以前的名字为ark 包含以下特性: 备份集群以及恢复 copy 当前集群的资源到其他集群 复制 ...

  6. Kubernetes安装EFK教程(非存储持久化方式部署)

    1.简介 这里所指的EFK是指:ElasticSearch,Fluentd,Kibana ElasticSearch Elasticsearch是一个基于Apache Lucene的开源搜索和数据分析 ...

  7. k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态

    共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...

  8. SUN平台服务器光纤共享存储互斥失败如何恢复数据?

    服务器数据恢复故障描述: 服务器最初的设计思路为将两台SPARC SOLARIS系统通过光纤交换机共享同一存储作为CLUSTER使用,正常情况下A服务器工作,当A服务器发生故障宕机后即可将其关机然后开 ...

  9. 解决持久化数据太大,单个节点的硬盘无法存储的问题;解决运算量太大,单个节点的内存、CPU无法处理的问题

    需要学习的技术很多,要自学新知识也不是一件容易的事,选择一个自己比较感兴趣的会是一个比较好的开端,于是,打算学一学分布式系统. 带着问题,有目的的学习,先了解整体架构,在深入感兴趣的细节,这是我的计划 ...

随机推荐

  1. 【Prolog - 2.0 基础应用】

    [术语统一 terms unify] 两者统一,只需满足下面两条件之一 1.原本就是相同的 2.包含变量,这些变量可以用术语统一实例化,从而得到相等的术语 mia和mia是统一的,42和42是统一的, ...

  2. 研发效率破局之道 Facebook工作法

    如果你问中国和美国互联网公司都有什么差别,很多人会回答:低效加班文化.最近爆出的996大讨论,通过糙快猛打拼和996加班去抢占市场获得机会的成功案例越来越少.至此,只有提高效能才是出路. 由于软件开发 ...

  3. django-数据库的增删改查操作

    django-数据库的增删改查操作 1.添加用户记录 def login(request): 增加用户记录 使用save()方法来增加记录 username = UserInfo(username=' ...

  4. 消息中间件-RabbitMQ持久化机制、内存磁盘控制

    RabbitMQ持久化机制 RabbitMQ内存控制 RabbitMQ磁盘控制 RabbitMQ持久化机制 重启之后没有持久化的消息会丢失 package com.study.rabbitmq.a13 ...

  5. redis的并发竞争问题是什么?如何解决这个问题?

    这个也是线上非常常见的一个问题,就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 而且 ...

  6. 【笔记】《Redis设计与实现》chapter2 简单动态字符串

    ------------恢复内容开始------------ 2.1 SDS的定义 struct sdshdr{ // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度(不含'\0 ...

  7. Hadoop完整搭建过程(三):完全分布模式(虚拟机)

    1 完全分布模式 完全分布模式是比本地模式与伪分布模式更加复杂的模式,真正利用多台Linux主机来进行部署Hadoop,对集群进行规划,使得Hadoop各个模块分别部署在不同的多台机器上,这篇文章介绍 ...

  8. spring boot 通过feign调用api接口

    目的:远程调用服务器api,直接上步骤: 1,添加maven依赖,这是必须的: <dependency> <groupId>org.springframework.cloud& ...

  9. c协程库libco几点体会

    https://www.cnblogs.com/dearplain/p/9820913.html 这里说的是Tencent开源的libco. libco的用途和依赖 主要还是c/c++服务端,相比li ...

  10. Git 常用命令总结,将会持续更新

    平常在windows电脑上使用Git Extensions 工具比较多,大部分的常用指令都可以通过点点点就可以完成.在mac电脑上的话使用sourcetree工具.但有时候也会直接通过git命令,很多 ...