注意yaml配置文件中的注言,与格式的缩进

一、
1.Persistent Volume,即PV,是集群中已由管理员配置的一段网络存储,相当于一个存储卷,一块存储盘。由管理员或者由StorageClass,存储类自动管理。
2.Persistent Volume Claim,即PVC,是用户存储的请求,相当于Pod,Pod消耗节点资源,而PVC消耗存储资源,通俗点说就是,pv是创建的总空间,pvc从总空间中申请空间使用。
3.PV的访问控制类型(accessModes):
(1)ReadWriteOnce:访问模式为只能以读写的方式挂载到单个节点
(2)ReadWriteMany:访问模式为只能以读写的方式挂载到多个节点
(3)ReadOnlyOnce:访问模式为只能以只读的方式挂载到单个节点
4.PV的空间回收策略(persistentVolumeReclaimPolicy):
(1)Recycle:自动清除数据。
(2)Retain:需要管理员手动回收。
(3)Delete:云存储专用。
5.PV与PVC相互的关联,通过的是accessModes(访问模式)和storageClassName(存储类的名字)来定义的。

二、用MySQL实验模拟数据持久化的作用:

**1.首先搭建NFS共享服务:**

1.[root@master ~]# yum install -y nfs-utils rpcbind  #这里注意三台都要安装NFS服务。
2.[root@master ~]# vim /etc/exports  
3./nfsdata  *(rw,sync,no_root_squash)  
4.[root@master ~]# mkdir /nfsdata  
5.[root@master ~]# systemctl start rpcbind  
6.[root@master ~]# systemctl start nfs-server.service   
7.[root@master ~]# showmount -e  
8.Export list for master:  
9./nfsdata *  
**2.创建PV资源对象:**

1.[root@master ~]# mkdir yaml  
2.[root@master ~]# cd yaml/  
3.[root@master yaml]# vim nfs-pv.yaml   
4.  
5.apiVersion: v1  
6.kind: PersistentVolume  
7.metadata:  
8.  name: lbh-pv  
9.spec:  
10.  capacity:  
11.    storage: 1Gi  
12.  accessModes:  
13.    - ReadWriteOnce          #访问模式为只能以读写的方式挂载单个节点。
14.  persistentVolumeReclaimPolicy: Retain  #PV空间回收策略为手动回收。
15.  storageClassName: nfs          #定义存储类的名字
16.  nfs:  
17.    path: /nfsdata/lbh-pv  
18.    server: 192.168.2.50  
执行yaml文件,查看状态:

1.[root@master yaml]# kubectl apply -f nfs-pv.yaml   
2.persistentvolume/lbh-pv created  
3.[root@master yaml]# kubectl get pv  
4.NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE  
5.lbh-pv   1Gi        RWO            Retain         **  Available **          nfs                     27s  **注意pv的状态Available:**

PV创建成功。

**3.创建PVC资源对象:**

1.[root@master yaml]# vim nfs-pvc.yaml   
2.  
3.apiVersion: v1  
4.kind: PersistentVolumeClaim  
5.metadata:  
6.  name: lbh-pvc  
7.spec:  
8.  accessModes:  
9.    - ReadWriteOnce   #这里的访问模式必须与PV资源一致
10.  resources:  
11.    requests:  
12.      storage: 1Gi  
13.  storageClassName: nfs      #存储类的名字,必须与PV资源一致
**执行yaml文件,查看PVC及PV状态:**

