k8s使用NFS建立持久卷

两个节点,k8s master 和ndoe。

1.在节点1 建立NFS 服务端:

关闭防火墙

$ systemctl stop firewalld.service
$ systemctl disable firewalld.service

安装配置 nfs

$ yum -y install nfs-utils rpcbind

共享目录设置权限:以 /data/k8s目录存放数据

chmod 755 /data/k8s/

配置 nfs,nfs 的默认配置文件在 /etc/exports 文件下,在该文件中添加下面的配置信息:

$ vi /etc/exports
/data/k8s  *(rw,sync,no_root_squash)

配置说明:

  • /data/k8s:是共享的数据目录
  • *:表示任何人都有权限连接,当然也可以是一个网段,一个 IP,也可以是域名
  • rw:读写的权限
  • sync:表示文件同时写入硬盘和内存
  • no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份

启动服务 nfs 需要向 rpc 注册,rpc 一旦重启了,注册的文件都会丢失,向他注册的服务都需要重启

$ systemctl start rpcbind.service
$ systemctl enable rpcbind
$ systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-07-10 20:57:29 CST; 1min 54s ago
  Process: 17696 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 17697 (rpcbind)
    Tasks: 1
   Memory: 1.1M
   CGroup: /system.slice/rpcbind.service
           └─17697 /sbin/rpcbind -w

 running 证明启动成功了。

然后启动 nfs 服务

$ systemctl start nfs.service
$ systemctl enable nfs
$ systemctl status nfs

● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since Fri 2020-12-11 16:59:51 CST; 2 weeks 4 days ago
 Main PID: 83896 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

acticve代表启动成功

另外我们还可以通过下面的命令确认下:

$ rpcinfo -p|grep nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl

查看具体目录挂载权限:

$ cat /var/lib/nfs/etab
/data/k8s    *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,no_root_squash,no_all_squash)

到这里我们就把 nfs server 给安装成功了

2.在节点二建立NFS客户端

注意所有要使用nfs类型pv的k8s节点,都要装nfs客户端。

客户端安装nfs过程和服务端一样,关闭防火墙、安装nfs、先启动 rpc、然后启动 nfs,安装好后,开始挂载。

先检查节点一是否有挂载目录

showmount -e 192.168.1.197

然后我们在客户端上新建目录:

$ mkdir -p /root/course/kubeadm/data

将 nfs 共享目录挂载到上面的目录:

$ mount -t nfs 192.168.1.197:/data/k8s /root/course/kubeadm/data

挂载成功后,在客户端上面的目录中新建一个文件,然后我们观察下 nfs 服务端的共享目录下面是否也会出现该文件:

$ touch /root/course/kubeadm/data/test.txt

然后在 nfs 服务端查看:

$ ls -ls /data/k8s/
total 4
4 -rw-r--r--. 1 root root 4 Jul 10 21:50 test.txt

如果上面出现了 test.txt 的文件,那么证明我们的 nfs 挂载成功了。

3.PV

pv是存储资源,使用k8s建立一个pv。pvc是使用资源,pod可以使用一个pvc去绑定某个pv,从而存储在这个pv。

建立一个pv,  fweb-pv-namespace.yaml, 指定存储空间大小、访问模式、回收策略,具体参数含义在官网查询。

  • 注意使用pv的pod 所在namespace必须和pv、pvc所在namespace相同
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv1
  namespace: apaas-fweb-namespace
spec:
  capacity: 
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Delete
  nfs:
    path: /data/k8s
    server: 192.168.1.197

创建pv,查看状态可用

[root@fwebcs01 k8s-Pv]# kubectl apply -f fweb-pv-namespace.yaml 
persistentvolume/pv1 created
[root@fwebcs01 k8s-Pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    1Gi        RWX            Delete           Available                                   5s

4.PVC

fweb-pvc-namespace.yaml

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

创建pvc,查看状态是绑定,会自动和空闲的pv绑定在一起

[root@fwebcs01 k8s-Pv]# kubectl apply -f fweb-pvc-namespace.yaml 
persistentvolumeclaim/pvc-nfs created
[root@fwebcs01 k8s-Pv]# 
[root@fwebcs01 k8s-Pv]# 
[root@fwebcs01 k8s-Pv]# 
[root@fwebcs01 k8s-Pv]# kubectl get pvc
No resources found in default namespace.
[root@fwebcs01 k8s-Pv]# kubectl get pvc -n apaas-fweb-namespace
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs   Bound    pv1      1Gi        RWX                           17s

再查看之前创建的pv,状态由available变为bound

[root@fwebcs01 k8s-Pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                          STORAGECLASS   REASON   AGE
pv1    1Gi        RWX            Delete           Bound    apaas-fweb-namespace/pvc-nfs                           11m

5.使用PVC

随便给个pod,主要pod和pvc的namespace一致,通过volumes指定要使用的pvc名称,通过volumeMounts指定容器内想往外挂载数据的一个目录,以后容器的此目录数据就会放在nfs的目录中。

使用subPath可以为这个容器单独在 nfs /data/k8s目录中建立一个子目录,方便和其他pod的数据分开。

apiVersion: v1
kind: Pod
metadata:
  name: hello
  namespace: default
  labels:
    app: hello
    userId: userId
spec:
  containers:
    - name: hello
      image: fweb-cloud:1.0
      resources:
        limits:
          cpu: "1"
          memory: "2Gi"
        requests:
          cpu: "0.5"
          memory: "1Gi"
      ports:
      - containerPort: 8080
        name: fweb-apascode-conainer-port
      volumeMounts:
        - name: fweb-apascode-volume
          subPath: apascode
          mountPath: /usr/local/tomcat/file
  volumes:
    - name: fweb-apascode-volume
      persistentVolumeClaim:
        claimName: pvc-nfs

猜你喜欢

转载自blog.csdn.net/u014203449/article/details/111991090