storage 主机集群共享卷数据不同步_Kubernetes部署NFS动态存储卷

1. 前提

  • Kubernetes集群

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

2. 部署

2.1 NFS服务端

  • 使用yum安装NFS安装包(centos)

# yum install nfs-utils -y

2.2 服务端配置

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

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

(2) 编写配置文件
# 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: 同步共享目录。

  • norootsquash: 可以使用 root 授权。

  • noallsquash: 可以使用普通用户授权。

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

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

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

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

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

2.3 nfs-client-provisioner

2.3.1 下载
# git clone https://github.com/kubernetes-incubator/external-storage.git# cd external-storage/nfs-client# lsCHANGELOG.md  cmd  deploy  docker  Makefile  OWNERS  README.md
  • cmd:nfs-client-provisioner的源代码,使用go语言编写,可以定制化自己的nfs-client-provisioner(作者定制化了一版,感兴趣的可以玩一下)

  • deploy: 是k8s的部署文档,默认使用下面的yaml文件就可以完成部署工作

  • docker: Dockerfile文件,主要是结合cmd中的源代码来制定自己的镜像

2.3.2 部署
# cd deploy/# ls bak         deployment-arm.yaml  objects    test-claim.yamlclass.yaml  deployment.yaml      rbac.yaml  test-pod.yaml

(1)修改deployment文件并部署

  • 修改deployment文件

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

# cat deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: nfs-client-provisioner  labels:    app: nfs-client-provisioner  # replace with namespace where provisioner is deployed  namespace: defaultspec:  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

2.3.3 授权

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

# kubectl apply -f rbac.yaml

2.3.4 创建storageclass

# cat class.yaml apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  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正相反

3. 测试

3.1 创建pvc

# cat test-claim.yaml kind: PersistentVolumeClaimapiVersion: v1metadata:  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        AGEtest-claim   Bound    pvc-a391c304-c0e7-11ea-bf0a-525400135835   1Mi        RWX            managed-nfs-storage   44h

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

3.2 创建pod

# cat test-pod.yaml kind: PodapiVersion: v1metadata:  name: test-podspec:  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   AGEnfs-client-provisioner-6847759999-4wgbg   1/1     Running     0          44htest-pod                                  0/1     Completed   0          44h# ls default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835SUCCESS

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

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

4.1 安装nfs
# yum install nfs-utils -y

4.2 挂载

# mkdir /nfs/data# mount -t nfs 192.168.4.32:/nfs/data /nfs/data
4.3 检查
# df -h |grep nfs 192.168.4.32:/nfs/data  22T  2.4G   22T   1% /nfs/data

喜欢本文的朋友们,欢迎长按下图关注公众号程序员基础课,收看更多精彩内容

7cb61d9772a43daeb80ff412a475dc99.png

给个[在看],是对程序员的最大支持!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值