前言

一、StorageClass
    StorageClass为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。K3S本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 “配置文件”。

二、StorageClass资源
    每个StorageClass 都包含 provisioner、parameters 和reclaimPolicy字段, 这些字段会在StorageClass 需要动态分配PersistentVolume 时会使用到。
    StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。


使用NFS实现动态创建PV(PersistentVolume)

K3S搭建
K3S本身支持的动态PV创建不包括NFS,所以需要使用外部存储卷插件分配PV。
卷插件称为 Provisioner(存储分配器),NFS 使用的是 nfs-client,这个外部卷插件会使用已经配置好的 NFS 服务器自动创建 PV。 Provisioner:用于指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。
详见:存储类

服务端安装NFS

安装NFS

yum install -y nfs-utils rpcbind

在这里插入图片描述

创建共享目录

mkdir -p /data/nfs/skywalking
vi /etc/exports
# 输入
/data/nfs *(rw,no_root_squash)
/data/nfs/skywalking *(rw,sync,no_root_squash)

在这里插入图片描述

参数说明
/data/nfs需要共享给其他机器的目录
*其他机器的IP地址,*代表任意机器都可以访问
ro该主机对该共享目录有只读权限
rw操作权限,rw代表其他机器对此目录具有可读写权限
async资料会先暂存于内存中,而非直接写入硬盘
syncSync 资料同步写入到内存与硬盘中
root_squash客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
no_root_squash客户机用root访问该共享文件夹时,不映射root用户
all_squash客户机上的任何用户访问该共享目录时都映射成匿名用户
anonuid客户机上的用户映射成指定的本地用户ID的用户
anongid将客户机上的用户映射成属于指定的本地用户组ID
insecure允许从这台机器过来的非授权访问
subtree_check如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check不检查父目录权限
no_wdelay如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置
wdelay如果多个用户要写入NFS目录,则归组写入
no_hide共享NFS目录的子目录
hide在NFS共享目录中不共享其子目录

启动NFS

systemctl start rpcbind && systemctl start nfs
systemctl status rpcbind && systemctl status nfs

在这里插入图片描述

查看相关端口

rpcinfo -p localhost

在这里插入图片描述

查看可挂载列表

showmount -e localhost

在这里插入图片描述

设置开启启动

systemctl enable rpcbind
systemctl enable nfs

在这里插入图片描述

客户端安装NFS

安装NFS

yum install -y nfs-utils

在这里插入图片描述

设置开机启动并启动服务

systemctl enable nfs
systemctl start nfs
systemctl status nfs

在这里插入图片描述

挂载共享目录

mkdir -p /data/nfs/skywalking
mount -t nfs 192.168.3.119:/data/nfs /data/nfs

在这里插入图片描述

查看服务端可挂载目录并挂在

showmount -e 192.168.3.119
mount -t nfs 192.168.3.119:/data/nfs/skywalking /data/nfs/skywalking

在这里插入图片描述

查看挂载情况

df -h

在这里插入图片描述
在这里插入图片描述

K8S主节点

创建Service Account

用来管理 NFS Provisioner 在 K8S 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则

nfs-client-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-client-provisioner-clusterrole
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["list", "watch", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nfs-client-provisioner-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-clusterrole
  apiGroup: rbac.authorization.k8s.io
kubectl apply -f nfs-client-rbac.yaml

在这里插入图片描述

创建provisioner

在 NFS 共享目录下创建挂载点(volume),并将 PV 与 NFS 的挂载点建立关联

nfs-client-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner          #指定Service Account账户
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs-storage       #配置provisioner的Name,确保该名称与StorageClass资源中的provisioner名称保持一致
            - name: NFS_SERVER
              value: 192.168.3.119           #配置绑定的nfs服务器
            - name: NFS_PATH
              value: /data/nfs/provisioner          #配置绑定的nfs服务器目录
      volumes:              #申明nfs数据卷
        - name: nfs-client-root
          nfs:
            server: 192.168.3.119
            path: /data/nfs/provisioner
	kubectl apply -f nfs-client-provisioner.yaml
	kubectl get pods

在这里插入图片描述
在这里插入图片描述

创建StorageClass

负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联

nfs-client-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client-storageclass
provisioner: nfs-storage     #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:
  archiveOnDelete: "false"   #false表示在删除PVC时不会对数据进行存档,即删除数据
	kubectl apply -f nfs-client-storageclass.yaml
	kubectl get storageclasses

在这里插入图片描述
在这里插入图片描述

创建PVC

skywalking-nfs.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: nfs
  labels:
     name: nfs
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-skywalking-data-agent-pv
  namespace: nfs
spec:
  storageClassName: nfs-skywalking-data-agent
  mountOptions:
  - nolock
  capacity: 
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs/skywalking
    server: 192.168.3.119
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-skywalking-data-agent-pvc
  namespace: nfs
spec:
  storageClassName: nfs-skywalking-data-agent
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
kubectl apply -f skywalking-nfs.yaml
kubectl get pvc -n nfs

在这里插入图片描述
在这里插入图片描述

创建Pod

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels: 
    nfs: nginx-test
  namespace: nfs
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      restartPolicy: Always
      containers:
      - name: nginx-test
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: skywalking
          mountPath: /skywalking
      volumes:
      - name: skywalking
        persistentVolumeClaim:
          claimName: nfs-skywalking-data-agent-pvc
kubectl apply -f deployment.yaml
kubectl get pods -n nfs

在这里插入图片描述
在这里插入图片描述

查看挂载情况

docker ps
docker exec -it 89c530c19072 /bin/sh

在这里插入图片描述
在这里插入图片描述


至此完成搭建,尽情享用吧~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