1. 安装NFS
kub-master 制作nfs服务端作为共享文件系统
[root@kub-master ~]# yum install -y nfs-utils rpcbind
[root@kub-master ~]# mkdir /opt/nfs/ #制作共享目录
[root@kub-master ~]# echo "/opt/nfs 10.36.192.177/24(rw,no_root_squash)" >> /etc/exports
[root@kub-master ~]# systemctl start rpcbind #启动服务
[root@kub-master ~]# systemctl start nfs
[root@kub-master ~]# exportfs -r # 使配置生效
[root@kub-master ~]# exportfs # 检查配置是否生效
/opt/nfs 10.36.192.177/24
#集群中的工作节点都需要安装客户端工具,主要作用是节点能够驱动 nfs 文件系统
只安装,不启动服务
kub-node1节点
[root@kub-node1 ~]# yum install -y nfs-utils
[root@kub-node1 ~]# showmount -e 10.36.192.177
Export list for 10.36.192.177:
/opt/nfs 10.36.192.177/24
[root@kub-node1 ~]# mkdir /opt/nfs/
[root@kub-node1 ~]# mount -t nfs 10.36.192.177:/opt/nfs /opt/nfs
[root@kub-node1 ~]# echo "10.36.192.177:/opt/nfs /opt/nfs nfs defaults 0 0" >> /etc/fstab
kub-node2节点
[root@kub-node2 ~]# yum install -y nfs-utils
[root@kub-node2 ~]# showmount -e 10.36.192.177
Export list for 10.36.192.177:
/opt/nfs 10.36.192.177/24
[root@kub-node2 ~]# mkdir /opt/nfs/
[root@kub-node2 ~]# mount -t nfs 10.36.192.177:/opt/nfs /opt/nfs
[root@kub-node2 ~]# echo "10.36.192.177:/opt/nfs /opt/nfs nfs defaults 0 0" >> /etc/fstab
master节点
制作pv.yaml(一般这个动作由 kubernetes 管理员完成)
[root@kub-master ~]# mkdir /k8s/mysql -p
[root@kub-master ~]# cd /k8s/mysql/
[root@kub-master mysql]# vim pv.yaml
apiVersion: v1
kind: PersistentVolume #类型定义为pv
metadata:
name: my-pv #pv的名字
labels: #定义标签
type: nfs #类型为nfs
spec:
nfs: # 存储类型,需要与底层实际的存储一致,这里采用 nfs
server: 10.36.192.177 # NFS 服务器的 IP
path: "/opt/nfs" # NFS 上共享的目录
capacity: #定义存储能力
storage: 15Gi #指定存储空间
accessModes: #定义访问模式
- ReadWriteMany #读写权限,允许被多个Node挂载
persistentVolumeReclaimPolicy: Retain #定义数据回收策略,这里是保留
2.PV参数详解
1.存储能力(Capacity)
描述存储设备的能力,目前仅支持对存储空间的设置(storage=xx)。
2.访问模式(Access Modes)
对PV进行访问模式的设置,用于描述用户应用对存储资源的访问权限。访问模式如下:
ReadWriteOnce:读写权限,并且只能被单个pod挂载。 #mysql只能使用此模式
ReadOnlyMany:只读权限,允许被多个pod挂载。
ReadWriteMany:读写权限,允许被多个pod挂载。
某些PV可能支持多种访问模式,但PV在挂载时只能使用一种访问模式,多种访问模式不能同时生效。
3.persistentVolumeReclaimPolicy定义数据回收策略
目前支持如下三种回收策略:
保留(Retain):保留数据,需要手工处理。
回收空间(Recycle):警告: 回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态供应。如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的 擦除(rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领
删除(Delete):会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会从外部基础设施(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中移除所关联的存储资产。 就是把云存储一起删了。
目前,只有 NFS 和 HostPath 两种类型的存储设备支持 “Recycle” 策略; AWS EBS、 GCE PD、Azure Disk 和 Cinder volumes 支持 “Delete” 策略。
4.storageClassName存储类别(Class)
PV可以设定其存储的类型(Class),通过 storageClassName参数指定一个 StorageClass 资源对象的名称。
具有特定“类别”的 PV 只能与请求了该“类别”的 PVC 进行绑定。未设定 “类别” 的 PV 则只能与不请求任何 “类别” 的 PVC 进行绑定。
相当于一个标签。
3.创建pv
[root@kub-master mysql]# kubectl apply -f pv.yaml
persistentvolume/my-pv created
[root@kub-master mysql]# kubectl get pv #查看是否创建成功
PV 生命周期的各个阶段(Phase)
某个 PV 在生命周期中,可以处于以下4个阶段之一:
- Available:可用状态,还未与某个 PVC 绑定。
- Bound:已与某个 PVC 绑定。
- Released:释放,绑定的 PVC 已经删除,但没有被集群回收存储空间 。
- Failed:自动资源回收失败。
pv创建成功目前属于可用状态,还没有与pvc绑定,那么现在创建pvc
创建pvc
[root@kub-master mysql]# vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim #定义类型为PVC
metadata:
name: mypvc #声明pvc的名称,当做pod的卷使用时会用到
spec:
accessModes: #定义访问pvc的模式,与pv拥有一样的模式
- ReadWriteMany #读写权限,允许被多个pod挂载
resources: #声明可以请求特定数量的资源,目前仅支持 request.storage 的设置,即存储空间大小。
requests:
storage: 5Gi #定义空间大小
selector: #PV选择条件,标签选择器,通过标签选择
matchLabels:
type: "nfs" #选择pv类型的nfs
#注意:当我们申请pvc的容量大于pv的容量是无法进行绑定的。
创建pvc
[root@kub-master mysql]# kubectl apply -f mysql-pvc.yaml
persistentvolumeclaim/mypvc created
[root@kub-master mysql]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound my-pv 15Gi RWX 22s
status状态- Available (可用): 表示可用状态,还未被任何PVC绑定
– Bound (已绑定):已经绑定到某个PVC
– Released (已释放):对应的PVC已经删除,但资源还没有被集群收回
– Failed:PV自动回收失败
Kubernetes中会自动帮我们查看pv状态为Available并且根据声明pvc容量storage的大小进行筛选匹配,同时还会根据AccessMode进行匹配。如果pvc匹配不到pv会一直处于pending状态。
4.mysql使用pvc持久卷
创建secret
[root@kub-master mysql]# echo -n 'QWQ123456' | base64
UVdRMTIzNDU2
[root@kub-master mysql]# vim mysql-secret.yaml
apiVersion: v1
data:
password: UVdRMTIzNDU2
kind: Secret
metadata:
annotations:
name: my-pass
type: Opaque
[root@kub-master mysql]# kubectl apply -f mysql-secret.yaml
secret/my-pass created
[root@kub-master mysql]# kubectl get secret
NAME TYPE DATA AGE
default-token-6f8dv kubernetes.io/service-account-token 3 9d
my-pass Opaque 1 35s
mysa-token-6kqqf kubernetes.io/service-account-token 3 6d2h
创建myslq-pod文件
[root@kub-master mysql]# vim mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: my-mysql
image: mysql:5.7.43
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: my-pass
key: password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
persistentVolumeClaim: #绑定pvc
claimName: mypvc #指定对应的pvc名字
[root@kub-master mysql]# kubectl apply -f mysql-deployment.yaml
deployment.apps/my-mysql created
[root@kub-master mysql]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-mysql-7476987f55-wwh87 1/1 Running 0 46s
[root@kub-master mysql]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-mysql-7476987f55-wwh87 1/1 Running 0 73s 10.244.61.79 kub-node2 <none> <none>
测试
[root@kub-master mysql]# cd /opt/nfs/
[root@kub-master nfs]# ll
total 188484
-rw-r----- 1 polkitd input 56 Dec 21 19:22 auto.cnf
-rw------- 1 polkitd input 1676 Dec 21 19:22 ca-key.pem
-rw-r--r-- 1 polkitd input 1112 Dec 21 19:22 ca.pem
-rw-r--r-- 1 polkitd input 1112 Dec 21 19:22 client-cert.pem
-rw------- 1 polkitd input 1680 Dec 21 19:22 client-key.pem
-rw-r----- 1 polkitd input 1318 Dec 21 19:22 ib_buffer_pool
-rw-r----- 1 polkitd input 79691776 Dec 21 19:22 ibdata1
-rw-r----- 1 polkitd input 50331648 Dec 21 19:22 ib_logfile0
-rw-r----- 1 polkitd input 50331648 Dec 21 19:22 ib_logfile1
-rw-r----- 1 polkitd input 12582912 Dec 21 19:22 ibtmp1
drwxr-x--- 2 polkitd input 4096 Dec 21 19:22 mysql
lrwxrwxrwx 1 polkitd input 27 Dec 21 19:22 mysql.sock -> /var/run/mysqld/mysqld.sock
drwxr-x--- 2 polkitd input 8192 Dec 21 19:22 performance_schema
-rw------- 1 polkitd input 1680 Dec 21 19:22 private_key.pem
-rw-r--r-- 1 polkitd input 452 Dec 21 19:22 public_key.pem
-rw-r--r-- 1 polkitd input 1112 Dec 21 19:22 server-cert.pem
-rw------- 1 polkitd input 1680 Dec 21 19:22 server-key.pem
drwxr-x--- 2 polkitd input 8192 Dec 21 19:22 sys