要在Kubernetes中使用NFS并支持动态卷的自动扩展,你可以通过部署NFS客户端Provisioner或使用现有的动态NFS Provisioner来实现。这样,当你创建一个PersistentVolumeClaim (PVC) 时,它会自动创建一个新的NFS共享目录并动态地分配存储空间。以下是使用NFS客户端Provisioner设置动态NFS存储的步骤。

步骤 1: 部署NFS Provisioner

首先,你需要在你的Kubernetes集群中部署一个NFS Provisioner。这个Provisioner将充当动态卷分配的代理,允许你动态地创建和删除NFS共享。

mkdir /opt/k8s/nfs -p
cd  /opt/k8s/nfs
  1. 部署NFS Provisioner到你的集群

    修改nfs-deployment.yaml文件中的NFS服务器地址和路径,然后应用YAML文件:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-client-provisioner
      namespace: kube-system
      labels:
        app: nfs-client-provisioner
    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: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nfs-subdir-external-provisioner:v4.0.2
            volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
            env:
            - name: PROVISIONER_NAME 
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            # 设置高可用允许选举
            #- name: ENABLE_LEADER_ELECTION
            #  value: "True"
            - name: NFS_SERVER 
              value: 172.21.3.28 
            - name: NFS_PATH 
              value: /data/nfs
          volumes:
          - name: nfs-client-root
            nfs:
              server: 172.21.3.28 
              path: /data/nfs
    
    kubectl apply -f nfs-deployment.yaml
    
  2. 创建StorageClass

    修改nfs-storageclass.yaml文件以匹配你的需求,然后应用它:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
      annotations:
        storageclass.kubernetes.io/is-default-class: "false"
    provisioner: "k8s-sigs.io/nfs-subdir-external-provisioner"                 
    parameters:
      archiveOnDelete: "true"
    
    kubectl apply -f nfs-storageclass.yaml
    

    这将创建一个新的StorageClass,你可以在PVC中引用它。

    3.创建rbac

    修改nfs-rbac.yaml文件以匹配你的需求,然后应用它:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      namespace: kube-system
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["get", "list", "watch"]
      - 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
        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
      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
      namespace: kube-system
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: kube-system
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    
      kubectl apply -f nfs-rbac.yaml
    

    要将managed-nfs-storage设置为默认的StorageClass,并且创建一个Pod和PVC来使用这个存储类,你需要执行以下步骤:

步骤 2: 设置默认的StorageClass

  1. 查找当前默认的StorageClass(如果有的话)并取消其默认设置。默认的StorageClass会有一个storageclass.kubernetes.io/is-default-class的注解设置为"true"。你可以通过以下命令查找并修改它:

    kubectl patch storageclass <当前默认的StorageClass名> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. managed-nfs-storage设置为默认的StorageClass

    kubectl patch storageclass nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    

步骤 3: 使用StorageClass创建PVC

现在,你可以创建一个PVC来动态请求NFS存储。在PVC定义中指定你在上一步中创建的StorageClass。

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

将上述内容保存到一个文件中(例如nfs-pvc.yaml),然后使用kubectl apply -f nfs-pvc.yaml来创建PVC。

步骤 4: 在Pod中使用PVC

最后,你可以在Pod定义中引用这个PVC来使用动态分配的NFS存储。

apiVersion: v1
kind: Pod
metadata:
  name: my-nfs-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: my-storage
  volumes:
  - name: my-storage
    persistentVolumeClaim:
      claimName: my-nfs-pvc

保存这个文件并使用kubectl apply -f nfs-pod.yaml 来创建Pod。这个Pod将会使用通过PVC动态分配的NFS存储。

注意

  • 确保NFS服务器允许你的Kubernetes节点的IP地址进行访问。
  • 根据你的实际情况调整YAML文件中的配置,如NFS服务器地址、路径、StorageClass名称等。
  • NFS客户端Provisioner的部署和配置可能会根据你使用的版本和来源有所不同,请参考相应的文档进行调整。

通过上述步骤,你可以在Kubernetes集群中实现NFS存储的动态分配和自动扩展。

Logo

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

更多推荐