k8s部署nfs-client

要在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存储的动态分配和自动扩展。

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 通过 Helm Chart 安装 nfs-client-provisioner 使用 Helm Chart 安装 nfs-client-provisioner 可以很容易地创建多个实例。首先,需要安装 Helm 工具和 Tiller 服务。然后,可以使用以下命令安装 nfs-client-provisioner: ``` helm install --name nfs-client-provisioner-1 stable/nfs-client-provisioner \ --set nfs.server=<NFS server IP address> \ --set nfs.path=<NFS server path> \ --set storageClass.name=nfs-client-provisioner-1 \ --set storageClass.defaultClass=false \ --set storageClass.archiveOnDelete=false \ --set storageClass.reclaimPolicy=Retain \ --set resources.requests.storage=1Gi ``` 通过更改 `--name` 和 `storageClass.name` 参数的值,可以创建多个 nfs-client-provisioner 实例。 2. 使用 Kubernetes 部署多个 nfs-client-provisioner 在 Kubernetes 中,可以创建多个 nfs-client-provisioner 实例,每个实例都有自己的 Deployment、Service 和 StorageClass。可以使用以下 YAML 文件创建一个 nfs-client-provisioner 实例: ``` apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nfs-client-provisioner-1 spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner-1 template: metadata: labels: app: nfs-client-provisioner-1 spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: nfs-client-provisioner-1 - name: NFS_SERVER value: <NFS server IP address> - name: NFS_PATH value: <NFS server path> volumes: - name: nfs-client-root nfs: server: <NFS server IP address> path: <NFS server path> --- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: nfs-client-provisioner-1 provisioner: nfs-client-provisioner-1 reclaimPolicy: Retain parameters: archiveOnDelete: "false" mountOptions: "nfsvers=4.1" ``` 然后,可以将文件中的 `nfs-client-provisioner-1` 更改为另一个名称,以创建另一个 nfs-client-provisioner 实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(~ ̄▽ ̄)~凤凰涅槃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值