【生产】27、nfs实现nfs-client-provisioner

一、部署nfs

  • 注意:k8s集群每个节点需要挂载都需要安装nfs-utils
# NFS 服务端
yum -y install nfs*
#创建数据存储目录
mkdir -p /data/nfs 
#给目录授权(chmod 修改文件和文件夹读写执行属性)
chmod -R 777  /data/nfs 

#增加配置文件
echo "/data/nfs s 192.168.6.64/24(rw,sync,no_subtree_check,no_root_squash)" >>/etc/exports

#查看配置文件
cat /etc/exports

#授权(chown 修改文件和文件夹的用户和用户组属性)
chown nfsnobody:nfsnobody /data/nfs 

#启动和增加开启自启动
systemctl start nfs-server.service
systemctl enable nfs-server.service
  • /data/nfs # 要共享的目录
  • 192.168.6.64/24 #指定可以访问共享目录的用户 ip, * 代表所有用户。192.168.6.64/24指定网段。192.168.6.64指定 ip。
  • rw #可读可写。如果想要只读的话,可以指定 ro。
  • sync #文件同步写入到内存与硬盘中。
  • async #文件会先暂存于内存中,而非直接写入硬盘。
  • no_root_squash #登入 nfs 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!但如果你需要在客户端对 nfs 目录进行写入操作。你就得配置 no_root_squash。方便与安全不可兼得。
  • root_squash #在登入 nfs 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。
  • subtree_check #强制 nfs 检查父目录的权限(默认)
  • no_subtree_check #不检查父目录权限

二、创建StorageClass

  • 官方地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/tree/v4.0.2

【如何创建StorageClass】

把创建StorageClass要做的的事情理清楚:

  • 创建namespace,这里用kube-system。
  • 创建rbac:因为StorageClass有对应的pod要运行,每个pod都有自己的身份即serviceaccount,而这个serviceaccount是和某个角色绑定的,所以要创建:serviceaccount、rule、rolebinding。
  • 创建provisioner,即关联NFS的工作类,负责给PVC提供存储资源,这里用的是nfs-client-provisioner。
  • 创建StorageClass,所有需要PVC通过该StorageClass即可获得存储空间。

1)创建数据目录

#创建数据目录
mkdir -p /opt/nfs-storageclass
cd /opt/nfs-storageclass

2)修改配置

#创建nfs-client-provisioner
cat >nfs-client-provisioner.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: kube-system
spec:
  replicas: 1
  strategy:
    type: Recreate     
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.1
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs      # 存储分配器的默认名称 ,根据自己的名称来修改,与 storageclass.yaml 中的 provisioner 名字一致
            - name: NFS_SERVER
              value:  192.168.6.64              # NFS服务器所在的 ip
            - name: NFS_PATH
              value:  /data/nfs                 # 共享存储目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.6.64                # NFS服务器所在的 ip
            path: /data/nfs                     # 共享存储目录
EOF
#替换镜像
sed -i 's#gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.1# dyrnq/nfs-subdir-external-provisioner:v4.0.1#g' nfs-client-provisioner.yaml

【重要配置详解】

  • persistentVolumeReclaimPolicy:表示当删除PVC时,PV资源的回收策略。
  • 一共有3种策略,分别为Retain(保留)、Recycle(自动回收)、Delete(自动删除)。
  • 当前只有NFS和hostPath支持Recycle策略,AWSEBS、GCE PD、Azure Disk和Cinder卷支持Delete策略。
#给授权
cat >rbac.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
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: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: kube-system
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: kube-system
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: kube-system
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
EOF
#此配置文件定义了一个名称为 managed-nfs-storage的存储类,此存储类的提供者为 nfs-client-provisioner
cat >storageclass.yaml<<EOF 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: nfs # 或者选择其他名称,必须匹配部署变量 PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false" #当设置为“false”时,在删除PVC时,您的pv将不会被配置程序存档。
EOF
【配置详解】
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage   # 存储分配器名称
# 存储分配器的名称,对应“nfs-client-provisioner.yaml”文件中env.PROVISIONER_NAME.value
provisioner: nfs
 
# 允许pvc创建后扩容
allowVolumeExpansion: True
 
parameters:
  # 资源删除策略,“true”表示删除PVC时,同时删除绑定的PV,false删除PVC时,对应的PV不会删除
  archiveOnDelete: "false"

#部署查看
[root@k8s-master-01 nfs-storageclass]# kubectl apply  -f .
[root@k8s-master-01 nfs-storageclass]# kubectl get pods -n kube-system |grep nfs-client-provisioner
nfs-client-provisioner-76f56fbb96-xt9jq   1/1     Running   0          23s

#确认是否创建成功
[root@k8s-master nfs-storageclass]# kubectl get storageclasses.storage.k8s.io  -n kube-system 
NAME                  PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   nfs           Delete          Immediate           false                  6s

三、使用

#在部署服务中添加挂载
  volumeClaimTemplates:
  - metadata:
      name: prometheus-data
    spec:
      storageClassName: managed-nfs-storage 
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: "16Gi"

猜你喜欢

转载自blog.csdn.net/qq_39826987/article/details/132409882
nfs