如何在Spring Data Flow Server中创建任务应用程序并使用Kubernetes挂载远程目录?

时间:2019-07-12 19:27:19

标签: kubernetes spring-cloud-dataflow persistent-volumes

我有一个通过minikube部署的本地运行群集。 Spring Cloud Data Flow根据this tutorial进行部署。目前,我可以在SCDF仪表板上创建kubernetes任务并启动它。尽管我的任务是从文件系统读取文件,但我想从POD中安装的共享NFS目录中读取该文件。

我在另一个虚拟机上配置并运行了一个NFS服务器,并且在我的kubernetes集群中创建了一个指向NFS主机的持久卷。启动任务时,会提供一些参数。

  deployer.job-import-access-file.kubernetes.volumes=[
  {
    name: accessFilesDir,
    persistentVolumeClaim: {
      claimName: 'apache-volume-claim'
    }
  },
  {
    name: processedFilesDir,
    persistentVolumeClaim: {
      claimName: 'apache-volume-claim'
    }
  }
]deployer.job-import-access-file.kubernetes.volumeMounts=[
  {
    name: 'accessFilesDir',
    mountPath: '/data/apache/access'
  },
  {
    name: 'processedFilesDir',
    mountPath: '/data/apache/processed'
  }
]

nfs-volume.yaml

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-apache-volume
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  nfs:
    server: 10.255.254.10
    path: '/var/nfs/apache'

nfs-volume-claim.yaml

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: apache-volume-claim
  namespace: default
spec:
  storageClassName: standard
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

应用程序Docker文件

FROM openjdk:8-jdk-alpine

COPY target/job-import-access-file-0.1.0.jar /opt/job-import-access-file-0.1.0.jar
VOLUME ["/data/apache/access", "/data/apache/processed"]

ENTRYPOINT ["java","-jar","/opt/job-import-access-file-0.1.0.jar"]

预计我的任务将从已安装目录中读取文件。但是目录为空。我的意思是,尽管没有同步,它还是已安装。

1 个答案:

答案 0 :(得分:1)

您所遇到的实际问题似乎是您在配置属性中指定的卷的name。由于K8的名称不允许使用大写字母(请参阅here),因此您需要为name值使用小写字母(当前有accessFilesDir和processingFilesDir),等等,

我试图在minikube上传递类似的设置(不进行NFS安装等),只是为了查看启动的任务是否通过了Volume和Volume Mount K8s部署程序属性,并且它们似乎运行良好:

dataflow:>task create a1 --definition "timestamp"

dataflow:>task launch a1 --properties "deployer.timestamp.kubernetes.volumes=[{name: accessfilesdir, persistentVolumeClaim: { claimName: 'apache-volume-claim' }},{name: processedfilesdir, persistentVolumeClaim: { claimName: 'apache-volume-claim' }}],deployer.timestamp.kubernetes.volumeMounts=[{name: 'accessfilesdir', mountPath: '/data/apache/access'},{name: 'processedfilesdir', mountPath: '/data/apache/processed'}]"

并且,当我描述已启动任务的pod(kubectl describe)时,将导致以下配置:

Volumes:
  accessfilesdir:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  apache-volume-claim
    ReadOnly:   false
  processedfilesdir:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  apache-volume-claim
    ReadOnly:   false