kubernetes配置和使用nfs存储

一、安装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

删除下面这段申明:

再看状态:

Categories: docker与kubernetes