1.[root@master yaml]# kubectl apply -f nfs-pvc.yaml   
2.persistentvolumeclaim/lbh-pvc created  
3.[root@master yaml]# kubectl get pv  
4.NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE  
5.lbh-pv   1Gi        RWO            Retain           **Bound **   default/lbh-pvc   nfs                     3m55s  
6.[root@master yaml]# kubectl get pvc  
7.NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE  
8.lbh-pvc  ** Bound**    lbh-pv   1Gi        RWO            nfs            10s  
```注意是否关联Bound:

4.创建Deployment资源对象,镜像为mysql:5.6
节点提前下载镜像:

1.[root@node01 ~]# docker pull mysql:5.6  
2.[root@node02 ~]# docker pull mysql:5.6  

**创建Deployment资源对象:**

1.[root@master yaml]# vim mysql.yaml   
2.  
3.apiVersion: extensions/v1beta1  
4.kind: Deployment  
5.metadata:  
6.  name: lbh-mysql  
7.spec:  
8.  selector:  
9.    matchLabels:  
10.      app: mysql  
11.  template:  
12.    metadata:  
13.      labels:  
14.        app: mysql  
15.    spec:  
16.      containers:  
17.      - image: mysql:5.6  
18.        name: mysql  
19.        env:         #定义变量,这里定义MySQL数据库的密码
20.        - name: MYSQL_ROOT_PASSWORD  
21.          value: 123.com  
22.        volumeMounts:  
23.        - name: mysql-storage  
24.          mountPath: /var/lib/mysql          #数据库的数据存放目录,对这个目录做持久化
25.      volumes:  
26.      - name: mysql-storage  
27.        persistentVolumeClaim:  
28.          claimName: lbh-pvc         #指定PVC资源。
**执行yaml文件,查看状态:**
1.[root@master yaml]# kubectl apply -f mysql.yaml   
2.deployment.extensions/lbh-mysql created  
3.[root@master yaml]# kubectl get pod  
4.NAME                         READY   STATUS              RESTARTS   AGE  
5.lbh-mysql-59778fd8d6-xhk7h   0/1     ContainerCreating   0          3m7s  
**这时候容器一直处于容器创建中,可以采用四种方式来排错:
(1)使用kubectl describe命令来查看Pod的详细信息。
(2)使用kubectl logs命令来查看Pod的日志,因为容器没有创建成功,所以不存在日志。
(3)查看本机的message日志
(4)查看kubelet的日志。**
使用kubectl describe命令查看Pod的详细信息:
[root@master yaml]# kubectl describe pod lbh-mysql-59778fd8d6-xhk7h 
最后一条信息:
mount.nfs: mounting 192.168.2.50:/nfsdata/lbh-pv failed, reason given by server: No such file or directory
根据提示得出,在挂载NFS存储目录时,指定的目录不存在。
进行创建目录,再次查看Pod'状态:

1.[root@master yaml]# mkdir -p /nfsdata/lbh-pv  
2.[root@master yaml]# kubectl get pod  
3.NAME                         READY   STATUS    RESTARTS   AGE  
4.lbh-mysql-59778fd8d6-xhk7h   1/1     Running   0          12m  

Deployment资源创建成功。

**5.进入MySQL数据库,创建测试数据。**

1.[root@master yaml]# kubectl exec -it lbh-mysql-59778fd8d6-xhk7h -- mysql -uroot -p123.com  
2.mysql> show databases;    #查看数据库。
3.+--------------------+  
4.| Database           |  
5.+--------------------+  
6.| information_schema |  
7.| mysql              |  
8.| performance_schema |  
9.+--------------------+  
10.3 rows in set (0.01 sec)  
11.  
12.mysql> create database lbh;      #创建数据库。
13.  
14.mysql> use lbh;          #选择使用的数据库。
15.Database changed  
16.mysql> create table lbh_id( id int(4));      #创建表。
17.  
18.mysql> insert lbh_id values(9224);       #在表中插入数据。
19.  
20.mysql> select * from lbh_id;             #查看表中所以数据。
21.+------+  
22.| id   |  
23.+------+  
24.| 9224 |  
25.+------+  
26.1 row in set (0.00 sec)  
27.  
28.mysql> exit  

在本地查看数据:
1.[root@master yaml]# ls /nfsdata/lbh-pv/  
2.auto.cnf  ibdata1  ib_logfile0  ib_logfile1  lbh  mysql  performance_schema  

数据存在。
**6.查看Pod运行在哪个节点,关闭对应的节点上的kubelet,查看是否重新创建Pod,创建后的Pod数据是否还存在:**

1.[root@master yaml]# kubectl get pod -o wide  
2.NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES  
3.lbh-mysql-59778fd8d6-xhk7h   1/1     Running   0          26m   10.244.1.4   node01                
4.  
5.[root@node01 ~]# systemctl stop kubelet.service   
6.  
7.[root@master yaml]# kubectl get pod -o wide -w  
8.lbh-mysql-59778fd8d6-xhk7h   1/1     Running   0          28m   10.244.1.4   node01                
9.lbh-mysql-59778fd8d6-xhk7h   1/1     Terminating   0          33m   10.244.1.4   node01                
10.lbh-mysql-59778fd8d6-cf6g4   0/1     Pending       0          0s                           
11.lbh-mysql-59778fd8d6-cf6g4   0/1     Pending       0          0s           node02                
12.lbh-mysql-59778fd8d6-cf6g4   0/1     ContainerCreating   0          1s           node02                
13.lbh-mysql-59778fd8d6-cf6g4   1/1     Running             0          2s    10.244.2.9   node02          
**Pod重新创建成功,进入Pod查看数据是否存在:**

1.[root@master yaml]# kubectl get pod -o wide  
2.NAME                         READY   STATUS        RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES  
3.lbh-mysql-59778fd8d6-cf6g4   1/1     Running       0          12s   10.244.2.10   node02                
4.lbh-mysql-59778fd8d6-xhk7h   1/1     Terminating   0          44m   10.244.1.4    node01                
5.  
6.[root@master yaml]# kubectl exec -it lbh-mysql-59778fd8d6-cf6g4 -- mysql -uroot -p123.com  
7.mysql> show databases;  
8.+--------------------+  
9.| Database           |  
10.+--------------------+  
11.| information_schema |  
12.| lbh                |  
13.| mysql              |  
14.| performance_schema |  
15.+--------------------+  
16.4 rows in set (0.01 sec)  
17.  
18.mysql> use lbh  
19.Database changed  
20.mysql> select * from lbh_id;  
21.+------+  
22.| id   |  
23.+------+  
24.| 9224 |  
25.+------+  
26.1 row in set (0.00 sec)  
数据还存在,再次查看本地的文件:
1.[root@master yaml]# ls /nfsdata/lbh-pv/  
2.auto.cnf  ibdata1  ib_logfile0  ib_logfile1  lbh  mysql  performance_schema  

MySQL的数据持久化完成。