如何在SpringDataFlowServer中创建任务应用程序并使用Kubernetes挂载远程目录?
我使用minikube部署了一个本地运行集群。Spring云数据流根据部署。此时,我能够在SCDF仪表板上创建kubernetes任务并启动它。虽然我有一个任务,从文件系统中读取文件,我想从POD中装载的共享NFS目录中读取该文件 我在另一个虚拟机中配置并运行了一个NFS服务器,并且在我的kubernetes集群中创建了一个指向NFS主机的持久卷。启动任务时,会提供一些参数如何在SpringDataFlowServer中创建任务应用程序并使用Kubernetes挂载远程目录?,kubernetes,spring-cloud-dataflow,persistent-volumes,Kubernetes,Spring Cloud Dataflow,Persistent Volumes,我使用minikube部署了一个本地运行集群。Spring云数据流根据部署。此时,我能够在SCDF仪表板上创建kubernetes任务并启动它。虽然我有一个任务,从文件系统中读取文件,我想从POD中装载的共享NFS目录中读取该文件 我在另一个虚拟机中配置并运行了一个NFS服务器,并且在我的kubernetes集群中创建了一个指向NFS主机的持久卷。启动任务时,会提供一些参数 deployer.job-import-access-file.kubernetes.volumes=[ {
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"]
我的任务应该从装载的目录中读取文件。但目录是空的。我的意思是,虽然没有同步,但它还是被装载了。看起来您案例中的实际问题是您在配置属性中指定的卷的
名称。由于K8s不允许名称使用大写字母(请参阅),因此需要使用小写字母表示名称
值(目前有AccessFileDir和ProcessedFileDir),等等
我尝试在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 Descripte)时,这导致了以下配置:
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
看起来您案例中的实际问题是您在配置属性中指定的卷的名称
。由于K8s不允许名称使用大写字母(请参阅),因此需要使用小写字母表示名称
值(目前有AccessFileDir和ProcessedFileDir),等等
我尝试在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 Descripte)时,这导致了以下配置:
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
谢谢你的回复。我陷入了圈套。我已经对卷名进行了您建议的更改,并将这些配置作为属性而不是参数传递。因为一个愚蠢的错误而做了很多工作。@Aureliano如果答案解决了你的问题,那么请接受它。谢谢你的回复。我陷入了圈套。我已经对卷名进行了您建议的更改,并将这些配置作为属性而不是参数传递。因为一个愚蠢的错误而做了很多工作。@Aureliano如果答案解决了你的问题,那么请接受它。