本次实验是以前面的实验为基础,使用的是模拟使用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

/data *(rw,no_root_squash)

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

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

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

Export list for docker-server3:
/data *

1.2 到server1上进行挂载测试

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

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

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

apiVersion:  apps/v1
kind: Deployment
metadata:
name: mysql
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
volumes:
- name: mydata
nfs:
server: 192.168.132.133
path: /data/mysql
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: mydata
mountPath: /var/lib/mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: RedHat123
- name: MYSQL_DATABASE
value: wordpress

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

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

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

-rw-r----- 1 polkitd ssh_keys       56 Jan 17 22:29 auto.cnf
-rw------- 1 polkitd ssh_keys 1676 Jan 17 22:29 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 ca.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 client-cert.pem
-rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 client-key.pem
-rw-r----- 1 polkitd ssh_keys 1346 Jan 17 22:29 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Jan 17 22:29 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Jan 17 22:30 ibtmp1
drwxr-x--- 2 polkitd ssh_keys 4096 Jan 17 22:29 mysql
drwxr-x--- 2 polkitd ssh_keys 8192 Jan 17 22:29 performance_schema
-rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys 452 Jan 17 22:29 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 server-cert.pem
-rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 server-key.pem
drwxr-x--- 2 polkitd ssh_keys 8192 Jan 17 22:29 sys
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

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteMany
nfs:
server: 192.168.132.133
path: "/data"

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

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

NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
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

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi

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

persistentvolumeclaim/pvc1 created

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

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

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

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

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

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

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

Name:          pvc1
Namespace: default
StorageClass:
Status: Pending
Volume:
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"pvc1","namespace":"default"},"spec":{"accessModes":...
Finalizers: [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode: Filesystem
Mounted By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
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

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1G

pvc资源只能删除重建

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

persistentvolumeclaim "pvc1" deleted

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

persistentvolumeclaim/pvc1 created

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

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

已经绑定

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

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

2.4 mysql使用pvc绑定

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

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rwo.yaml
spec:
capacity:
storage: 10G
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.132.133
path: "/data/mysql11"

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

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

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-rwo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10G

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

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

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

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

挂载到数据库

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

apiVersion:  apps/v1
kind: Deployment
metadata:
name: mysql
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
# volumes:
# - name: mydata
# nfs:
# server: 192.168.132.133
# path: /data/mysql
volumes:
- name: mydata
persistentVolumeClaim:
claimName: pvc-rwo
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: mydata
mountPath: /var/lib/mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: RedHat123
- name: MYSQL_DATABASE
value: wordpress

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

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

total 188484
-rw-r----- 1 polkitd ssh_keys 56 Jan 18 00:46 auto.cnf
-rw------- 1 polkitd ssh_keys 1676 Jan 18 00:46 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 ca.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 client-cert.pem
-rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 client-key.pem
-rw-r----- 1 polkitd ssh_keys 1346 Jan 18 00:46 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Jan 18 00:46 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Jan 18 00:46 ibtmp1
drwxr-x--- 2 polkitd ssh_keys 4096 Jan 18 00:46 mysql
drwxr-x--- 2 polkitd ssh_keys 8192 Jan 18 00:46 performance_schema
-rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys 452 Jan 18 00:46 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 server-cert.pem
-rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 server-key.pem
drwxr-x--- 2 polkitd ssh_keys 8192 Jan 18 00:46 sys
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. 由电脑专卖系统引发的Java设计模式:访问者模式

    目录 定义 意图 解决问题 何时使用 优缺点 结构 电脑专卖系统 定义 访问者模式是对象的行为型模式,它的目的是封装一些施加于某些数据结构元素之上的操作,一旦这些操作需要修改的话,接收这个操作的数据结 ...

  2. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...

  3. 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...

  4. 基于三层交换机的VRRP技术--MSTP、VRRP的综合运用

    MSTP (多生成树) 每个VLAN或者几个VLAN拥有一颗生成树,基于实例的生成树.instance 1.instance 2 每个实例拥有一颗生成树.MSTP可以实现多VLAN 的负载分担,可以实 ...

  5. Windows核心编程 第十八章 堆栈

    第1 8章 堆 栈 对内存进行操作的第三个机制是使用堆栈.堆栈可以用来分配许多较小的数据块.例如,若要对链接表和链接树进行管理,最好的方法是使用堆栈,而不是第 1 5章介绍的虚拟内存操作方法或第1 7 ...

  6. 码农飞升记-03-OpenJDK是什么?

    目录 1.OpenJDK 概述 2.OpenJDK 的发展史 3.OpenJDK Community 1.角色定义 Participant(参与者) Contributor(贡献者) OpenJDK ...

  7. Root mapping definition has unsupported parameters

    使用ElasticSearch创建映射报错 Root mapping definition has unsupported parameters 原因 使用的ES版本为7.2.0,不再支持创建指定类型 ...

  8. controller通过map返回减少dto类的创建

    更多精彩关注公众号 不要把实体类对象直接返给前端 ,首先想到的是创建DTO,但是这样就造成大量的DTO,显得很臃肿,为了减少dto的数量,像一些比较少的参数避免创建不必要的DTO,通过本次优化达到业务 ...

  9. 【转】浅谈自动特征构造工具Featuretools

    转自https://www.cnblogs.com/dogecheng/p/12659605.html 简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python ...

  10. 用Taro写一个微信小程序(二)——配置目录别名

    配置别名可以方便书写代码引用路径,让代码更整洁. 官方文档可参考https://nervjs.github.io/taro/docs/config-detail#alias 一.在config/ind ...