一、安装nfs服务器
apt install -y nfs-kernel-server
systemctl enable --now nfs-server
mkdir /nfs/data -p
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" >>/etc/exports
exportfs -vf
客户端(node节点)需要安装nfs-common,否则会报错,并导致pod中容器的状态为Terminated(已终止)(通过kubectl describe pod -n dev 查看pod事件):
Mounting command: mount
Mounting arguments: -t nfs 192.168.2.140:/nfs/data/02 /var/lib/kubelet/pods/7020b440-a5fd-461d-aebc-130f75181ff8/volumes/kubernetes.io~nfs/pv-data-1gi
Output: mount: /var/lib/kubelet/pods/7020b440-a5fd-461d-aebc-130f75181ff8/volumes/kubernetes.io~nfs/pv-data-1gi: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
二、创建PV
在nfs服务器上执行:
mkdir /nfs/data/0{1..3}
创建三个PV,分别是10Mi,1Gi,5Gi
在master上执行:
kubectl apply -f pv.yaml
pv.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-10m
spec:
capacity:
storage: 10Mi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.2.140
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.2.140
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data-5gi
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 192.168.2.14
三、创建PVC,持久卷申明,申明需要使用的持久卷规格
在master上执行:
kubectl apply -f pvc.yaml
pvc.yaml的内容:注意storageClassName与pv的相同,否则status一直停留在pending
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nginx
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
root@k8s-master1:~# kubectl get pv,pvc -o wide -n dev

四、绑定pod和pvc:
在master上执行:
kubectl apply -f nginx-dp-svc-pvc.yaml
nginx-dp-svc-pvc.yaml的内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: dev
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nginx-pv-storage
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-pv-storage
persistentVolumeClaim:
claimName: pvc-nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-nginx
name: svc-nginx
namespace: dev
spec:
ports:
- name: 8000-80
port: 8000
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort

查询某个PV的详细信息:

在nfs-server上执行:
echo “hello,pv” >/nfs/data/02/index.html

问题: pv状态是Released,不能被pvc绑定,怎么办?

解决方法:讲Released状态的pv设为可用Available
root@k8s-master1:~# kubectl edit pv pv-data-1gi
root@k8s-master1:~# kubectl edit pv pv-data-5gi
删除下面这段申明:

再看状态:
