专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

K8S+NFS构建PVC

前提

  • Kubernetes集群
  • NFS与Kubernetes中的worker节点网络能够互联

部署

NFS服务端

  • 使用yum安装NFS安装包(centos)
# yum install nfs-utils -y

服务端配置

配置共享目录
创建共享目录
# mkdir /nfs/data -p
# chmod 755 /nfs/data

/nfs/data即为配置的共享目录

编写配置文件
# vi /etc/exports
/nfs/data  192.168.0.0/24(rw,sync,no_root_squash,no_all_squash)

  • /nfs/data: 共享目录位置。 192.168.0.0/24: 客户端 IP 范围,* 代表所有,即没有限制。
  • rw: 权限设置,可读可写。
  • sync: 同步共享目录。
  • no_root_squash: 可以使用 root 授权。
  • no_all_squash: 可以使用普通用户授权。

:wq 保存设置之后,启动NFS服务

# systemctl start nfs
# systemctl enable nfs //设置为开机自启

可以检查一下本地的共享目录

$ showmount -e localhost
Export list for localhost:
/nfs/data 192.168.0.0/24

这样,服务端就配置好了。

nfs-client-provisioner

下载

# git clone https://github.com/kubernetes-incubator/external-storage.git
# cd external-storage/nfs-client
# ls
CHANGELOG.md  cmd  deploy  docker  Makefile  OWNERS  README.md

  • cmd:nfs-client-provisioner的源代码,使用go语言编写,可以定制化自己的nfs-client-provisioner(作者定制化了一版,感兴趣的可以玩一下)
  • deploy: 是k8s的部署文档,默认使用下面的yaml文件就可以完成部署工作
  • docker: Dockerfile文件,主要是结合cmd中的源代码来制定自己的镜像

部署

# cd deploy/
# ls 
bak         deployment-arm.yaml  objects    test-claim.yaml
class.yaml  deployment.yaml      rbac.yaml  test-pod.yaml

修改deployment文件并部署
  • 修改deployment文件

需要修改的地方只有NFS服务器所在的IP地址(10.10.10.60),以及NFS服务器共享的路径(/ifs/kubernetes),两处都需要修改为你实际的NFS服务器和共享目录

[root@t32 deploy]# cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
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: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.4.32 
            - name: NFS_PATH
              value: /nfs/data
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.4.32
            path: /nfs/data

  • 部署deployment
# kubectl apply -f deployment.yaml

授权

如果启用了RBAC,需要执行rbac.yaml文件来完成授权

# kubectl apply -f rbac.yaml

创建storageclass
# cat class.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: fuseim.pri/ifs 
parameters:
  archiveOnDelete: "false"

  • provisioner: 此处可以不修改,或者修改provisioner的名字,需要与上面的deployment的PROVISIONER_NAME名字一致。
  • annotations: 设置managed-nfs-storage是默认的storageclass
  • archiveOnDelete: false表示pv被删除时,在nfs下面对应的文件夹也会被删除,true正相反

测试

创建pvc

# cat test-claim.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  #annotations:
  #  volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  storageClassName: managed-nfs-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

可以使用annotations的方式表明storageclass,也可以通过storageClassName指定storageclass

# kubectl apply -f test-claim.yaml
# kubectl get pvc 
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
test-claim   Bound    pvc-a391c304-c0e7-11ea-bf0a-525400135835   1Mi        RWX            managed-nfs-storage   44h

此时,nfs共享目录下面,会出现default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835文件夹,命名按照n a m e s p a c e−{namespace}-namespace−{pvcName}-${pvName}格式

创建pod

# cat test-pod.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: gcr.io/google_containers/busybox:1.24
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim

pod的执行结果,后在pv对应的文件夹下面生成SUCCESS文件

# kubectl apply -f test-pod.yaml
# kubectl get pod 
NAME                                      READY   STATUS      RESTARTS   AGE
nfs-client-provisioner-6847759999-4wgbg   1/1     Running     0          44h
test-pod                                  0/1     Completed   0          44h

# ls default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835
SUCCESS

说明部署正常,并且可以动态分配NFS的共享卷。

NFS客户端(使用HostPath方式部署)

安装nfs

# yum install nfs-utils -y

挂载

# mkdir /nfs/data
# mount -t nfs 192.168.4.32:/nfs/data /nfs/data

检查

# df -h |grep nfs 
192.168.4.32:/nfs/data  22T  2.4G   22T   1% /nfs/data

文章永久链接:https://tech.souyunku.com/44223

未经允许不得转载:搜云库技术团队 » K8S+NFS构建PVC

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们