注意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的数据持久化完成。