Kubernetes使用nfs做持久化卷存储

目录

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

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

 1#NFS服务端 (centos7)
 2yum install nfs-utils rpcbind -y
 3
 4mkdir -p /data/nfs/{download,bakup,www}
 5echo "/data/nfs 10.10.0.0/16(rw,all_squash,insecure,sync)" >> /etc/exports
 6exportfs -r
 7
 8systemctl enable rpcbind nfs-server
 9systemctl restart rpcbind nfs-server
10
11showmount -e localhost
12
13#客户端根本不装也可以,客户端不需要启动任何nfs服务
14#只是为了使用showmount工具来验证
15
16#NFS客户端(CentOS,所有WorkNode节点都需要执行)
17yum install -y nfs-utils
18
19#NFS客户端(Ubuntu,所有WorkNode节点都需要执行)
20apt install -y nfs-common

NFS 服务端的参数如下:

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

综上,保险的参数就是

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

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

1exports -rv

二、POD内直接使用

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

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: test
 5  labels:
 6    app.kubernetes.io/name: alpine
 7spec:
 8  containers:
 9    - name: alpine
10      image: alpine:latest
11      command:
12        - touch
13        - /data/test
14      volumeMounts:
15        - name: nfs-volume
16          mountPath: /data
17  volumes:
18    - name: nfs-volume
19      nfs:
20        server: 10.10.247.38
21        path: /data
22        readOnly: no

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

三、用PV和PVC使用

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

 1apiVersion: v1
 2kind: PersistentVolume
 3metadata:
 4  name: nfs-pv-pvname
 5spec:
 6  accessModes:
 7    - ReadWriteOnce
 8    - ReadOnlyMany
 9    - ReadWriteMany
10  capacity:
11    storage: 10Gi
12  storageClassName: ""
13  persistentVolumeReclaimPolicy: Retain
14  volumeMode: Filesystem
15  nfs:
16    server: 10.10.247.38
17    path: /data
18    readOnly: no

然后建立 PVC

 1apiVersion: v1
 2kind: PersistentVolumeClaim
 3metadata:
 4  name: nfs-pvc-pvcname
 5spec:
 6  accessModes:
 7    - ReadWriteMany
 8  resources:
 9    requests:
10      storage: 1Gi

建一个Deployment,用一下

 1apiVersion: extensions/v1beta1
 2kind: Deployment
 3metadata:
 4  name: nfs-pvc
 5spec:
 6  replicas: 1
 7  template:
 8    metadata:
 9      labels:
10        app: nfs-pvc
11    spec:
12      containers:
13      - name: nginx
14        image: alphine/nginx:latest
15        imagePullPolicy: IfNotPresent
16        ports:
17        - containerPort: 80
18          name: web
19        #使用volume
20        volumeMounts:
21        - name: www
22          subPath: nginx-pvc  #远程子路径
23          mountPath: /usr/share/nginx/html
24      volumes:
25      - name: www
26        persistentVolumeClaim:
27          claimName: nfs-pvc-pvcname

注意:

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

钉钉告警发送
Zabbix下发往钉钉告警
comments powered by Disqus