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

How to create a task application in Spring Data Flow Server and mount a remote directory using Kubernetes?

我有一个使用 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-卷-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"]

预计我的任务是从挂载的目录中读取文件。但是目录是空的。我的意思是,虽然没有同步,但它已安装。

看起来您的实际问题是您在配置属性中指定的卷的 name。由于 K8s 不允许名称使用大写字母(参见 here),因此您需要使用小写字母作为您的 name 值(目前有 accessFilesDir 和 processedFilesDir)等,

我尝试在 minikube 上传递类似的设置(没有 NFS 挂载等),只是为了查看任务启动是否通过卷和卷挂载 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