安装NFS

# 安装nfs
yum -y install nfs-utils rpcbind
#创建nfs共享目录及设置权限
mkdir /nfs/renren -p
chmod 755 /nfs/renren -R
#配置nfs
cat /etc/exports
/nfs/renren *(async,insecure,no_root_squash,no_subtree_check,rw)

启动NFS

systemctl start rpcbind
systemctl enable rpcbind
systemctl status rpcbind
systemctl start nfs
systemctl enable nfs
systemctl status nfs

客户端在使用NFS时,需要安装NFS

#在客户端上安装启动nfs
yum -y install nfs-utils rpcbind
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs
#查看nfs共享
showmount -e k8s-master

创建基于NFS的StorageClass

https://github.com/kubernetes-retired/external-storage.git
主要部署下面这些资源清单,只有deployment.yaml需要修改nfs相关配置

# 部署deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.126.130 #修改nfs服务器地址
- name: NFS_PATH
value: /nfs/renren #nfs目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.126.130 #修改nfs服务器地址
path: /nfs/renren #nfs目录

kubectl apply -f deployment.yaml
#部署rbac
kubectl apply -f rbac.yaml
#部署storageclass
kubectl apply -f class.yaml
#查看创建的资源
kubectl get pods

在pvc中调用storageclass动态提供pv

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-mysql
namespace: renren-fast
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
volumeMode: Filesystem
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi

kubectl apply -f pvc-mysql.yaml

在pod控制器中使用storageclass

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-mysql
namespace: renren-fast
spec:
selector:
matchLabels:
app: statefulset-mysql
serviceName: headless-mysql
volumeClaimTemplates:
- metadata:
name: pvc-mysql
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
template:
metadata:
labels:
app: statefulset-mysql
spec:
volumes:
- name: mysql-conf
configMap:
name: mysql-configmap
items:
- key: mysql.cnf
path: mysql.cnf
- key: mysqld.cnf
path: mysqld.cnf
- key: mysqldump.cnf
path: mysqldump.cnf
- key: docker.cnf
path: docker.cnf
containers:
- name: mysql
image: mysql:5.6
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: secret-mysql
key: password
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-data
- mountPath: /etc/mysql/conf.d/mysql.cnf
subPath: mysql.cnf
name: mysql-conf
- mountPath: /etc/mysql/conf.d/mysqldump.cnf
subPath: mysqldump.cnf
name: mysql-conf
- mountPath: /etc/mysql/conf.d/docker.cnf
subPath: docker.cnf
name: mysql-conf
- mountPath: /etc/mysql/mysql.conf.d/mysqld.cnf
subPath: mysqld.cnf
name: mysql-conf

kubectl apply -f statefulset-mysql.yaml