用NFS来做kubernetes的持久化卷虽然不是最佳实践,但存在即合理。在现在的公司就是这么用的,记录一下,可用但不是最佳。

一、搭建NFS服务端和所有工作节点安装客户端

#NFS服务端 (centos7)
yum install nfs-utils rpcbind -y

mkdir -p /data/nfs/{download,bakup,www}
echo "/data/nfs 10.10.0.0/16(rw,all_squash,insecure,sync)" >> /etc/exports
exportfs -r

systemctl enable rpcbind nfs-server
systemctl restart rpcbind nfs-server

showmount -e localhost

#客户端根本不装也可以,客户端不需要启动任何nfs服务
#只是为了使用showmount工具来验证

#NFS客户端(CentOS,所有WorkNode节点都需要执行)
yum install -y nfs-utils

#NFS客户端(Ubuntu,所有WorkNode节点都需要执行)
apt install -y nfs-common

NFS 服务端的参数如下:

  • rw 能读能写
  • insecure NFS通过1024以上的端口发送
  • root_squash root会被变成noboby,其他人不变
  • no_root_squash root身份保持不变,其他人不变。(不能用这个,容易被黑)
  • all_squash 不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody
  • sync 数据直接落盘,性能略损。
  • async 数据先落内存,然后落盘,性能略升。

综上,保险的参数就是

/data/nfs 10.10.0.0/16(rw,insecure,all_squash,sync)

注意:修改了/etc/exports后,并不需要重启nfs服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可

exports -rv

二、POD内直接使用

由于nfs是内核自带的东西,所以最简单的使用方法就是直接在pod内使用

apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    app.kubernetes.io/name: alpine
spec:
  containers:
    - name: alpine
      image: alpine:latest
      command:
        - touch
        - /data/test
      volumeMounts:
        - name: nfs-volume
          mountPath: /data
  volumes:
    - name: nfs-volume
      nfs:
        server: 10.10.247.38
        path: /data
        readOnly: no

这个pod是一次性运行的,运行完后就可以看到nfs中多了个test文件

三、用PV和PVC使用

先建立PV,注意策略是Retain,不会丢数据。如果是Recycle会清洗数据

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-pvname
spec:
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
    - ReadWriteMany
  capacity:
    storage: 10Gi
  storageClassName: ""
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
  nfs:
    server: 10.10.247.38
    path: /data
    readOnly: no

然后建立 PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc-pvcname
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

建一个Deployment,用一下

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nfs-pvc
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nfs-pvc
    spec:
      containers:
      - name: nginx
        image: alphine/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        #使用volume
        volumeMounts:
        - name: www
          subPath: nginx-pvc  #远程子路径
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: nfs-pvc-pvcname

注意:

  • Storage 10Gi 1Gi 这都是骗鬼玩儿呢,根本不起任何作用!!!