Repository: fluid-cloudnative/fluid
Pull request #3790 (2024-04-03 15:43:33)

Copyright时间有误，2022改为2023
<!-- 
Please make sure you have read and understood the contributing guidelines;
https://github.com/fluid-cloudnative/fluid/blob/master/CONTRIBUTING.md-->

### Ⅰ. Describe what this PR does
修改 ./cmd/efc/main.go文件，Copyright时间从2022改为2023。

### Ⅱ. Does this pull request fix one issue?
<!--If so, add "fixes #xxxx" so that the issue will be closed when this PR is merged (for example, "fixes #15" to close Issue #15). Otherwise, add "NONE" -->
fixes #XXXX

### Ⅲ. List the added test cases (unit test/integration test) if any, please explain if no tests are needed.


### Ⅳ. Describe how to verify it


### Ⅴ. Special notes for reviews

fluid-e2e-bot[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign yangyuliufeng for approval by writing `/assign @yangyuliufeng` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/fluid-cloudnative/fluid/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["yangyuliufeng"]} -->
fluid-e2e-bot[bot]: Hi @lsq-19. Thanks for your PR.

I'm waiting for a [fluid-cloudnative](https://github.com/orgs/fluid-cloudnative/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/fluid-cloudnative/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3790) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3790&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3790&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3790&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3790&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3790)



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e2e105d9..69e62d12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,175 +2,406 @@
 
 ## v1.0.0
 
+### Highlights
+
+*   Configurable tiered data locality scheduling capability to optimize affinity between application pod and the data cache.
+
+*   Support three kinds of data operations with different modes: once, onEvent, Cron, including: DataLoad, DataMigrate and DataProcess.
+
+*   Support defining dataflow for data operations.
+
+*   Support Python SDK for data scientists and operators to interact with Fluid control plane.
+
+*   A new runtime for sharing in-memory immutable data: VineyardRuntime is supported in Fluid.
+
+*   Security Hardening: Define a more restricted minimum necessary cluster role permissions for Fluid components, including eliminating  all the secret-related  and some create/update/delete privileges.
+
+*   Enhance CSI Plugin and the FUSE Recovery feature for production usage.
+
+*   Fluid drop all the Secret-related privileges to enhance its security.
+
+
+### New Features
+
+#### Data Operation Features
+
+*   Support cron for DataMigrate（#3224）
+
+*   Support cron for DataLoad (#3309)
+
+*   Make toleration configurable in helm charts (#3354)
+
+*   Support Data Process CRD (#3345) (#3360) (#3367)
+
+*   Support dataflow (#3384)
+
+*   Data operations support resources (#3571)
+
+*   Support ssh password free pod for parallel data migrate (#3645)
+
+#### Vineyard Runtime
+
+*   Add the vineyard runtime CRD definitions. (#3555)
+
+*   Add the helm chart for vineyard runtime. (#3624)
+
+*   Add the controller and RBAC yaml for vineyard runtime. (#3659)
+
+*   Implement vineyard runtime engine and controller (#3649)
+
+*   Add a replicas field to the vineyard Runtime and delete the svc suffix in the vineyard helm chart. (#3700)
+
+#### Others
+
+*   Allow users to skip inject post start hook when using Fuse Sidecar (#3423)
+
+*   Support worker of juicefs can be update by runtime (#3422)
+
+*   Make juicefsruntime.spec.fuse configurale (#3539)
+
+*   Feature: support symlink for NodePublish (#3440)
+
+*   Support tiered locality scheduling for app pod (#3461) (#3489)
+
+*   Allow setting kube client QPS and Burst (#3736)
+
+*   Support configure rate limiter for controllers (#3758)
+
+### Enhancements & Optimizations:
+
+#### CSI Plugin & FUSE Recovery
+
+*   Check path existence and lock in NodeUnpublishVolume (#3284)
+
+*   UmountDuplicate larger than the threshold (#3429)
+
+*   Fix duplicate mount issue, To #48332603 (#3433)
+
+*   Bugfix: remove umountDuplicate and add warning event (#3403)
+
+*   Bugfix: fix csi plugin concurrency issue on FuseRecovery and NodeUnpublishVolume (#3448)
+
+*   Enhancement: recover fuse according to multiple peer group options (#3491)
+
+*   Support symlink for NodePublish (#3440)
+
+#### Security Enhancement
+
+*   Upgrade Docker base image from Alpine 3.17 to 3.18（#3254）
+
+*   Use configmap helm driver instead of secrets (#3272)
+
+*   Del secret get of juicefs runtime clusterrole (#3305)
+
+*   Enhance: optimize secret-related code logic in ThinRuntime controller (#3323)
+
+*   Support alluxioruntime with no secret and generate idempotent mount scripts (#3378)
+
+*   Refactor: safe exec commands (#3699)
+
+*   Support pipe command (#3692)
+
+*   Use utils.command  to replace exec.command (#3686)
+
+*   Fix JuicefsRuntime: escape customized string before constructing commands (#3761)
+
+*   Enhance: remove jindoruntime's fsGroup (#3632) (#3634) (#3635)
+
+*   Support configure hostpid for runtime fuse. (#3755)
+
+#### Others
+
+*   Update runtime info in dataset's status during binding (#3270)
+
+*   Print error message when failing to helm install (#3271)
+
+*   Fail fast with wrong kubelet rootdir (#3331)
+
+*   Auto clean up crd-upgrade pod  (#3500)
+
+*   Change some fields from optional to required in CRD YAML (#3684)
+
+*   Change enableServiceLinks from true to false (#3701)
+
+*   Enhancement: auto discover runtime crds and dynamically enable/disable reconcilers (#3708)
+
+*   Enhancement: add common labels to resources that managed by fluid (#3720)
+
+*   Enhancement: Avoid heavy pod listing when worker statefulset has no replicas (#3771)
+
+### Minor
+
+#### Runtime Upgrade
+
+*   JuiceFSRuntime's default version upgrades to v1.1.0(community) and v4.9.16(enterprise)
+
+*   JindoRuntime's default version upgrades to v6.2.0
+
+#### Bug Fix
+
+*   Bugfix: Support batch/v1beta1 cronjobs for compatibility before Kubernetes v1.21 (#3280)
+
+*   Bugfix: fix csi plugin loop mount bug (#3287)
+
+*   Bugfix: reconcile thinruntime failed when dataset is deleted (#3300)
+
+*   Bugfix: fix thinruntime stuck bug when deleting it (#3335)
+
+*   Fix worker\&fuse options & worker tiredstore (#3344)
+
+*   Del metadata sync && del duplicate metrics (#3380)
+
+*   Bugfix: clean up orphaned thinruntime resources (#3393)
+
+*   Fix Alluxio master in HA mode start error. (#3658)
+
+*   Pass AccessModes to thinruntime fuse container (#3696)
+
+*   Fix fatal error: concurrent map writes for runtime controllers (#3757)
+
+*   Fix incorrect conversion between integer types (#3688)
+
+#### Refactoring
+
+*   Refactor fuse sidecar mutation with mutator (#3477) (#3487) (#3492)
+
+*   Auto infer engine implementation to support multi-engine Runtimes (#3672)
+
+#### Integration
+
+*   Integrate Fluid with Kubeflow Pipline (#3694)
+
+
+
 ## v0.9.0
 
 ### Breaking Changes
 
-- Change matching pod requests mode of webhook from namespaceSelector to objectSelector
+*   Change matching pod requests mode of webhook from namespaceSelector to objectSelector
 
 ### Features
 
-- Add thinRuntime to simplify integration with third-party storage systems
-- Addon component for Fluid's open source CubeFS, NFS
-- Support for accessing data across namespaces
-- Support for subDataset
-- Native acceleration system EFCRuntime for distributed file systems NFS, GPFS
-- Support dataMigrate for data migration operations (currently only supported by JuiceFSRuntime)
-- Add customizable configuration for cache cleanup timeout and maximum retry times, Webhook timeout limits
-- Add Dataload configuration for ImagePullSecrets, node affinity
-- RBAC permission reduction
-- Upgrade to golang 1.18
-- Support for installing Fluid via Helm Repo
+*   Add thinRuntime to simplify integration with third-party storage systems
+
+*   Addon component for Fluid's open source CubeFS, NFS
+
+*   Support for accessing data across namespaces
+
+*   Support for subDataset
+
+*   Native acceleration system EFCRuntime for distributed file systems NFS, GPFS
+
+*   Support dataMigrate for data migration operations (currently only supported by JuiceFSRuntime)
+
+*   Add customizable configuration for cache cleanup timeout and maximum retry times, Webhook timeout limits
+
+*   Add Dataload configuration for ImagePullSecrets, node affinity
+
+*   RBAC permission reduction
+
+*   Upgrade to golang 1.18
+
+*   Support for installing Fluid via Helm Repo
 
 ### Refactoring
 
-- Use data operation framework to construct data migrate, load, backup behaviors
+*   Use data operation framework to construct data migrate, load, backup behaviors
 
 ### Bug Fix
 
-- [JindoRuntime should support configurable env variables](https://github.com/fluid-cloudnative/fluid/issues/3154)
-- [Could not set nodeAffinity in dataset](https://github.com/fluid-cloudnative/fluid/issues/2772)
-- [Runtime helm release stuck in "pending-install" status](https://github.com/fluid-cloudnative/fluid/issues/2764)
-- [CSI failed to recover FUSE mount point for AlluxioRuntime ](https://github.com/fluid-cloudnative/fluid/issues/2719)
-- [[JuiceFS] FUSE pod scheduled failed because of conflict port](https://github.com/fluid-cloudnative/fluid/issues/2668)
-- [Fluid csi on rke2 k8s(1.22) use mount output empty,it caused app pod not work](https://github.com/fluid-cloudnative/fluid/issues/2613)
+*   [JindoRuntime should support configurable env variables](https://github.com/fluid-cloudnative/fluid/issues/3154)
+
+*   [Could not set nodeAffinity in dataset](https://github.com/fluid-cloudnative/fluid/issues/2772)
+
+*   [Runtime helm release stuck in "pending-install" status](https://github.com/fluid-cloudnative/fluid/issues/2764)
+
+*   [CSI failed to recover FUSE mount point for AlluxioRuntime ](https://github.com/fluid-cloudnative/fluid/issues/2719)
+
+*   [\[JuiceFS\] FUSE pod scheduled failed because of conflict port](https://github.com/fluid-cloudnative/fluid/issues/2668)
+
+*   [Fluid csi on rke2 k8s(1.22) use mount output empty,it caused app pod not work](https://github.com/fluid-cloudnative/fluid/issues/2613)
 
 ### Runtime Upgrade
 
-- AlluxioRuntime is upgrade from v2.8.2 to v2.9.1
-- JindoRuntime is upgraded from from  4.5.1 to 4.6.7
-- JuicefsRuntime is upgraded from v1.0.0 to v1.0.4
+*   AlluxioRuntime is upgrade from v2.8.2 to v2.9.1
 
+*   JindoRuntime is upgraded from from  4.5.1 to 4.6.7
+
+*   JuicefsRuntime is upgraded from v1.0.0 to v1.0.4
 
 ## v0.8.0
 
 ### Features
 
-- Lifecycle management of Serverless Job with fluid sidecar support
-- Enabling Runtime Controller on demand
-- Arm64 support with JuicefsRuntime
-- Container Network with short-circuit read support
-- Leader election support for Controllers and Webhook
-- Automatic CRD upgrader
-- Restrict Pod scheduling to dataset cache nodes
-- Tens of thousands of nodes support
-- Image pull secrets support
-- GCS support for Alluxio Runtime
+*   Lifecycle management of Serverless Job with fluid sidecar support
+
+*   Enabling Runtime Controller on demand
+
+*   Arm64 support with JuicefsRuntime
+
+*   Container Network with short-circuit read support
+
+*   Leader election support for Controllers and Webhook
+
+*   Automatic CRD upgrader
+
+*   Restrict Pod scheduling to dataset cache nodes
+
+*   Tens of thousands of nodes support
+
+*   Image pull secrets support
+
+*   GCS support for Alluxio Runtime
 
 ### Refactorings
 
-- Port Allocation  with different strategies: bitmap and random
+*   Port Allocation  with different strategies: bitmap and random
 
 ### Bug Fix
 
-- [Runtime cannot complete deletion when restarting controller](https://github.com/fluid-cloudnative/fluid/issues/1970) 
-- [Pod update failed with fluid webhook injection enabled](https://github.com/fluid-cloudnative/fluid/issues/2053)
-- [Unhandled exception in gopkg.in/yaml.v3](https://github.com/fluid-cloudnative/fluid/issues/1869)
-- [Webhook failed to load root certificates: unable to parse bytes as PEM block](https://github.com/fluid-cloudnative/fluid/issues/1399)
-- [Plugin delete the csi socket when restarting unexpectly](https://github.com/fluid-cloudnative/fluid/issues/2088)
+*   [Runtime cannot complete deletion when restarting controller](https://github.com/fluid-cloudnative/fluid/issues/1970)
+
+*   [Pod update failed with fluid webhook injection enabled](https://github.com/fluid-cloudnative/fluid/issues/2053)
+
+*   [Unhandled exception in gopkg.in/yaml.v3](https://github.com/fluid-cloudnative/fluid/issues/1869)
+
+*   [Webhook failed to load root certificates: unable to parse bytes as PEM block](https://github.com/fluid-cloudnative/fluid/issues/1399)
+
+*   [Plugin delete the csi socket when restarting unexpectly](https://github.com/fluid-cloudnative/fluid/issues/2088)
 
-### Runtime Upgrade 
+### Runtime Upgrade
+
+*   AlluxioRuntime is upgrade from v2.7.2 to v2.8
 
-- AlluxioRuntime is upgrade from v2.7.2 to v2.8
-- JindoRuntime is upgraded from Jindo Engine to JindoFSX Engine, and the version is from 3.8 to  4.5.1
-- JuiceRuntime is upgraded from v0.11.0 to v1.0.0
+*   JindoRuntime is upgraded from Jindo Engine to JindoFSX Engine, and the version is from 3.8 to  4.5.1
 
+*   JuiceRuntime is upgraded from v0.11.0 to v1.0.0
 
 ## v0.7.0
 
 ### Breaking Changes
 
-- Update Kubernetes v1.20.12 dependencies and use Go 1.16
-- Update CustomResourceDefinition to apiextensions.k8s.io/v1
-- Update MutatingWebhookConfiguration to admissionregistration.k8s.io/v1
-- Update CSIDriver to storage.k8s.io/v1
+*   Update Kubernetes v1.20.12 dependencies and use Go 1.16
+
+*   Update CustomResourceDefinition to apiextensions.k8s.io/v1
+
+*   Update MutatingWebhookConfiguration to admissionregistration.k8s.io/v1
+
+*   Update CSIDriver to storage.k8s.io/v1
 
 ### Features
 
-- Support fuse sidecar auto injection for all the runtimes，it’s helpful for no CSI environment
-- Support fuse auto recovery and upgrade
-- Support lazy fuse mount mode
-- Support New cache runtime: JuiceFS
+*   Support fuse sidecar auto injection for all the runtimes，it’s helpful for no CSI environment
+
+*   Support fuse auto recovery and upgrade
+
+*   Support lazy fuse mount mode
+
+*   Support New cache runtime: JuiceFS
 
 ### Refactorings
 
-- Change cache worker deployment mode from DaemonSet to StatefulSet to use K8s Native schedule mechanism
+*   Change cache worker deployment mode from DaemonSet to StatefulSet to use K8s Native schedule mechanism
 
 ### Bug Fix
-- Fix “[Failed to update status of dataload](https://github.com/fluid-cloudnative/fluid/issues/1436)”
-- Fix “[Failed to delete dataload when target dataset is removed](https://github.com/fluid-cloudnative/fluid/issues/1419)”
-- Fix “[node-driver-registrar will not receive any volume umount in subdirectories of kubelet-dir](https://github.com/fluid-cloudnative/fluid/issues/1048)”
 
+*   Fix “[Failed to update status of dataload](https://github.com/fluid-cloudnative/fluid/issues/1436)”
+
+*   Fix “[Failed to delete dataload when target dataset is removed](https://github.com/fluid-cloudnative/fluid/issues/1419)”
+
+*   Fix “[node-driver-registrar will not receive any volume umount in subdirectories of kubelet-dir](https://github.com/fluid-cloudnative/fluid/issues/1048)”
 
 ## v0.6.0
 
 ### Features
 
-- Support dataset cache autoscaling and cronscaling
-- Add dataset mount point dynamically update feature
-- Enhance dataset cache aware Pod scheduling 
-- Enhance HA support for cache Runtime
-- Support new cache Runtime：GooseFS
+*   Support dataset cache autoscaling and cronscaling
+
+*   Add dataset mount point dynamically update feature
+
+*   Enhance dataset cache aware Pod scheduling
+
+*   Enhance HA support for cache Runtime
+
+*   Support new cache Runtime：GooseFS
 
 ### Bugs
 
-- Fix [if alluxioruntime is nonroot, databackup will fail](https://github.com/fluid-cloudnative/fluid/issues/745)
-- Fix [Node labels exceeds maximum length limit for long namespace and name](https://github.com/fluid-cloudnative/fluid/issues/704)
+*   Fix [if alluxioruntime is nonroot, databackup will fail](https://github.com/fluid-cloudnative/fluid/issues/745)
 
+*   Fix [Node labels exceeds maximum length limit for long namespace and name](https://github.com/fluid-cloudnative/fluid/issues/704)
 
 ## v0.5.0
 
 ### Features
 
-- Support on-the-fly dataset cache scale out/in
-- Add Metadata backup and restore operation
-- Support Fuse global mode and toleration
-- Enhance Prometheus monitoring support for AlluxioRuntime
-- Support new Runtime：JindoFS
-- Support HDFS configuration
+*   Support on-the-fly dataset cache scale out/in
+
+*   Add Metadata backup and restore operation
+
+*   Support Fuse global mode and toleration
+
+*   Enhance Prometheus monitoring support for AlluxioRuntime
+
+*   Support new Runtime：JindoFS
+
+*   Support HDFS configuration
 
 ### Bugs
 
-- [Fix compatibality issue of K8s 1.19+](https://github.com/fluid-cloudnative/fluid/issues/603)
+*   [Fix compatibality issue of K8s 1.19+](https://github.com/fluid-cloudnative/fluid/issues/603)
 
 ## v0.4.0
 
 ### Features
 
-- Warm up Dataset automatically before using it
-- Support managing 4,000,000 files
-- Support deploying multiple dataset in the same node
-- Support showing the HCFS Access Endpoint in Dataset status
+*   Warm up Dataset automatically before using it
+
+*   Support managing 4,000,000 files
+
+*   Support deploying multiple dataset in the same node
+
+*   Support showing the HCFS Access Endpoint in Dataset status
 
 ## v0.3.0
 
 ### Features
 
-- Accelerate data access in Host-path mode in K8s
-- Accelerate data access in Persistent Volume mode in K8s
-- Support the underlay storage(NFS, Lustre) which is configured only with non-root
-- Make the Alluxio Runtime’s settings optimized by default
+*   Accelerate data access in Host-path mode in K8s
+
+*   Accelerate data access in Persistent Volume mode in K8s
 
+*   Support the underlay storage(NFS, Lustre) which is configured only with non-root
+
+*   Make the Alluxio Runtime’s settings optimized by default
 
 ### Bugs
 
-- [MountVolume.SetUp failed in GKE](https://github.com/fluid-cloudnative/fluid/issues/222)
-- [fuse.csi.fluid.io not found in the list registered CSI drivers when node restart in k8s 1.15.1](https://github.com/fluid-cloudnative/fluid/issues/220)
+*   [MountVolume.SetUp failed in GKE](https://github.com/fluid-cloudnative/fluid/issues/222)
+
+*   [fuse.csi.fluid.io not found in the list registered CSI drivers when node restart in k8s 1.15.1](https://github.com/fluid-cloudnative/fluid/issues/220)
 
 ## v0.2.0
 
 ### Features
 
-- Add code coverage badge  
-- Update chart v0.2.0  
-- Update docs  
-- Refactor the package name  
+*   Add code coverage badge
+
+*   Update chart v0.2.0
+
+*   Update docs
+
+*   Refactor the package name
 
 ## v0.1.0
 
 ### Features
 
-- Add 'Dataset', 'AlluxioRuntime' CRD for managing the data
-- Add PV and PVC for Posix interface
-- Documentation
-- Helm Chart
+*   Add 'Dataset', 'AlluxioRuntime' CRD for managing the data
+
+*   Add PV and PVC for Posix interface
+
+*   Documentation
+
+*   Helm Chart
+
diff --git a/Makefile b/Makefile
index 10286511..dfb9d6c5 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@ else
 endif
 
 CURRENT_DIR=$(shell pwd)
-VERSION=v1.0.0
+VERSION=v1.0.1
 BUILD_DATE=$(shell date -u +'%Y-%m-%d_%H:%M:%S')
 GIT_COMMIT=$(shell git rev-parse HEAD)
 GIT_TAG=$(shell if [ -z "`git status --porcelain`" ]; then git describe --exact-match --tags HEAD 2>/dev/null; fi)
diff --git a/README-zh_CN.md b/README-zh_CN.md
index 7216ba4c..fb9d1a65 100644
--- a/README-zh_CN.md
+++ b/README-zh_CN.md
@@ -14,11 +14,15 @@
 
 |![更新](static/bell-outline-badge.svg) 最新进展：|
 |------------------|
-|May. 26th, 2023. Fluid v0.9.0  **发布**! 添加thinRuntime以简化与第三方存储系统的集成，跨命名空间访问数据，支持子数据集，新的数据操作，如数据迁移，分布式文件系统的本地加速系统EFCRuntime等等。详情参见 [CHANGELOG](CHANGELOG.md)。|
-|Sep. 03th, 2022. Fluid v0.8.0  **发布**! 提供一系列新功能，包括基于Fluid边车支持的Serverlesss作业生命周期管理，按需启动Runtime controller，自动化CRD更新, 严格的pod与数据集节点的调度机制， JuicefsRuntime的Arm64支持, Alluxio Runtime的GCS支持等等，详情参见 [CHANGELOG](CHANGELOG.md)。|
-|Mar. 16th, 2021. Fluid v0.5.0 **发布**! 提供一系列新功能，包括提供数据集缓存的在线弹性扩缩容，元数据备份与恢复，Fuse全局模式部署等，详情参见 [CHANGELOG](CHANGELOG.md)。|
-|Nov. 6th, 2020. Fluid v0.4.0 **发布**! 提供一系列新功能和修复上一版本的遗留问题，包括提供主动的数据预热，详情参见 [CHANGELOG](CHANGELOG.md)。|
-|Oct. 1st, 2020. Fluid v0.3.0 **发布**! 提供一系列新功能和修复上一版本的遗留问题，包括对于K8s通用的数据卷加速和主机目录加速，详情参见 [CHANGELOG](CHANGELOG.md)。|
+|**最新版发布**：2024年4月17日, Fluid v1.0.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|v0.9.0版发布：2023年5月26日, Fluid v0.9.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|v0.8.0版发布：2022年9月3日, Fluid v0.8.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|v0.7.0版发布：2022年3月2日, Fluid v0.7.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|v0.6.0版发布：2021年8月11日, Fluid v0.6.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|v0.5.0版发布：2021年5月16日, Fluid v0.6.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|进入CNCF：2021年4月27日, Fluid通过CNCF Technical Oversight Committee (TOC)投票决定被接受进入CNCF，成为[CNCF Sandbox Project](https://lists.cncf.io/g/cncf-toc/message/5822)。|
+|v0.4.0版发布：2020年11月6日, Fluid v0.6.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
+|v0.3.0版发布：2020年10月1日, Fluid v0.6.0  发布! 版本更新介绍详情情参见 [CHANGELOG](CHANGELOG.md)。|
 
 ## 什么是Fluid
 
@@ -143,7 +147,7 @@ Fluid采用Apache 2.0 license开源协议，详情参见[LICENSE](./LICENSE)文
 
 ## 漏洞报告
 
-安全性是Fluid项目高度关注的事务。如果您发现或遇到安全相关的问题，欢迎您给fluid.opensource.project@gmail.com邮箱发送邮件报告。
+安全性是Fluid项目高度关注的事务。如果您发现或遇到安全相关的问题，欢迎您给fluid.opensource.project@gmail.com邮箱发送邮件报告。具体细节请查看[SECURITY.md](SECURITY.md)。
 
 ## 行为准则
 
diff --git a/README.md b/README.md
index 5588cd8a..384cee1d 100644
--- a/README.md
+++ b/README.md
@@ -31,12 +31,12 @@ English | [简体中文](./README-zh_CN.md)
 
 | ![notification](static/bell-outline-badge.svg) What is NEW!  |
 | ------------------------------------------------------------ |
-| May. 26th, 2023. Fluid v0.9.0 is **RELEASED**! It provides various new features, such as adding thinRuntime to simplify integration with third-party storage systems, access data across namespaces, subDataset support, new data Operation like dataMigrate, native acceleration system EFCRuntime for distributed file systems, and so on. Please check the [CHANGELOG](CHANGELOG.md) for details. |
-| Sep. 03th, 2022. Fluid v0.8.0 is **RELEASED**! It provides various new features, such as Lifecycle management of Serverless Job with fluid sidecar support, Enable runtime controller on demand, Automatic CRD upgrader, Restrict pod scheduling to dataset cache nodes, Arm64 support with JuicefsRuntime, GCS support for Alluxio Runtime, and so on. Please check the [CHANGELOG](CHANGELOG.md) for details. |
-| Mar. 02th, 2022. Fluid v0.7.0 is **RELEASED**! It provides various new features, such as Fuse sidecar auto injection for all the runtimes (suitable for serverless environment), Fuse auto recovery and upgrade, lazy fuse mount mode, support JuiceFS cache runtime and so on. Please check the [CHANGELOG](CHANGELOG.md) for details. |
-| Aug. 11th, 2021. Fluid v0.6.0 is **RELEASED**! It provides various new features, such as dataset cache autoscaling and cronscaling, dataset cache aware Pod scheduling, HA support for cache Runtime. Please check the [CHANGELOG](CHANGELOG.md) for details. |
+| **Latest Release**: Apr. 17th, 2024. Fluid v1.0.0. Please check the [CHANGELOG](CHANGELOG.md) for details. |
+|v0.9.0 Release: May. 26th, 2023. Fluid v0.9.0. Please check the [CHANGELOG](CHANGELOG.md) for details. |
+|v0.8.0 Release: Sep. 03th, 2022. Fluid v0.8.0. Please check the [CHANGELOG](CHANGELOG.md) for details. |
+|v0.7.0 Release: Mar. 02th, 2022. Fluid v0.7.0. Please check the [CHANGELOG](CHANGELOG.md) for details. |
+|v0.6.0 Release:  Aug. 11th, 2021. Fluid v0.6.0. Please check the [CHANGELOG](CHANGELOG.md) for details. |
 | Apr. 27th, 2021. Fluid accepted by **CNCF**! Fluid project was [accepted as an official CNCF Sandbox Project](https://lists.cncf.io/g/cncf-toc/message/5822) by CNCF Technical Oversight Committee (TOC) with a majority vote after the review process. New beginning for Fluid! . |
-
 <div align="center">
     <img src="static/architecture.png" title="architecture" height="60%" width="60%" alt="">
 </div>
@@ -163,7 +163,7 @@ If you are interested in Fluid and would like to share your experiences with oth
 Fluid is under the Apache 2.0 license. See the [LICENSE](./LICENSE) file for details. It is vendor-neutral.
 
 ## Report Vulnerability
-Security is a first priority thing for us at Fluid. If you come across a related issue, please send email to fluid.opensource.project@gmail.com .
+Security is a first priority thing for us at Fluid. If you come across a related issue, please send email to fluid.opensource.project@gmail.com. Also see our [SECURITY.md](SECURITY.md) file for details.
 
 
 ## Code of Conduct
diff --git a/SECURITY.md b/SECURITY.md
index 9ead1cb4..8427ad77 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -5,12 +5,6 @@
 Fluid currently commits to supporting the n-1 version minor version of the current major release;
 as well as the last minor version of the previous major release.
 
-Here's an overview:
-
-| Version | Supported           |
-| ------- | ------------------- |
-| 0.8.x   | :white_check_mark: |
-
 ## Reporting a Vulnerability
 
 We strive to ship secure software, but we need the community to help us find security breaches. In case of a confirmed breach, reporters will get full credit and can be keep in the loop, if preferred.
diff --git a/api/v1alpha1/dataprocess_types.go b/api/v1alpha1/dataprocess_types.go
index 70b426ef..5f4b44f7 100644
--- a/api/v1alpha1/dataprocess_types.go
+++ b/api/v1alpha1/dataprocess_types.go
@@ -96,7 +96,7 @@ type ScriptProcessor struct {
 // DataProcessSpec defines the desired state of DataProcess
 type DataProcessSpec struct {
 	// Dataset specifies the target dataset and its mount path.
-	// +requried
+	// +required
 	Dataset TargetDatasetWithMountPath `json:"dataset"`
 
 	// Processor specify how to process data.
diff --git a/charts/fluid/fluid/Chart.yaml b/charts/fluid/fluid/Chart.yaml
index c53aa99d..ea09cc0b 100644
--- a/charts/fluid/fluid/Chart.yaml
+++ b/charts/fluid/fluid/Chart.yaml
@@ -14,11 +14,11 @@ type: application
 
 # This is the chart version. This version number should be incremented each time you make changes
 # to the chart and its templates, including the app version.
-version: 1.0.0
+version: 1.0.1
 
 # This is the version number of the application being deployed. This version number should be
 # incremented each time you make changes to the application.
-appVersion: 1.0.0-10382d2
+appVersion: 1.0.0-31f5433
 home: https://github.com/fluid-cloudnative/fluid
 keywords:
   - category:data
diff --git a/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml b/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml
index efaab4f0..55b26d52 100644
--- a/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml
+++ b/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml
@@ -60,6 +60,18 @@ spec:
         - name: MOUNT_ROOT
           value: {{ .Values.runtime.mountRoot | quote }}
         {{- end }}
+        {{- if .Values.runtime.vineyard.master.image }}
+        - name: VINEYARD_MASTER_IMAGE_ENV
+          value: {{ .Values.runtime.vineyard.master.image | quote }}
+        {{- end }}
+        {{- if .Values.runtime.vineyard.worker.image }}
+        - name: VINEYARD_WORKER_IMAGE_ENV
+          value: {{ .Values.runtime.vineyard.worker.image | quote }}
+        {{- end }}
+        {{- if .Values.runtime.vineyard.fuse.image }}
+        - name: VINEYARD_FUSE_IMAGE_ENV
+          value: {{ .Values.runtime.vineyard.fuse.image | quote }}
+        {{- end }}
         {{- if .Values.runtime.syncRetryDuration }}
         - name: FLUID_SYNC_RETRY_DURATION
           value: {{ .Values.runtime.syncRetryDuration | quote }}
diff --git a/charts/fluid/fluid/templates/role/dataset/rbac.yaml b/charts/fluid/fluid/templates/role/dataset/rbac.yaml
index 7bd65ce2..3d12ec5d 100644
--- a/charts/fluid/fluid/templates/role/dataset/rbac.yaml
+++ b/charts/fluid/fluid/templates/role/dataset/rbac.yaml
@@ -114,9 +114,7 @@ rules:
   - apiGroups:
       - apps
     resources:
-      - daemonsets
       - statefulsets
-      - daemonsets/status
       - statefulsets/status
     verbs:
       - get
@@ -126,6 +124,15 @@ rules:
       - update
       - patch
       - delete
+  - apiGroups:
+      - apps
+    resources:
+      - daemonsets
+      - daemonsets/status
+    verbs:
+      - get
+      - list
+      - watch
   - apiGroups:
       - apps
     resources:
diff --git a/charts/fluid/fluid/values.yaml b/charts/fluid/fluid/values.yaml
index fcac8ff7..5e9830b4 100644
--- a/charts/fluid/fluid/values.yaml
+++ b/charts/fluid/fluid/values.yaml
@@ -12,7 +12,7 @@ crdUpgrade:
   enabled: true
   # This sets the time-to-live (TTL) for crd-upgrade jobs. Default is 259200 seconds (3 days).
   ttlSecondsAfterFinished: 259200 
-  image: fluidcloudnative/fluid-crd-upgrader:v1.0.0-10382d2
+  image: fluidcloudnative/fluid-crd-upgrader:v1.0.0-31f5433
 
 ##  if unspecified, will use built-in variable `.Release.Namespace`.
 namespace: fluid-system
@@ -25,7 +25,7 @@ dataset:
   tolerations:
     - operator: Exists
   controller:
-    image: fluidcloudnative/dataset-controller:v1.0.0-10382d2
+    image: fluidcloudnative/dataset-controller:v1.0.0-31f5433
 
 csi:
   tolerations:
@@ -36,7 +36,7 @@ csi:
   registrar:
     image: fluidcloudnative/csi-node-driver-registrar:v2.3.0
   plugins:
-    image: fluidcloudnative/fluid-csi:v1.0.0-10382d2
+    image: fluidcloudnative/fluid-csi:v1.0.0-31f5433
   kubelet:
     kubeConfigFile: /etc/kubernetes/kubelet.conf
     certDir: /var/lib/kubelet/pki
@@ -63,7 +63,7 @@ runtime:
     init:
       image: fluidcloudnative/init-users:v0.9.0
     controller:
-      image: fluidcloudnative/alluxioruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/alluxioruntime-controller:v1.0.0-31f5433
     runtime:
       image: alluxio/alluxio-dev:2.9.0
     fuse:
@@ -84,7 +84,7 @@ runtime:
     fuse:
       image: registry.cn-shanghai.aliyuncs.com/jindofs/jindo-fuse:6.2.0
     controller:
-      image: fluidcloudnative/jindoruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/jindoruntime-controller:v1.0.0-31f5433
     init:
       portCheck:
         enabled: false
@@ -100,7 +100,7 @@ runtime:
     init:
       image: fluidcloudnative/init-users:v0.9.0
     controller:
-      image: fluidcloudnative/goosefsruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/goosefsruntime-controller:v1.0.0-31f5433
     runtime:
       image: ccr.ccs.tencentyun.com/qcloud/goosefs:v1.2.0
     fuse:
@@ -112,7 +112,7 @@ runtime:
     enabled: false
     runtimeWorkers: 3
     controller:
-      image: fluidcloudnative/juicefsruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/juicefsruntime-controller:v1.0.0-31f5433
     fuse:
       ceimage: juicedata/juicefs-fuse:ce-v1.1.0-rc1
       eeimage: juicedata/juicefs-fuse:ee-4.9.16
@@ -122,7 +122,7 @@ runtime:
       - operator: Exists
     enabled: false
     controller:
-      image: fluidcloudnative/thinruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/thinruntime-controller:v1.0.0-31f5433
     fuse:
       configStorage: configmap
   efc:
@@ -131,7 +131,7 @@ runtime:
       - operator: Exists
     enabled: false
     controller:
-      image: fluidcloudnative/efcruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/efcruntime-controller:v1.0.0-31f5433
       imagePullPolicy: Always
     init:
       image: registry.cn-zhangjiakou.aliyuncs.com/nascache/init-alifuse:v1.2.2-19dcee9
@@ -147,12 +147,18 @@ runtime:
       - operator: Exists
     enabled: false
     controller:
-      image: fluidcloudnative/vineyardruntime-controller:v1.0.0-10382d2
+      image: fluidcloudnative/vineyardruntime-controller:v1.0.0-31f5433
       imagePullPolicy: Always
+    master:
+      image: bitnami/etcd:3.5.10
+    worker:
+      image: vineyardcloudnative/vineyardd:v0.21.5
+    fuse:
+      image: vineyardcloudnative/vineyard-fluid-fuse:v0.21.5
 
 webhook:
   enabled: true
-  image: fluidcloudnative/fluid-webhook:v1.0.0-10382d2
+  image: fluidcloudnative/fluid-webhook:v1.0.0-31f5433
   replicas: 1
   timeoutSeconds: 15
   reinvocationPolicy: IfNeeded
@@ -202,4 +208,4 @@ fluidapp:
   tolerations:
     - operator: Exists
   controller:
-    image: fluidcloudnative/application-controller:v1.0.0-10382d2
+    image: fluidcloudnative/application-controller:v1.0.0-31f5433
diff --git a/charts/juicefs/templates/worker/statefuleset.yaml b/charts/juicefs/templates/worker/statefulset.yaml
similarity index 100%
rename from charts/juicefs/templates/worker/statefuleset.yaml
rename to charts/juicefs/templates/worker/statefulset.yaml
diff --git a/cmd/alluxio/app/init.go b/cmd/alluxio/app/init.go
index d129a318..f492a467 100644
--- a/cmd/alluxio/app/init.go
+++ b/cmd/alluxio/app/init.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2021 The Fluid Authors.
+Copyright 2022 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/cmd/alluxio/app/version.go b/cmd/alluxio/app/version.go
index c1003351..f2270e40 100644
--- a/cmd/alluxio/app/version.go
+++ b/cmd/alluxio/app/version.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2021 The Fluid Authors.
+Copyright 2022 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/cmd/efc/main.go b/cmd/efc/main.go
index 0fd26441..e8f0ec8e 100644
--- a/cmd/efc/main.go
+++ b/cmd/efc/main.go
@@ -1,5 +1,5 @@
 /*
-  Copyright 2022 The Fluid Authors.
+  Copyright 2023 The Fluid Authors.
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
diff --git a/cmd/thin/app/thin.go b/cmd/thin/app/thin.go
index 5480e1bc..18db128b 100644
--- a/cmd/thin/app/thin.go
+++ b/cmd/thin/app/thin.go
@@ -86,7 +86,7 @@ func init() {
 	startCmd.Flags().Float32VarP(&kubeClientQPS, "kube-api-qps", "", 20, "QPS to use while talking with kubernetes apiserver.")   // 20 is the default qps in controller-runtime
 	startCmd.Flags().IntVarP(&kubeClientBurst, "kube-api-burst", "", 30, "Burst to use while talking with kubernetes apiserver.") // 30 is the default burst in controller-runtime
 	startCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconcilation in controller's workqueue")
-	startCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconcilation in controller's workqueue")
+	startCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconciliation in controller's workqueue")
 	startCmd.Flags().IntVar(&controllerWorkqueueQPS, "workqueue-qps", 10, "qps limit value for controller's workqueue")
 	startCmd.Flags().IntVar(&controllerWorkqueueBurst, "workqueue-burst", 100, "burst limit value for controller's workqueue")
 }
diff --git a/docs/en/samples/vineyard/accelerate_kubeflow_pipelines.md b/docs/en/samples/vineyard/accelerate_kubeflow_pipelines.md
new file mode 100644
index 00000000..d760af93
--- /dev/null
+++ b/docs/en/samples/vineyard/accelerate_kubeflow_pipelines.md
@@ -0,0 +1,241 @@
+## Use vineyard runtime to accelerate kubeflow pipelines
+
+Vineyard can accelerate data sharing by utilizing shared memory compared to existing methods such as local files or S3 services. In this doc, we will show you how to use vineyard runtime to accelerate an existing kubeflow pipeline on the fluid platform.
+
+### Prerequisites
+
+- Install the argo CLI tool via the [official guide](https://github.com/argoproj/argo-workflows/releases/).
+
+
+### Overview of the pipeline
+
+The pipeline we use is a simple pipeline that trains a linear regression model on the dummy Boston Housing Dataset. It contains three steps: [preprocess](../../../../samples/vineyard/preprocess-data/preprocess-data.y), [train](../../../../samples/vineyard/train-data/train-data.py), and [test](../../../../samples/vineyard/test-data/test-data.py).
+
+
+### Prepare the environment
+
+- Prepare a kubernetes cluster. If you don't have a kubernetes cluster on hand, you can use the following command to create a kubernetes cluster via kind(v0.20.0+):
+
+```shell
+cat <<EOF | kind create cluster -v 5 --name=kind --config=-
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+nodes:
+- role: control-plane
+  image: kindest/node:v1.23.0
+- role: worker
+  image: kindest/node:v1.23.0
+- role: worker
+  image: kindest/node:v1.23.0
+- role: worker
+  image: kindest/node:v1.23.0
+EOF
+```
+
+- Prepare the docker images of the kubeflow pipeline. You can use the following command to build the docker image:
+
+```shell
+$ make docker-build REGISTRY="test-registry"(Replace with your custom registry)
+```
+
+Then you can push these images to the registry that your kubernetes cluster can access or load these images to the cluster if your kubernetes cluster is created by kind.
+
+```shell
+$ make load-images REGISTRY="test-registry"(Replace with your custom registry)
+```
+
+or
+
+```shell
+$ make push-images REGISTRY="test-registry"(Replace with your custom registry)
+```
+
+### Install the fluid platform and kubeflow components
+
+- Refer to the [Installation Documentation](../../../userguide/install.md) to complete the installation.
+
+- Install the argo workflow controller, which can be used as the backend of kubeflow pipeline. You can use the following command to install the argo workflow controller:
+
+```shell
+$ kubectl create ns argo
+$ kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.8/install.yaml
+```
+
+- Install the vineyard runtime and dataset. You can use the following command to install the vineyard runtime and dataset:
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: data.fluid.io/v1alpha1
+kind: VineyardRuntime
+metadata:
+  name: vineyard
+spec:
+  replicas: 2
+  tieredstore:
+    levels:
+    - mediumtype: MEM
+      quota: 20Gi
+---
+apiVersion: data.fluid.io/v1alpha1
+kind: Dataset
+metadata:
+  name: vineyard
+EOF
+```
+
+### Run the pipeline
+
+Please make sure the `samples/vineyard/pipeline.yaml` and `samples/vineyard/pipeline-with-vineyard.yaml` files are the original 
+ones as they have been modified to use the privileged 
+container to clear the page cache. Then you can follow
+the next steps to run the pipeline:
+
+**Notice** You need to mount a **NAS path** to the kubernetes node.
+Here we mount a NAS path to the `/mnt/csi-benchmark`(shown in the `prepare-data.yaml`) path of all kubernetes nodes.
+Next, we need to prepare the dataset by running the following command:
+
+```shell
+$ kubectl apply -f samples/vineyard/prepare-data.yaml
+```
+
+The dataset will be stored in the host path. Also, you may need to wait for a while for the dataset to be generated and you can use the following command to check the status:
+
+```shell
+$ while ! kubectl logs -l app=prepare-data | grep "preparing data time" >/dev/null; do echo "dataset unready, waiting..."; sleep 5; done && echo "dataset ready"
+```
+
+Before running the pipeline, we need to create the role and rolebinding for the pipeline as follows.
+
+```shell
+$ kubectl apply -f samples/vineyard/rbac.yaml
+```
+
+After that, you can run the pipeline via the following command:
+
+Without vineyard:
+
+```shell
+$ argo submit samples/vineyard/pipeline.yaml -p data_mu
+ltiplier=2000 -p registry="test-registry" 
+Name:                machine-learning-pipeline-z72gm
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Pending
+Created:             Wed Apr 03 11:46:43 +0800 (now)
+Progress:            
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+```
+
+The result is shown as follows:
+
+```shell
+$ argo get machine-learning-pipeline-z72gm                                           
+Name:                machine-learning-pipeline-z72gm
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Succeeded
+Conditions:          
+ PodRunning          False
+ Completed           True
+Created:             Wed Apr 03 11:46:43 +0800 (3 minutes ago)
+Started:             Wed Apr 03 11:46:43 +0800 (3 minutes ago)
+Finished:            Wed Apr 03 11:49:23 +0800 (49 seconds ago)
+Duration:            2 minutes 40 seconds
+Progress:            3/3
+ResourcesDuration:   4m8s*(1 cpu),4m8s*(100Mi memory)
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+
+STEP                                TEMPLATE                   PODNAME                                                     DURATION  MESSAGE
+ ✔ machine-learning-pipeline-z72gm  machine-learning-pipeline                                                                          
+ ├─✔ preprocess-data                preprocess-data            machine-learning-pipeline-z72gm-preprocess-data-4229626381  1m          
+ ├─✔ train-data                     train-data                 machine-learning-pipeline-z72gm-train-data-1389575193       45s         
+ └─✔ test-data                      test-data                  machine-learning-pipeline-z72gm-test-data-2535188255        13s
+```
+
+Before running the pipeline with vineyard, you need to enable the best effort scheduling for the vineyard runtime as follows:
+
+```shell
+# enable the fuse affinity scheduling
+$ kubectl edit configmap webhook-plugins -n fluid-system
+data:
+  pluginsProfile: |
+    pluginConfig:
+    - args: |
+        preferred:
+          - name: fluid.io/fuse
+            weight: 100
+    ...
+
+# Restart the fluid-webhook pod
+$ kubectl delete pod -lcontrol-plane=fluid-webhook -n fluid-system
+```
+
+Then you can run the pipeline with vineyard via the following command:
+
+```shell
+$ argo submit samples/vineyard/pipeline-with-vineyard.yaml -p data_multiplier=2000 -p registry="test-registry"
+Name:                machine-learning-pipeline-with-vineyard-q4tfr
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Pending
+Created:             Wed Apr 03 12:00:45 +0800 (now)
+Progress:            
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+```
+
+The result is shown as follows:
+
+```shell
+$ argo get machine-learning-pipeline-with-vineyard-q4tfr                               
+Name:                machine-learning-pipeline-with-vineyard-q4tfr
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Succeeded
+Conditions:          
+ PodRunning          False
+ Completed           True
+Created:             Wed Apr 03 12:00:45 +0800 (2 minutes ago)
+Started:             Wed Apr 03 12:00:45 +0800 (2 minutes ago)
+Finished:            Wed Apr 03 12:02:36 +0800 (34 seconds ago)
+Duration:            1 minute 51 seconds
+Progress:            3/3
+ResourcesDuration:   2m40s*(1 cpu),2m40s*(100Mi memory)
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+
+STEP                                              TEMPLATE                                 PODNAME                                                                  DURATION  MESSAGE
+ ✔ machine-learning-pipeline-with-vineyard-q4tfr  machine-learning-pipeline-with-vineyard                                                                                       
+ ├─✔ preprocess-data                              preprocess-data                          machine-learning-pipeline-with-vineyard-q4tfr-preprocess-data-869469459  55s         
+ ├─✔ train-data                                   train-data                               machine-learning-pipeline-with-vineyard-q4tfr-train-data-4177295571      26s         
+ └─✔ test-data                                    test-data                                machine-learning-pipeline-with-vineyard-q4tfr-test-data-1755965473       8s
+```
+
+From the results, it's evident that the pipeline utilizing vineyard reduces the running time by approximately 30% compared to the pipeline without vineyard. This improvement is due to vineyard's ability to accelerate data sharing by leveraging shared memory, which is more efficient than traditional methods such as NFS.
+
+### Modifications to use vineyard
+
+Compared to the original kubeflow pipeline, we could use the following command to check the differences:
+
+```shell
+$ git diff --no-index --unified=40 samples/vineyard/pipeline.py samples/vineyard/pipeline-with-vineyard.py
+```
+
+The main modifications are:
+- Add the vineyard persistent volume to the pipeline. This persistent volume is used to mount the vineyard client config file to the pipeline.
+
+Also, you can check the modifications of the source code as 
+follows.
+
+- [Save data to vineyard](../../../../samples/vineyard/preprocess-data/preprocess-data.py#L32-L35).
+- [Load data from vineyard](../../../../samples/vineyard/train-data/train-data.py#L15-L16).
+- [load data from vineyard](../../../../samples/vineyard/test-data/test-data.py#L14-L15).
+
+The main modification is to use vineyard to load and save data
+rather than using local files.
diff --git a/docs/en/samples/vineyard/vineyard_runtime.md b/docs/en/samples/vineyard/vineyard_runtime.md
index bc60cf8a..d23c4182 100644
--- a/docs/en/samples/vineyard/vineyard_runtime.md
+++ b/docs/en/samples/vineyard/vineyard_runtime.md
@@ -8,19 +8,7 @@ For more information on how to use Vineyard, see the [Vineyard Quick Start Guide
 
 ## Install Fluid
 
-You can download the latest Fluid installation package from [Fluid Releases](https://github.com/fluid-cloudnative/fluid/releases). Refer to the [Installation Documentation](../../userguide/install.md) to complete the installation. Check that all Fluid components are running properly:
-
-```shell
-$ kubectl get po -n fluid-system
-NAME                                         READY   STATUS              RESTARTS   AGE
-csi-nodeplugin-fluid-56d44                   2/2     Running             0          106s
-csi-nodeplugin-fluid-5l78j                   2/2     Running             0          106s
-csi-nodeplugin-fluid-5mghb                   2/2     Running             0          106s
-dataset-controller-5cd87f8b9b-t7dv2          1/1     Running             0          106s
-fluid-webhook-77d44f5fbc-wttzl               1/1     Running             0          106s
-```
-
-Ensure that the `dataset-controller`, `fluid-webhook` pods, and several `csi-nodeplugin` pods are running properly. The `vineyard-runtime-controller` will be dynamically created when using VineyardRuntime.
+Refer to the [Installation Documentation](../../userguide/install.md) to complete the installation.
 
 ## Create Vineyard Runtime and Dataset
 
@@ -35,7 +23,7 @@ spec:
   tieredstore:
     levels:
     - mediumtype: MEM
-    quota: 20Gi
+      quota: 20Gi
 ---
 apiVersion: data.fluid.io/v1alpha1
 kind: Dataset
@@ -71,6 +59,9 @@ vineyard                                                                  Bound
 
 ## Create an Application Pod and Mount the Vineyard Dataset
 
+The default mount path of the Vineyard Dataset is `/var/run/vineyard`. Then you can
+connect to the vineyard worker by the default configurations. If you change the mount path, you need to specify the configurations when connecting to the vineyard worker.
+
 ```shell
 $ cat <<EOF | kubectl apply -f -
 apiVersion: v1
@@ -80,12 +71,18 @@ metadata:
 spec:
   containers:
     - name: demo
-      image: nginx
+      image: python:3.10
+      command:
+      - bash
+      - -c
+      - |
+        pip install vineyard;
+        sleep infinity;
       volumeMounts:
-        - mountPath: /data
-          name: demo
+        - mountPath: /var/run/vineyard
+          name: client-config
   volumes:
-    - name: demo
+    - name: client-config
       persistentVolumeClaim:
         claimName: vineyard
 EOF
@@ -105,3 +102,124 @@ Check the status of Vineyard FUSE:
 $ kubectl get po | grep vineyard-fuse
 vineyard-fuse-9dv4d                    1/1     Running   0               1m20s
 ```
+
+Check the vineyard client configurations
+have been mounted to the Pod:
+
+```shell
+$ kubectl exec demo-app -- ls /data/
+rpc-conf
+vineyard-config.yaml
+```
+
+```shell
+$ kubectl exec demo-app -- cat /data/vineyard-config.yaml
+Vineyard:
+  IPCSocket: vineyard.sock
+  RPCEndpoint: vineyard-worker-0.vineyard-worker.default:9600,vineyard-worker-1.vineyard-worker.default:9600
+```
+
+Connect to the vineyard worker:
+
+```shell
+$ kubectl exec -it demo-app -- python
+Python 3.10.14 (main, Mar 25 2024, 21:45:25) [GCC 12.2.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import vineyard
+>>> client = vineyard.connect()
+>>> client.status
+{
+    instance_id: 1,
+    deployment: local,
+    memory_usage: 0,
+    memory_limit: 21474836480,
+    deferred_requests: 0,
+    ipc_connections: 0,
+    rpc_connections: 1
+}
+```
+
+## Data sharing between pods with Vineyard Runtime
+
+In this section, we will show you how to share data between different workloads with Vineyard Runtime. Assume we have two pods, one is a producer and the other is a consumer. 
+
+Create the producer pod:
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: Pod
+metadata:
+  name: producer
+spec:
+  containers:
+    - name: producer
+      image: python:3.10
+      command:
+      - bash
+      - -c
+      - |
+        pip install vineyard numpy pandas;
+        cat << EOF >> producer.py
+        import vineyard
+        import numpy as np
+        import pandas as pd
+        vineyard.put(pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')), persist=True, name="test_dataframe")
+        vineyard.put((1, 1.2345, 'xxxxabcd'), persist=True, name="test_basic_data_unit");
+        EOF
+        python producer.py;
+        sleep infinity;
+      volumeMounts:
+        - mountPath: /var/run/vineyard
+          name: client-config
+  volumes:
+    - name: client-config
+      persistentVolumeClaim:
+        claimName: vineyard
+EOF
+```
+
+Then create the consumer pod:
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: Pod
+metadata:
+  name: consumer
+spec:
+  containers:
+    - name: consumer
+      image: python:3.10
+      command:
+      - bash
+      - -c
+      - |
+        pip install vineyard numpy pandas;
+        cat << EOF >> consumer.py
+        import vineyard
+        print(vineyard.get(name="test_dataframe",fetch=True).sum())
+        print(vineyard.get(name="test_basic_data_unit",fetch=True))
+        EOF
+        python consumer.py;
+        sleep infinity;
+      volumeMounts:
+        - mountPath: /var/run/vineyard
+          name: client-config
+  volumes:
+    - name: client-config
+      persistentVolumeClaim:
+        claimName: vineyard
+EOF
+
+Check the logs of the consumer pod:
+
+```shell
+$  kubectl logs consumer --tail 6
+A    2.260771
+B   -2.690233
+C   -1.523646
+D    7.208424
+dtype: float64
+(1, 1.2345000505447388, 'xxxxabcd')
+```
diff --git a/docs/zh/operation/monitoring.md b/docs/zh/operation/monitoring.md
index e0c358f4..0d2387d3 100644
--- a/docs/zh/operation/monitoring.md
+++ b/docs/zh/operation/monitoring.md
@@ -129,12 +129,12 @@ spec:
         quota: 1Gi
         high: "0.95"
         low: "0.7"
-  # 默认在v0.5.0版本之后，alluxio runtime已经开启了Prometheous数据，如果需要关闭可以主动设置disablePrometheus: true
+  # 默认在v0.5.0版本之后，alluxio runtime已经开启了Prometheus数据，如果需要关闭可以主动设置disablePrometheus: true
   # disablePrometheus: false  
 EOF
 ```
 
-> 注意：默认Prometheous是开启的。如果需要关闭Prometheous，可以设置 disablePrometheus: true, 默认为 false
+> 注意：默认Prometheus是开启的。如果需要关闭Prometheus，可以设置 disablePrometheus: true, 默认为 false
 
 6. 查看监控
 在 grafana HOME 中知道名为Fluid-Prometheus-Grafana-Monitor视图即可，如下所示:
diff --git a/docs/zh/samples/vineyard/accelerate_kubeflow_pipelines.md b/docs/zh/samples/vineyard/accelerate_kubeflow_pipelines.md
new file mode 100644
index 00000000..231b782e
--- /dev/null
+++ b/docs/zh/samples/vineyard/accelerate_kubeflow_pipelines.md
@@ -0,0 +1,231 @@
+## 使用Vineyard Runtime加速Kubeflow pipeline
+
+Vineyard相比现有方法如本地文件或S3服务, 可以通过利用共享内存加速数据共享。在本文中，我们将展示如何使用Vineyard Runtime来加速Fluid平台上现有的Kubeflow pipeline。
+
+### 前提条件
+
+- 安装 argo CLI 工具，参见[官方指南](https://github.com/argoproj/argo-workflows/releases/).
+
+### pipline概述
+
+目前我们使用的pipeline是一个简单的pipeline，它是在虚拟的波士顿房价数据集上训练一个线性回归模型。它包含三个步骤：[数据预处理](../../../../samples/vineyard/preprocess-data/preprocess-data.y), [模型训练](../../../../samples/vineyard/train-data/train-data.py), 和 [模型测试](../../../../samples/vineyard/test-data/test-data.py).
+
+
+### 准备环境
+
+- 准备一个kubernetes集群。如果您没有现成的kubernetes集群，您可以使用以下命令通过kind(v0.20.0+)创建一个kubernetes集群：
+
+```shell
+cat <<EOF | kind create cluster -v 5 --name=kind --config=-
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+nodes:
+- role: control-plane
+  image: kindest/node:v1.23.0
+- role: worker
+  image: kindest/node:v1.23.0
+- role: worker
+  image: kindest/node:v1.23.0
+- role: worker
+  image: kindest/node:v1.23.0
+EOF
+```
+
+- 准备kubeflow pipeline的docker镜像。您可以使用以下命令构建docker镜像：
+
+```shell
+$ make docker-build REGISTRY="test-registry"(Replace with your custom registry)
+```
+
+接下来，您可以将这些镜像推送到您的kubernetes集群可以访问的镜像仓库，或者如果您的kubernetes集群是通过kind创建的，则可以将这些镜像加载到集群中。
+
+```shell
+$ make load-images REGISTRY="test-registry"(Replace with your custom registry)
+```
+
+or
+
+```shell
+$ make push-images REGISTRY="test-registry"(Replace with your custom registry)
+```
+
+### 安装fluid平台和kubeflow组件
+
+- 参考[安装文档](../../../userguide/install.md)完成安装。
+
+- 安装argo workflow控制器，它可以作为kubeflow pipeline的后端。您可以使用以下命令安装argo workflow控制器：
+
+```shell
+$ kubectl create ns argo
+$ kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.8/install.yaml
+```
+
+- 安装vineyard runtime和dataset。您可以使用以下命令安装vineyard runtime和dataset：
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: data.fluid.io/v1alpha1
+kind: VineyardRuntime
+metadata:
+  name: vineyard
+spec:
+  replicas: 2
+  tieredstore:
+    levels:
+    - mediumtype: MEM
+      quota: 20Gi
+---
+apiVersion: data.fluid.io/v1alpha1
+kind: Dataset
+metadata:
+  name: vineyard
+EOF
+```
+
+### 运行pipeline
+
+请确保`pipeline.yaml`和`pipeline-with-vineyard.yaml`文件是原始的文件，因为它们已经被修改为使用特权容器来清除页面缓存。然后您可以按照下面的步骤运行pipeline：
+
+**注意** 您需要将**NAS路径**挂载到kubernetes节点。在这里，我们将NAS路径挂载到所有kubernetes节点的`/mnt/csi-benchmark`(在`prepare-data.yaml`中显示)路径上。接下来，我们需要通过运行以下命令来准备数据集：
+
+```shell
+$ kubectl apply -f samples/vineyard/prepare-data.yaml
+```
+
+数据集将存储在主机路径中。此外，您可能需要等待一段时间以生成数据集，您可以使用以下命令来检查状态：
+
+```shell
+$ while ! kubectl logs -l app=prepare-data | grep "preparing data time" >/dev/null; do echo "dataset unready, waiting..."; sleep 5; done && echo "dataset ready"
+```
+
+在运行pipeline之前，我们需要为pipeline创建一些rbac roles，如下所示。
+
+```shell
+$ kubectl apply -f samples/vineyard/rbac.yaml
+```
+
+之后，您可以通过以下命令运行不使用vineyard的pipeline：
+
+```shell
+$ argo submit samples/vineyard/pipeline.yaml -p data_mu
+ltiplier=2000 -p registry="test-registry" 
+Name:                machine-learning-pipeline-z72gm
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Pending
+Created:             Wed Apr 03 11:46:43 +0800 (now)
+Progress:            
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+```
+
+结果如下所示。
+
+```shell
+$ argo get machine-learning-pipeline-z72gm                                           
+Name:                machine-learning-pipeline-z72gm
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Succeeded
+Conditions:          
+ PodRunning          False
+ Completed           True
+Created:             Wed Apr 03 11:46:43 +0800 (3 minutes ago)
+Started:             Wed Apr 03 11:46:43 +0800 (3 minutes ago)
+Finished:            Wed Apr 03 11:49:23 +0800 (49 seconds ago)
+Duration:            2 minutes 40 seconds
+Progress:            3/3
+ResourcesDuration:   4m8s*(1 cpu),4m8s*(100Mi memory)
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+
+STEP                                TEMPLATE                   PODNAME                                                     DURATION  MESSAGE
+ ✔ machine-learning-pipeline-z72gm  machine-learning-pipeline                                                                          
+ ├─✔ preprocess-data                preprocess-data            machine-learning-pipeline-z72gm-preprocess-data-4229626381  1m          
+ ├─✔ train-data                     train-data                 machine-learning-pipeline-z72gm-train-data-1389575193       45s         
+ └─✔ test-data                      test-data                  machine-learning-pipeline-z72gm-test-data-2535188255        13s
+```
+
+在运行使用vineyard的pipeline之前，您需要为vineyard runtime启用最佳调度策略，如下所示：
+
+```shell
+# 开启fuse亲和性调度
+$ kubectl edit configmap webhook-plugins -n fluid-system
+data:
+  pluginsProfile: |
+    pluginConfig:
+    - args: |
+        preferred:
+          - name: fluid.io/fuse
+            weight: 100
+    ...
+
+# 重启fluid-webhook pod
+$ kubectl delete pod -lcontrol-plane=fluid-webhook -n fluid-system
+```
+
+接下来，您可以通过以下命令运行使用vineyard的pipeline：
+
+```shell
+$ argo submit samples/vineyard/pipeline-with-vineyard.yaml -p data_multiplier=2000 -p registry="test-registry"
+Name:                machine-learning-pipeline-with-vineyard-q4tfr
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Pending
+Created:             Wed Apr 03 12:00:45 +0800 (now)
+Progress:            
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+```
+
+结果如下所示。
+
+```shell
+$ argo get machine-learning-pipeline-with-vineyard-q4tfr                               
+Name:                machine-learning-pipeline-with-vineyard-q4tfr
+Namespace:           default
+ServiceAccount:      pipeline-runner
+Status:              Succeeded
+Conditions:          
+ PodRunning          False
+ Completed           True
+Created:             Wed Apr 03 12:00:45 +0800 (2 minutes ago)
+Started:             Wed Apr 03 12:00:45 +0800 (2 minutes ago)
+Finished:            Wed Apr 03 12:02:36 +0800 (34 seconds ago)
+Duration:            1 minute 51 seconds
+Progress:            3/3
+ResourcesDuration:   2m40s*(1 cpu),2m40s*(100Mi memory)
+Parameters:          
+  data_multiplier:   2000
+  registry:          test-registry
+
+STEP                                              TEMPLATE                                 PODNAME                                                                  DURATION  MESSAGE
+ ✔ machine-learning-pipeline-with-vineyard-q4tfr  machine-learning-pipeline-with-vineyard                                                                                       
+ ├─✔ preprocess-data                              preprocess-data                          machine-learning-pipeline-with-vineyard-q4tfr-preprocess-data-869469459  55s         
+ ├─✔ train-data                                   train-data                               machine-learning-pipeline-with-vineyard-q4tfr-train-data-4177295571      26s         
+ └─✔ test-data                                    test-data                                machine-learning-pipeline-with-vineyard-q4tfr-test-data-1755965473       8s
+```
+
+从结果中可以看出，使用vineyard的pipeline比不使用vineyard的pipeline减少了大约30%的运行时间。这种改进是由于vineyard利用共享内存加速数据共享，比传统方法如NFS更有效。
+
+### Modifications to use vineyard
+
+相比原始的kubeflow pipeline，您可以使用以下命令来查看使用Vineyard需要的修改：
+
+```shell
+$ git diff --no-index --unified=40 samples/vineyard/pipeline.py samples/vineyard/pipeline-with-vineyard.py
+```
+
+主要的修改如下：
+- 为pipeline添加vineyard持久卷。这个持久卷用于将vineyard客户端配置文件挂载到pipeline中。
+
+此外，您可以按照以下步骤检查源代码的修改。
+
+- [Save data to vineyard](../../../../samples/vineyard/preprocess-data/preprocess-data.py#L32-L35).
+- [Load data from vineyard](../../../../samples/vineyard/train-data/train-data.py#L15-L16).
+- [load data from vineyard](../../../../samples/vineyard/test-data/test-data.py#L14-L15).
+
+其中主要的修改是使用vineyard来加载和保存数据，而不是使用文件。
diff --git a/docs/zh/samples/vineyard/vineyard_runtime.md b/docs/zh/samples/vineyard/vineyard_runtime.md
index 22b74025..3ab7668b 100644
--- a/docs/zh/samples/vineyard/vineyard_runtime.md
+++ b/docs/zh/samples/vineyard/vineyard_runtime.md
@@ -8,19 +8,7 @@ Vineyard 是一个开源的内存数据管理系统，旨在提供高性能的
 
 ## 安装 Fluid
 
-您可以从 [Fluid Releases](https://github.com/fluid-cloudnative/fluid/releases) 下载最新的 Fluid 安装包。参考 [安装文档](../../userguide/install.md) 完成安装。并检查 Fluid 各组件正常运行：
-
-```shell
-$ kubectl get po -n fluid-system
-NAME                                         READY   STATUS              RESTARTS   AGE
-csi-nodeplugin-fluid-56d44                   2/2     Running             0          106s
-csi-nodeplugin-fluid-5l78j                   2/2     Running             0          106s
-csi-nodeplugin-fluid-5mghb                   2/2     Running             0          106s
-dataset-controller-5cd87f8b9b-t7dv2          1/1     Running             0          106s
-fluid-webhook-77d44f5fbc-wttzl               1/1     Running             0          106s
-```
-
-确保 `dataset-controller`、`fluid-webhook` 的 pod 以及若干 `csi-nodeplugin` pod 正常运行。 `vineyard-runtime-controller` 会在使用 VineyardRuntime 的时候动态创建。
+参考 [安装文档](../../userguide/install.md) 完成安装。
 
 ## 创建Vineyard Runtime 及 Dataset
 
@@ -72,6 +60,8 @@ vineyard                                                                  Bound
 
 ## 创建一个应用 Pod 并挂载 Vineyard Dataset
 
+默认情况下，Vineyard Dataset 的挂载路径为 `/var/run/vineyard`。然后您可以通过默认配置连接到 vineyard worker。如果更改挂载路径，需要在连接到 vineyard worker 时指定配置。
+
 ```shell
 $ cat <<EOF | kubectl apply -f -
 apiVersion: v1
@@ -81,12 +71,18 @@ metadata:
 spec:
   containers:
     - name: demo
-      image: nginx
+      image: python:3.10
+      command:
+      - bash
+      - -c
+      - |
+        pip install vineyard;
+        sleep infinity;
       volumeMounts:
-        - mountPath: /data
-          name: demo
+        - mountPath: /var/run/vineyard
+          name: client-config
   volumes:
-    - name: demo
+    - name: client-config
       persistentVolumeClaim:
         claimName: vineyard
 EOF
@@ -106,3 +102,123 @@ demo-app   1/1     Running   0          25s
 $ kubectl get po | grep vineyard-fuse
 vineyard-fuse-9dv4d                    1/1     Running   0               1m20s
 ```
+
+检查 vineyard 客户端配置是否已经挂载到应用 Pod：
+
+```shell
+$ kubectl exec demo-app -- ls /data/
+rpc-conf
+vineyard-config.yaml
+```
+
+```shell
+$ kubectl exec demo-app -- cat /data/vineyard-config.yaml
+Vineyard:
+  IPCSocket: vineyard.sock
+  RPCEndpoint: vineyard-worker-0.vineyard-worker.default:9600,vineyard-worker-1.vineyard-worker.default:9600
+```
+
+在应用pod中连接 vineyard worker：
+
+```shell
+$ kubectl exec -it demo-app -- python
+Python 3.10.14 (main, Mar 25 2024, 21:45:25) [GCC 12.2.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import vineyard
+>>> client = vineyard.connect()
+>>> client.status
+{
+    instance_id: 1,
+    deployment: local,
+    memory_usage: 0,
+    memory_limit: 21474836480,
+    deferred_requests: 0,
+    ipc_connections: 0,
+    rpc_connections: 1
+}
+```
+
+## 使用 Vineyard Runtime 在pod之间共享数据
+
+在这个示例中，我们将展示如何在不同的工作负载之间共享数据。假设我们有两个 Pod，一个是生产者，另一个是消费者。
+
+创建生产者 Pod：
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: Pod
+metadata:
+  name: producer
+spec:
+  containers:
+    - name: producer
+      image: python:3.10
+      command:
+      - bash
+      - -c
+      - |
+        pip install vineyard numpy pandas;
+        cat << EOF >> producer.py
+        import vineyard
+        import numpy as np
+        import pandas as pd
+        vineyard.put(pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')), persist=True, name="test_dataframe")
+        vineyard.put((1, 1.2345, 'xxxxabcd'), persist=True, name="test_basic_data_unit");
+        EOF
+        python producer.py;
+        sleep infinity;
+      volumeMounts:
+        - mountPath: /var/run/vineyard
+          name: client-config
+  volumes:
+    - name: client-config
+      persistentVolumeClaim:
+        claimName: vineyard
+EOF
+```
+
+接下来创建消费者 Pod：
+
+```shell
+$ cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: Pod
+metadata:
+  name: consumer
+spec:
+  containers:
+    - name: consumer
+      image: python:3.10
+      command:
+      - bash
+      - -c
+      - |
+        pip install vineyard numpy pandas;
+        cat << EOF >> consumer.py
+        import vineyard
+        print(vineyard.get(name="test_dataframe",fetch=True).sum())
+        print(vineyard.get(name="test_basic_data_unit",fetch=True))
+        EOF
+        python consumer.py;
+        sleep infinity;
+      volumeMounts:
+        - mountPath: /var/run/vineyard
+          name: client-config
+  volumes:
+    - name: client-config
+      persistentVolumeClaim:
+        claimName: vineyard
+EOF
+
+检查消费者 Pod 的日志：
+
+```shell
+$  kubectl logs consumer --tail 6
+A    2.260771
+B   -2.690233
+C   -1.523646
+D    7.208424
+dtype: float64
+(1, 1.2345000505447388, 'xxxxabcd')
+```
diff --git a/hack/sdk/post-gen.py b/hack/sdk/post-gen.py
index 5a918016..95586576 100644
--- a/hack/sdk/post-gen.py
+++ b/hack/sdk/post-gen.py
@@ -16,7 +16,7 @@ from kubernetes.client import *
     with open(model_module_init_py_file, "w") as f:
         for line in lines:
             if line == "# import models into model package\n":
-                # Insert kubernetes models into fluid sdk pacakge
+                # Insert kubernetes models into fluid sdk package
                 f.write(kubernetes_imports)
             f.write(line)
 
diff --git a/pkg/common/label.go b/pkg/common/label.go
index 057a9573..f5888218 100644
--- a/pkg/common/label.go
+++ b/pkg/common/label.go
@@ -47,7 +47,7 @@ const (
 	RuntimeControllerReplicas = "controller.runtime." + LabelAnnotationPrefix + "replicas"
 
 	// LabelNodePublishMothod is a pv label that indicates the method nodePuhlishVolume use
-	LabelNodePublishMothod = LabelAnnotationPrefix + "node-puhlish-method"
+	LabelNodePublishMothod = LabelAnnotationPrefix + "node-publish-method"
 )
 
 var (
diff --git a/pkg/common/vineyard.go b/pkg/common/vineyard.go
index cbf0d336..99b3178c 100644
--- a/pkg/common/vineyard.go
+++ b/pkg/common/vineyard.go
@@ -21,6 +21,12 @@ const (
 
 	VineyardChart = VineyardRuntime
 
+	VineyardMasterImageEnv = "VINEYARD_MASTER_IMAGE_ENV"
+
+	VineyardWorkerImageEnv = "VINEYARD_WORKER_IMAGE_ENV"
+
+	VineyardFuseImageEnv = "VINEYARD_FUSE_IMAGE_ENV"
+
 	VineyardFuseIsGlobal = true
 
 	DefaultVineyardMasterImage = "bitnami/etcd:3.5.10"
diff --git a/pkg/common/volume.go b/pkg/common/volume.go
index 9df74e5b..e76498ca 100644
--- a/pkg/common/volume.go
+++ b/pkg/common/volume.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Author.
+Copyright 2020 The Fluid Author.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/jindocache/transform.go b/pkg/ddc/jindocache/transform.go
index 306b4b46..784661b6 100644
--- a/pkg/ddc/jindocache/transform.go
+++ b/pkg/ddc/jindocache/transform.go
@@ -270,6 +270,10 @@ func (e *JindoCacheEngine) transformMaster(runtime *datav1alpha1.JindoRuntime, m
 		// to parse cacheset
 		cachesetName := mount.Name
 		cachesetPath := mount.MountPoint
+		if strings.HasPrefix(mount.MountPoint, common.VolumeScheme.String()) {
+			ufsVolumesPath := utils.UFSPathBuilder{}.GenLocalStoragePath(mount)
+			cachesetPath = "local://" + ufsVolumesPath
+		}
 		cacheStrategy := "DISTRIBUTED"
 		metaPolicy := "ALWAYS"
 		readCacheReplica := 1
@@ -451,11 +455,11 @@ func (e *JindoCacheEngine) transformMaster(runtime *datav1alpha1.JindoRuntime, m
 			if secretMountSupport {
 				value.Secret = secretKeyRef.Name
 				if key == "fs."+mountType+".accessKeyId" {
-					value.SecretKey = key
+					value.SecretKey = secretKeyRef.Key
 					e.Log.Info("Get %s From %s!", key, secretKeyRef.Name)
 				}
 				if key == "fs."+mountType+".accessKeySecret" {
-					value.SecretValue = key
+					value.SecretValue = secretKeyRef.Key
 					e.Log.Info("Get %s From %s!", key, secretKeyRef.Name)
 				}
 			} else {
diff --git a/pkg/ddc/vineyard/runtime_info.go b/pkg/ddc/vineyard/runtime_info.go
index cda4028c..9144989e 100644
--- a/pkg/ddc/vineyard/runtime_info.go
+++ b/pkg/ddc/vineyard/runtime_info.go
@@ -29,7 +29,7 @@ func (e *VineyardEngine) getRuntimeInfo() (base.RuntimeInfoInterface, error) {
 		if runtime.ObjectMeta.Annotations == nil {
 			runtime.ObjectMeta.Annotations = make(map[string]string)
 		}
-		runtime.ObjectMeta.Annotations["data.fluid.io/metadataList"] = `[{"Labels": {"fluid.io/node-puhlish-method": "symlink"}, "selector": { "kind": "PersistentVolume"}}]`
+		runtime.ObjectMeta.Annotations["data.fluid.io/metadataList"] = `[{"Labels": {"fluid.io/node-publish-method": "symlink"}, "selector": { "kind": "PersistentVolume"}}]`
 		tieredStore := runtime.Spec.TieredStore
 		e.runtimeInfo, err = base.BuildRuntimeInfo(e.name, e.namespace, e.runtimeType, tieredStore, base.WithMetadataList(base.GetMetadataListFromAnnotation(runtime)))
 		if err != nil {
diff --git a/pkg/ddc/vineyard/transform.go b/pkg/ddc/vineyard/transform.go
index 750cbdd1..d6a777cb 100644
--- a/pkg/ddc/vineyard/transform.go
+++ b/pkg/ddc/vineyard/transform.go
@@ -15,9 +15,10 @@ package vineyard
 
 import (
 	"fmt"
-	"github.com/fluid-cloudnative/fluid/pkg/common"
 	"time"
 
+	"github.com/fluid-cloudnative/fluid/pkg/common"
+
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/utils"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/transfromer"
diff --git a/pkg/ddc/vineyard/utils.go b/pkg/ddc/vineyard/utils.go
index cdcf2c6b..4b1f68e0 100644
--- a/pkg/ddc/vineyard/utils.go
+++ b/pkg/ddc/vineyard/utils.go
@@ -25,6 +25,7 @@ import (
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/common"
 	"github.com/fluid-cloudnative/fluid/pkg/utils"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/docker"
 )
 
 // getRuntime gets the vineyard runtime
@@ -128,20 +129,26 @@ func (e *VineyardEngine) parseMasterImage(image string, tag string, imagePullPol
 	}
 
 	if len(image) == 0 {
-		masterImageInfo := strings.Split(common.DefaultVineyardMasterImage, ":")
-		if len(masterImageInfo) < 1 {
-			panic("invalid default vineyard master image!")
-		} else {
-			image = masterImageInfo[0]
+		image = docker.GetImageRepoFromEnv(common.VineyardMasterImageEnv)
+		if len(image) == 0 {
+			masterImageInfo := strings.Split(common.DefaultVineyardMasterImage, ":")
+			if len(masterImageInfo) < 1 {
+				panic("invalid default vineyard master image!")
+			} else {
+				image = masterImageInfo[0]
+			}
 		}
 	}
 
 	if len(tag) == 0 {
-		masterImageInfo := strings.Split(common.DefaultVineyardMasterImage, ":")
-		if len(masterImageInfo) < 2 {
-			panic("invalid default vineyard master image!")
-		} else {
-			tag = masterImageInfo[1]
+		tag = docker.GetImageTagFromEnv(common.VineyardMasterImageEnv)
+		if len(tag) == 0 {
+			masterImageInfo := strings.Split(common.DefaultVineyardMasterImage, ":")
+			if len(masterImageInfo) < 2 {
+				panic("invalid default vineyard master image!")
+			} else {
+				tag = masterImageInfo[1]
+			}
 		}
 	}
 
@@ -154,20 +161,26 @@ func (e *VineyardEngine) parseWorkerImage(image string, tag string, imagePullPol
 	}
 
 	if len(image) == 0 {
-		workerImageInfo := strings.Split(common.DefaultVineyardWorkerImage, ":")
-		if len(workerImageInfo) < 1 {
-			panic("invalid default vineyard worker image!")
-		} else {
-			image = workerImageInfo[0]
+		image = docker.GetImageRepoFromEnv(common.VineyardWorkerImageEnv)
+		if len(image) == 0 {
+			workerImageInfo := strings.Split(common.DefaultVineyardWorkerImage, ":")
+			if len(workerImageInfo) < 1 {
+				panic("invalid default vineyard worker image!")
+			} else {
+				image = workerImageInfo[0]
+			}
 		}
 	}
 
 	if len(tag) == 0 {
-		workerImageInfo := strings.Split(common.DefaultVineyardWorkerImage, ":")
-		if len(workerImageInfo) < 2 {
-			panic("invalid default vineyard worker image!")
-		} else {
-			tag = workerImageInfo[1]
+		tag = docker.GetImageTagFromEnv(common.VineyardWorkerImageEnv)
+		if len(tag) == 0 {
+			workerImageInfo := strings.Split(common.DefaultVineyardWorkerImage, ":")
+			if len(workerImageInfo) < 2 {
+				panic("invalid default vineyard worker image!")
+			} else {
+				tag = workerImageInfo[1]
+			}
 		}
 	}
 
@@ -180,20 +193,26 @@ func (e *VineyardEngine) parseFuseImage(image string, tag string, imagePullPolic
 	}
 
 	if len(image) == 0 {
-		fuseImageInfo := strings.Split(common.DefultVineyardFuseImage, ":")
-		if len(fuseImageInfo) < 1 {
-			panic("invalid default vineyard fuse image!")
-		} else {
-			image = fuseImageInfo[0]
+		image = docker.GetImageRepoFromEnv(common.VineyardFuseImageEnv)
+		if len(image) == 0 {
+			fuseImageInfo := strings.Split(common.DefultVineyardFuseImage, ":")
+			if len(fuseImageInfo) < 1 {
+				panic("invalid default vineyard fuse image!")
+			} else {
+				image = fuseImageInfo[0]
+			}
 		}
 	}
 
 	if len(tag) == 0 {
-		fuseImageInfo := strings.Split(common.DefultVineyardFuseImage, ":")
-		if len(fuseImageInfo) < 2 {
-			panic("invalid default vineyard fuse image!")
-		} else {
-			tag = fuseImageInfo[1]
+		tag = docker.GetImageTagFromEnv(common.VineyardFuseImageEnv)
+		if len(tag) == 0 {
+			fuseImageInfo := strings.Split(common.DefultVineyardFuseImage, ":")
+			if len(fuseImageInfo) < 2 {
+				panic("invalid default vineyard fuse image!")
+			} else {
+				tag = fuseImageInfo[1]
+			}
 		}
 	}
 
diff --git a/samples/vineyard/Dockerfile b/samples/vineyard/Dockerfile
new file mode 100644
index 00000000..4cb2b67a
--- /dev/null
+++ b/samples/vineyard/Dockerfile
@@ -0,0 +1,10 @@
+FROM python:3.10
+
+RUN pip3 install pandas requests numpy vineyard scikit-learn==1.4.0 joblib==1.3.2
+
+WORKDIR /
+
+ARG APP
+ENV APP ${APP}
+
+COPY ${APP} /${APP}
diff --git a/samples/vineyard/Makefile b/samples/vineyard/Makefile
new file mode 100644
index 00000000..06a057fe
--- /dev/null
+++ b/samples/vineyard/Makefile
@@ -0,0 +1,47 @@
+REGISTRY := ""
+
+define docker_build
+    if [ -n "$(REGISTRY)" ]; then \
+        docker build $(1)/ -f Dockerfile \
+            --build-arg APP=$(1).py \
+            -t $(REGISTRY)/$(1); \
+    else \
+        docker build $(1)/ -f Dockerfile \
+            --build-arg APP=$(1).py \
+            -t $(1); \
+    fi
+endef
+
+define docker_push
+    if [ -n "$(REGISTRY)" ]; then \
+        docker push $(REGISTRY)/$(1); \
+    else \
+        docker push $(1); \
+    fi
+endef
+
+define kind_load
+    if [ -n "$(REGISTRY)" ]; then \
+        kind load docker-image $(REGISTRY)/$(1); \
+    else \
+        kind load docker-image $(1); \
+    fi
+endef
+
+docker-build:
+	$(call docker_build,prepare-data)
+	$(call docker_build,preprocess-data)
+	$(call docker_build,train-data)
+	$(call docker_build,test-data)
+
+push-images:
+	$(call docker_push,prepare-data)
+	$(call docker_push,preprocess-data)
+	$(call docker_push,train-data)
+	$(call docker_push,test-data)
+
+load-images:
+	$(call kind_load,prepare-data)
+	$(call kind_load,preprocess-data)
+	$(call kind_load,train-data)
+	$(call kind_load,test-data)
diff --git a/samples/vineyard/pipeline-with-vineyard.py b/samples/vineyard/pipeline-with-vineyard.py
new file mode 100644
index 00000000..922151fa
--- /dev/null
+++ b/samples/vineyard/pipeline-with-vineyard.py
@@ -0,0 +1,69 @@
+from kfp import dsl
+
+def PreProcess(data_multiplier: int, registry: str):
+    op =  dsl.ContainerOp(
+        name='Preprocess Data',
+        image = f'{registry}/preprocess-data',
+        container_kwargs={
+            'image_pull_policy': "IfNotPresent",
+        },
+        pvolumes={
+            "/data": dsl.PipelineVolume(pvc="benchmark-data"),
+            "/var/run/vineyard": dsl.PipelineVolume(pvc="vineyard"),
+        },
+        command = ['python3', 'preprocess-data.py'],
+        arguments = [f'--data_multiplier={data_multiplier}',
+                     '--with_vineyard=True'],
+    )
+    op.add_pod_label('fuse.serverful.fluid.io/inject', 'true')
+
+    return op
+
+def Train(comp1, registry: str):
+    op = dsl.ContainerOp(
+        name='Train Data',
+        image=f'{registry}/train-data',
+        container_kwargs={
+            'image_pull_policy': "IfNotPresent",
+        },
+        pvolumes={
+            "/data": comp1.pvolumes['/data'],
+            "/var/run/vineyard": dsl.PipelineVolume(pvc="vineyard"),
+        },
+        command = ['python3', 'train-data.py'],
+        arguments = ['--with_vineyard=True'],
+    )
+    op.add_pod_label('fuse.serverful.fluid.io/inject', 'true')
+
+    return op
+
+def Test(comp2, registry: str):
+    op = dsl.ContainerOp(
+        name='Test Data',
+        image=f'{registry}/test-data',
+        container_kwargs={
+            'image_pull_policy': "IfNotPresent",
+        },
+        pvolumes={
+            "/data": comp2.pvolumes['/data'],
+            "/var/run/vineyard": dsl.PipelineVolume(pvc="vineyard"),
+        },
+        command = ['python3', 'test-data.py'],
+        arguments = ['--with_vineyard=True'],
+    )
+    op.add_pod_label('fuse.serverful.fluid.io/inject', 'true')
+
+    return op
+
+@dsl.pipeline(
+   name='Machine Learning Pipeline with Vineyard',
+   description='An example pipeline that trains and logs a regression model.'
+)
+def pipeline(data_multiplier: int, registry: str):
+    comp1 = PreProcess(data_multiplier=data_multiplier, registry=registry)
+    comp2 = Train(comp1, registry=registry)
+    comp3 = Test(comp2, registry=registry)
+
+if __name__ == '__main__':
+    from kfp import compiler
+    compiler.Compiler().compile(pipeline, __file__[:-3]+ '.yaml')
diff --git a/samples/vineyard/pipeline-with-vineyard.yaml b/samples/vineyard/pipeline-with-vineyard.yaml
new file mode 100644
index 00000000..87734393
--- /dev/null
+++ b/samples/vineyard/pipeline-with-vineyard.yaml
@@ -0,0 +1,119 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Workflow
+metadata:
+  generateName: machine-learning-pipeline-with-vineyard-
+  annotations: {pipelines.kubeflow.org/kfp_sdk_version: 1.8.0, pipelines.kubeflow.org/pipeline_compilation_time: '2024-04-03T11:38:54.011627',
+    pipelines.kubeflow.org/pipeline_spec: '{"description": "An example pipeline that
+      trains and logs a regression model.", "inputs": [{"name": "data_multiplier",
+      "type": "Integer"}, {"name": "registry", "type": "String"}], "name": "Machine
+      Learning Pipeline with Vineyard"}'}
+  labels: {pipelines.kubeflow.org/kfp_sdk_version: 1.8.0}
+spec:
+  entrypoint: machine-learning-pipeline-with-vineyard
+  templates:
+  - name: machine-learning-pipeline-with-vineyard
+    inputs:
+      parameters:
+      - {name: data_multiplier}
+      - {name: registry}
+    dag:
+      tasks:
+      - name: preprocess-data
+        template: preprocess-data
+        arguments:
+          parameters:
+          - {name: data_multiplier, value: '{{inputs.parameters.data_multiplier}}'}
+          - {name: registry, value: '{{inputs.parameters.registry}}'}
+      - name: test-data
+        template: test-data
+        dependencies: [train-data]
+        arguments:
+          parameters:
+          - {name: registry, value: '{{inputs.parameters.registry}}'}
+      - name: train-data
+        template: train-data
+        dependencies: [preprocess-data]
+        arguments:
+          parameters:
+          - {name: registry, value: '{{inputs.parameters.registry}}'}
+  - name: preprocess-data
+    container:
+      args: ['--data_multiplier={{inputs.parameters.data_multiplier}}', --with_vineyard=True]
+      command: [python3, preprocess-data.py]
+      image: '{{inputs.parameters.registry}}/preprocess-data'
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        privileged: true
+      volumeMounts:
+      - {mountPath: /data, name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4}
+      - {mountPath: /var/run/vineyard, name: pvolume-d7f6fa616076983e0a6a1242a1945f9c18fb44256cdfffaad45ddd9}
+    inputs:
+      parameters:
+      - {name: data_multiplier}
+      - {name: registry}
+    metadata:
+      labels:
+        fuse.serverful.fluid.io/inject: "true"
+        pipelines.kubeflow.org/kfp_sdk_version: 1.8.0
+        pipelines.kubeflow.org/pipeline-sdk-type: kfp
+        pipelines.kubeflow.org/enable_caching: "true"
+    volumes:
+    - name: pvolume-d7f6fa616076983e0a6a1242a1945f9c18fb44256cdfffaad45ddd9
+      persistentVolumeClaim: {claimName: vineyard}
+    - name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4
+      persistentVolumeClaim: {claimName: benchmark-data}
+  - name: test-data
+    container:
+      args: [--with_vineyard=True]
+      command: [python3, test-data.py]
+      image: '{{inputs.parameters.registry}}/test-data'
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        privileged: true
+      volumeMounts:
+      - {mountPath: /data, name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4}
+      - {mountPath: /var/run/vineyard, name: pvolume-d7f6fa616076983e0a6a1242a1945f9c18fb44256cdfffaad45ddd9}
+    inputs:
+      parameters:
+      - {name: registry}
+    metadata:
+      labels:
+        fuse.serverful.fluid.io/inject: "true"
+        pipelines.kubeflow.org/kfp_sdk_version: 1.8.0
+        pipelines.kubeflow.org/pipeline-sdk-type: kfp
+        pipelines.kubeflow.org/enable_caching: "true"
+    volumes:
+    - name: pvolume-d7f6fa616076983e0a6a1242a1945f9c18fb44256cdfffaad45ddd9
+      persistentVolumeClaim: {claimName: vineyard}
+    - name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4
+      persistentVolumeClaim: {claimName: benchmark-data}
+  - name: train-data
+    container:
+      args: [--with_vineyard=True]
+      command: [python3, train-data.py]
+      image: '{{inputs.parameters.registry}}/train-data'
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        privileged: true
+      volumeMounts:
+      - {mountPath: /data, name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4}
+      - {mountPath: /var/run/vineyard, name: pvolume-d7f6fa616076983e0a6a1242a1945f9c18fb44256cdfffaad45ddd9}
+    inputs:
+      parameters:
+      - {name: registry}
+    metadata:
+      labels:
+        fuse.serverful.fluid.io/inject: "true"
+        pipelines.kubeflow.org/kfp_sdk_version: 1.8.0
+        pipelines.kubeflow.org/pipeline-sdk-type: kfp
+        pipelines.kubeflow.org/enable_caching: "true"
+    volumes:
+    - name: pvolume-d7f6fa616076983e0a6a1242a1945f9c18fb44256cdfffaad45ddd9
+      persistentVolumeClaim: {claimName: vineyard}
+    - name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4
+      persistentVolumeClaim: {claimName: benchmark-data}
+  arguments:
+    parameters:
+    - {name: data_multiplier}
+    - {name: registry}
+  serviceAccountName: pipeline-runner
diff --git a/samples/vineyard/pipeline.py b/samples/vineyard/pipeline.py
new file mode 100644
index 00000000..8c2c2406
--- /dev/null
+++ b/samples/vineyard/pipeline.py
@@ -0,0 +1,57 @@
+from kfp import dsl
+
+def PreProcess(data_multiplier: int, registry: str):
+    op =  dsl.ContainerOp(
+        name='Preprocess Data',
+        image = f'{registry}/preprocess-data',
+        container_kwargs={
+            'image_pull_policy': "IfNotPresent",
+        },
+        pvolumes={
+            "/data": dsl.PipelineVolume(pvc="benchmark-data"),
+        },
+        command = ['python3', 'preprocess-data.py'],
+        arguments = [f'--data_multiplier={data_multiplier}'],
+    )
+    return op
+
+def Train(comp1, registry: str):
+    op = dsl.ContainerOp(
+        name='Train Data',
+        image=f'{registry}/train-data',
+        container_kwargs={
+            'image_pull_policy': "IfNotPresent",
+        },
+        pvolumes={
+            "/data": comp1.pvolumes['/data'],
+        },
+        command = ['python3', 'train-data.py'],
+    )
+    return op
+
+def Test(comp2, registry: str):
+    op = dsl.ContainerOp(
+        name='Test Data',
+        image=f'{registry}/test-data',
+        container_kwargs={
+            'image_pull_policy': "IfNotPresent",
+        },
+        pvolumes={
+            "/data": comp2.pvolumes['/data'],
+        },
+        command = ['python3', 'test-data.py'],
+    )
+    return op
+
+@dsl.pipeline(
+   name='Machine Learning Pipeline',
+   description='An example pipeline that trains and logs a regression model.'
+)
+def pipeline(data_multiplier: int, registry: str):
+    comp1 = PreProcess(data_multiplier=data_multiplier, registry=registry)
+    comp2 = Train(comp1, registry=registry)
+    comp3 = Test(comp2, registry=registry)
+
+if __name__ == '__main__':
+    from kfp import compiler
+    compiler.Compiler().compile(pipeline, __file__[:-3]+ '.yaml')
diff --git a/samples/vineyard/pipeline.yaml b/samples/vineyard/pipeline.yaml
new file mode 100644
index 00000000..a13c9f48
--- /dev/null
+++ b/samples/vineyard/pipeline.yaml
@@ -0,0 +1,105 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Workflow
+metadata:
+  generateName: machine-learning-pipeline-
+  annotations: {pipelines.kubeflow.org/kfp_sdk_version: 1.8.0, pipelines.kubeflow.org/pipeline_compilation_time: '2024-04-03T11:04:21.236385',
+    pipelines.kubeflow.org/pipeline_spec: '{"description": "An example pipeline that
+      trains and logs a regression model.", "inputs": [{"name": "data_multiplier",
+      "type": "Integer"}, {"name": "registry", "type": "String"}], "name": "Machine
+      Learning Pipeline"}'}
+  labels: {pipelines.kubeflow.org/kfp_sdk_version: 1.8.0}
+spec:
+  entrypoint: machine-learning-pipeline
+  templates:
+  - name: machine-learning-pipeline
+    inputs:
+      parameters:
+      - {name: data_multiplier}
+      - {name: registry}
+    dag:
+      tasks:
+      - name: preprocess-data
+        template: preprocess-data
+        arguments:
+          parameters:
+          - {name: data_multiplier, value: '{{inputs.parameters.data_multiplier}}'}
+          - {name: registry, value: '{{inputs.parameters.registry}}'}
+      - name: test-data
+        template: test-data
+        dependencies: [train-data]
+        arguments:
+          parameters:
+          - {name: registry, value: '{{inputs.parameters.registry}}'}
+      - name: train-data
+        template: train-data
+        dependencies: [preprocess-data]
+        arguments:
+          parameters:
+          - {name: registry, value: '{{inputs.parameters.registry}}'}
+  - name: preprocess-data
+    container:
+      args: ['--data_multiplier={{inputs.parameters.data_multiplier}}']
+      command: [python3, preprocess-data.py]
+      image: '{{inputs.parameters.registry}}/preprocess-data'
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        privileged: true
+      volumeMounts:
+      - {mountPath: /data, name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4}
+    inputs:
+      parameters:
+      - {name: data_multiplier}
+      - {name: registry}
+    metadata:
+      labels:
+        pipelines.kubeflow.org/kfp_sdk_version: 1.8.0
+        pipelines.kubeflow.org/pipeline-sdk-type: kfp
+        pipelines.kubeflow.org/enable_caching: "true"
+    volumes:
+    - name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4
+      persistentVolumeClaim: {claimName: benchmark-data}
+  - name: test-data
+    container:
+      command: [python3, test-data.py]
+      image: '{{inputs.parameters.registry}}/test-data'
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        privileged: true
+      volumeMounts:
+      - {mountPath: /data, name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4}
+    inputs:
+      parameters:
+      - {name: registry}
+    metadata:
+      labels:
+        pipelines.kubeflow.org/kfp_sdk_version: 1.8.0
+        pipelines.kubeflow.org/pipeline-sdk-type: kfp
+        pipelines.kubeflow.org/enable_caching: "true"
+    volumes:
+    - name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4
+      persistentVolumeClaim: {claimName: benchmark-data}
+  - name: train-data
+    container:
+      command: [python3, train-data.py]
+      image: '{{inputs.parameters.registry}}/train-data'
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        privileged: true
+      volumeMounts:
+      - {mountPath: /data, name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4}
+    inputs:
+      parameters:
+      - {name: registry}
+    metadata:
+      labels:
+        pipelines.kubeflow.org/kfp_sdk_version: 1.8.0
+        pipelines.kubeflow.org/pipeline-sdk-type: kfp
+        pipelines.kubeflow.org/enable_caching: "true"
+    volumes:
+    - name: pvolume-d9c6725a1237b14c08a2567cb12c489bec539873deeddba7d87f5b4
+      persistentVolumeClaim: {claimName: benchmark-data}
+  arguments:
+    parameters:
+    - {name: data_multiplier}
+    - {name: registry}
+  serviceAccountName: pipeline-runner
diff --git a/samples/vineyard/prepare-data.yaml b/samples/vineyard/prepare-data.yaml
new file mode 100644
index 00000000..a87523ea
--- /dev/null
+++ b/samples/vineyard/prepare-data.yaml
@@ -0,0 +1,54 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: prepare-data
+spec:
+  selector:
+    matchLabels:
+      app: prepare-data
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: prepare-data
+    spec:
+      containers:
+      - name: prepare-data
+        image: test-registry/prepare-data
+        imagePullPolicy: IfNotPresent
+        command: ["python3", "/prepare-data.py"]
+        volumeMounts:
+        - mountPath: /data
+          name: data
+      volumes:
+      - name: data
+        persistentVolumeClaim:
+          claimName: benchmark-data
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: benchmark-data
+spec:
+  storageClassName: manual
+  accessModes:
+  - ReadWriteMany
+  resources:
+    requests:
+      storage: 30Gi
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: benchmark-data
+  labels:
+    type: local
+spec:
+  storageClassName: manual
+  capacity:
+    storage: 30Gi
+  accessModes:
+    - ReadWriteMany
+  hostPath:
+    # mount a nfs volume to the kubernetes nodes
+    path: "/mnt/csi-benchmark"
diff --git a/samples/vineyard/prepare-data/prepare-data.py b/samples/vineyard/prepare-data/prepare-data.py
new file mode 100644
index 00000000..433bc25d
--- /dev/null
+++ b/samples/vineyard/prepare-data/prepare-data.py
@@ -0,0 +1,76 @@
+import time
+
+import numpy as np
+import pandas as pd
+
+
+def generate_random_dataframe(num_rows):
+    return pd.DataFrame({
+            'Id': np.random.randint(1, 100000, num_rows),
+            'MSSubClass': np.random.randint(20, 201, size=num_rows),
+            'LotFrontage': np.random.randint(50, 151, size=num_rows),
+            'LotArea': np.random.randint(5000, 20001, size=num_rows),
+            'OverallQual': np.random.randint(1, 11, size=num_rows),
+            'OverallCond': np.random.randint(1, 11, size=num_rows),
+            'YearBuilt': np.random.randint(1900, 2022, size=num_rows),
+            'YearRemodAdd': np.random.randint(1900, 2022, size=num_rows),
+            'MasVnrArea': np.random.randint(0, 1001, size=num_rows),
+            'BsmtFinSF1': np.random.randint(0, 2001, size=num_rows),
+            'BsmtFinSF2': np.random.randint(0, 1001, size=num_rows),
+            'BsmtUnfSF': np.random.randint(0, 2001, size=num_rows),
+            'TotalBsmtSF': np.random.randint(0, 3001, size=num_rows),
+            '1stFlrSF': np.random.randint(500, 4001, size=num_rows),
+            '2ndFlrSF': np.random.randint(0, 2001, size=num_rows),
+            'LowQualFinSF': np.random.randint(0, 201, size=num_rows),
+            'GrLivArea': np.random.randint(600, 5001, size=num_rows),
+            'BsmtFullBath': np.random.randint(0, 4, size=num_rows),
+            'BsmtHalfBath': np.random.randint(0, 3, size=num_rows),
+            'FullBath': np.random.randint(0, 5, size=num_rows),
+            'HalfBath': np.random.randint(0, 3, size=num_rows),
+            'BedroomAbvGr': np.random.randint(0, 11, size=num_rows),
+            'KitchenAbvGr': np.random.randint(0, 4, size=num_rows),
+            'TotRmsAbvGrd': np.random.randint(0, 16, size=num_rows),
+            'Fireplaces': np.random.randint(0, 4, size=num_rows),
+            'GarageYrBlt': np.random.randint(1900, 2022, size=num_rows),
+            'GarageCars': np.random.randint(0, 5, num_rows),
+            'GarageArea': np.random.randint(0, 1001, num_rows),
+            'WoodDeckSF': np.random.randint(0, 501, num_rows),
+            'OpenPorchSF': np.random.randint(0, 301, num_rows),
+            'EnclosedPorch': np.random.randint(0, 201, num_rows),
+            '3SsnPorch': np.random.randint(0, 101, num_rows),
+            'ScreenPorch': np.random.randint(0, 201, num_rows),
+            'PoolArea': np.random.randint(0, 301, num_rows),
+            'MiscVal': np.random.randint(0, 5001, num_rows),
+            'TotalRooms': np.random.randint(2, 11, num_rows),
+            "GarageAge": np.random.randint(1, 31, num_rows),
+            "RemodAge": np.random.randint(1, 31, num_rows),
+            "HouseAge": np.random.randint(1, 31, num_rows),
+            "TotalBath": np.random.randint(1, 5, num_rows),
+            "TotalPorchSF": np.random.randint(1, 1001, num_rows),
+            "TotalSF": np.random.randint(1000, 6001, num_rows),
+            "TotalArea": np.random.randint(1000, 6001, num_rows),
+            'MoSold': np.random.randint(1, 13, num_rows),
+            'YrSold': np.random.randint(2006, 2022, num_rows),
+            'SalePrice': np.random.randint(50000, 800001, num_rows),
+        })
+
+def prepare_data():
+    print('Start preparing data....', flush=True)
+    st = time.time()
+    for multiplier in 1000, 2000, 3000:
+        df = generate_random_dataframe(10000*(multiplier))
+        df.to_pickle('/data/df_{}.pkl'.format(multiplier))
+        del df
+    ed = time.time()
+    print('##################################', flush=True)
+    print('dataframe to_pickle time: ', ed - st, flush=True)
+
+
+if __name__ == '__main__':
+    st = time.time()
+    print('Preparing data....', flush=True)
+    prepare_data()
+    ed = time.time()
+    print('##################################')
+    print('preparing data time: ', ed - st, flush=True)
+    time.sleep(10000000)
diff --git a/samples/vineyard/preprocess-data/preprocess-data.py b/samples/vineyard/preprocess-data/preprocess-data.py
new file mode 100644
index 00000000..80077436
--- /dev/null
+++ b/samples/vineyard/preprocess-data/preprocess-data.py
@@ -0,0 +1,58 @@
+import argparse
+import os
+import time
+
+from sklearn.model_selection import train_test_split
+
+import pandas as pd
+import vineyard
+
+
+def preprocess_data(data_multiplier, with_vineyard):
+    os.system('sync; echo 3 > /proc/sys/vm/drop_caches')
+    st = time.time()
+    df = pd.read_pickle('/data/df_{0}.pkl'.format(data_multiplier))
+
+    ed = time.time()
+    print('##################################')
+    print('read dataframe pickle time: ', ed - st)
+
+    df = df.drop(df[(df['GrLivArea']>4800)].index)
+
+    X = df.drop('SalePrice', axis=1)  # Features
+    y = df['SalePrice']  # Target variable
+
+    del df
+
+    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
+
+    del X, y
+
+    st = time.time()
+    if with_vineyard:
+        vineyard.put(X_train, name="X_train", persist=True)
+        vineyard.put(X_test, name="X_test", persist=True)
+        vineyard.put(y_train, name="Y_train", persist=True)
+        vineyard.put(y_test, name="Y_test", persist=True)
+    else:
+        X_train.to_pickle('/data/x_train.pkl')
+        X_test.to_pickle('/data/x_test.pkl')
+        y_train.to_pickle('/data/y_train.pkl')
+        y_test.to_pickle('/data/y_test.pkl')
+
+    ed = time.time()
+    print('##################################')
+    print('write training and testing data time: ', ed - st)
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--data_multiplier', type=int, default=1, help='Multiplier for data')
+    parser.add_argument('--with_vineyard', type=bool, default=False, help='Whether to use vineyard')
+    args = parser.parse_args()
+    st = time.time()
+    print('Preprocessing data...')
+    preprocess_data(args.data_multiplier, args.with_vineyard)
+    ed = time.time()
+    print('##################################')
+    print('Preprocessing data time: ', ed - st)
diff --git a/samples/vineyard/rbac.yaml b/samples/vineyard/rbac.yaml
new file mode 100644
index 00000000..b8d58abd
--- /dev/null
+++ b/samples/vineyard/rbac.yaml
@@ -0,0 +1,29 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: pipeline-runner
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: pipeline-runner-role
+rules:
+  - apiGroups: [""]
+    resources: ["persistentvolumeclaims"]
+    verbs: ["get", "create", "update", "list", "delete"]
+  - apiGroups: [""]
+    resources: ["pods"]
+    verbs: ["get", "patch", "create", "update", "list", "delete"]
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: pipeline-runner-rolebinding
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: pipeline-runner-role
+subjects:
+  - kind: ServiceAccount
+    name: pipeline-runner
+    namespace: default
diff --git a/samples/vineyard/train-data/train-data.py b/samples/vineyard/train-data/train-data.py
new file mode 100644
index 00000000..a2409992
--- /dev/null
+++ b/samples/vineyard/train-data/train-data.py
@@ -0,0 +1,39 @@
+import argparse
+import os
+import time
+
+from sklearn.linear_model import LinearRegression
+
+import joblib
+import pandas as pd
+import vineyard
+
+
+def train_model(with_vineyard):
+    os.system('sync; echo 3 > /proc/sys/vm/drop_caches')
+    st = time.time()
+    if with_vineyard:
+        x_train_data = vineyard.get(name="X_train", fetch=True)
+        y_train_data = vineyard.get(name="Y_train", fetch=True)
+    else:
+        x_train_data = pd.read_pickle("/data/x_train.pkl")
+        y_train_data = pd.read_pickle("/data/y_train.pkl")
+    ed = time.time()
+    print('##################################')
+    print('read x_train and y_train data time: ', ed - st)
+
+    model = LinearRegression()
+    model.fit(x_train_data, y_train_data)
+
+    joblib.dump(model, '/data/model.pkl')
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--with_vineyard', type=bool, default=False, help='Whether to use vineyard')
+    args = parser.parse_args()
+    st = time.time()
+    print('Training model...')
+    train_model(args.with_vineyard)
+    ed = time.time()
+    print('##################################')


Test patch:
diff --git a/pkg/ddc/jindocache/transform_test.go b/pkg/ddc/jindocache/transform_test.go
index d437b891..670438bc 100644
--- a/pkg/ddc/jindocache/transform_test.go
+++ b/pkg/ddc/jindocache/transform_test.go
@@ -19,6 +19,8 @@ package jindocache
 import (
 	"os"
 	"reflect"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 	"testing"
 
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
@@ -1370,3 +1372,92 @@ func TestJindoCacheEngine_transformCacheSet(t *testing.T) {
 		})
 	}
 }
+
+func TestJindoEngine_transformSecret(t *testing.T) {
+	jindocacheSecret := &corev1.Secret{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "test",
+			Namespace: "fluid",
+		},
+		Data: map[string][]byte{
+			"AccessKeyId":     []byte("test"),
+			"AccessKeySecret": []byte("test"),
+		},
+	}
+	testObjs := []runtime.Object{}
+	testObjs = append(testObjs, (*jindocacheSecret).DeepCopy())
+
+	client := fake.NewFakeClientWithScheme(testScheme, testObjs...)
+	engine := JindoCacheEngine{
+		name:      "test",
+		namespace: "fluid",
+		Client:    client,
+		Log:       fake.NullLogger(),
+		runtime: &datav1alpha1.JindoRuntime{
+			Spec: datav1alpha1.JindoRuntimeSpec{
+				Fuse: datav1alpha1.JindoFuseSpec{},
+			},
+		},
+	}
+	ctrl.SetLogger(zap.New(func(o *zap.Options) {
+		o.Development = true
+	}))
+
+	var tests = []struct {
+		runtime *datav1alpha1.JindoRuntime
+		dataset *datav1alpha1.Dataset
+		value   *Jindo
+	}{
+		{&datav1alpha1.JindoRuntime{
+			Spec: datav1alpha1.JindoRuntimeSpec{
+				Fuse: datav1alpha1.JindoFuseSpec{},
+				Worker: datav1alpha1.JindoCompTemplateSpec{
+					Replicas:     2,
+					Resources:    corev1.ResourceRequirements{},
+					Env:          nil,
+					NodeSelector: nil,
+				},
+			},
+		}, &datav1alpha1.Dataset{
+			Spec: datav1alpha1.DatasetSpec{
+				Mounts: []datav1alpha1.Mount{{
+					MountPoint: "pvc:///mnt/test",
+					Name:       "test",
+					EncryptOptions: []datav1alpha1.EncryptOption{{
+						Name: "fs.oss.accessKeyId",
+						ValueFrom: datav1alpha1.EncryptOptionSource{
+							SecretKeyRef: datav1alpha1.SecretKeySelector{
+								Name: "test",
+								Key:  "AccessKeyId",
+							},
+						},
+					},
+						{
+							Name: "fs.oss.accessKeySecret",
+							ValueFrom: datav1alpha1.EncryptOptionSource{
+								SecretKeyRef: datav1alpha1.SecretKeySelector{
+									Name: "test",
+									Key:  "AccessKeySecret",
+								},
+							},
+						}},
+				}},
+			},
+		}, &Jindo{}},
+	}
+	for _, test := range tests {
+		err := engine.transformMaster(test.runtime, "/test", test.value, test.dataset, true)
+		if err != nil {
+			t.Errorf("error %v", err)
+		}
+		if test.value.SecretKey != "AccessKeyId" {
+			t.Errorf("expected value AccessKeyId, but got %v", test.value.SecretKey)
+		}
+		if test.value.SecretValue != "AccessKeySecret" {
+			t.Errorf("expected value AccessKeyId, but got %v", test.value.SecretKey)
+		}
+		if test.value.Secret != "test" {
+			t.Errorf("expected value AccessKeyId, but got %v", test.value.SecretKey)
+		}
+	}
+}
diff --git a/pkg/ddc/vineyard/runtime_info_test.go b/pkg/ddc/vineyard/runtime_info_test.go
index 9b035986..da890a3b 100644
--- a/pkg/ddc/vineyard/runtime_info_test.go
+++ b/pkg/ddc/vineyard/runtime_info_test.go
@@ -51,7 +51,7 @@ func TestGetRuntimeInfo(t *testing.T) {
 	addedMeta := []v1alpha1.Metadata{
 		{
 			PodMetadata: v1alpha1.PodMetadata{
-				Labels: map[string]string{"fluid.io/node-puhlish-method": "symlink"},
+				Labels: map[string]string{"fluid.io/node-publish-method": "symlink"},
 			},
 			Selector: metav1.GroupKind{Kind: "PersistentVolume"},
 		},
diff --git a/pkg/ddc/vineyard/transform_test.go b/pkg/ddc/vineyard/transform_test.go
index 3c626d3c..a6c15e6e 100755
--- a/pkg/ddc/vineyard/transform_test.go
+++ b/pkg/ddc/vineyard/transform_test.go
@@ -14,7 +14,9 @@ limitations under the License.
 package vineyard
 
 import (
+	"os"
 	"reflect"
+	"strings"
 	"testing"
 
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
@@ -37,25 +39,47 @@ func TestTransformFuse(t *testing.T) {
 		o.Development = true
 	}))
 
-	var tests = []struct {
+	var tests = map[string]struct {
 		runtime   *datav1alpha1.VineyardRuntime
 		value     *Vineyard
 		expect    []string
 		expectEnv map[string]string
 	}{
-		{&datav1alpha1.VineyardRuntime{
-			Spec: datav1alpha1.VineyardRuntimeSpec{
-				Fuse: datav1alpha1.VineyardSockSpec{
-					Image:           "dummy-fuse-image",
-					ImageTag:        "dummy-tag",
-					ImagePullPolicy: "IfNotPresent",
-					Env:             map[string]string{"TEST_ENV": "true"},
-					CleanPolicy:     "OnRuntimeDeleted",
+		"test image, imageTag and pullPolicy": {
+			runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Fuse: datav1alpha1.VineyardSockSpec{
+						Image:           "dummy-fuse-image",
+						ImageTag:        "dummy-tag",
+						ImagePullPolicy: "IfNotPresent",
+						Env:             map[string]string{"TEST_ENV": "true"},
+						CleanPolicy:     "OnRuntimeDeleted",
+					},
+				},
+			},
+			value:     &Vineyard{},
+			expect:    []string{"dummy-fuse-image", "dummy-tag", "IfNotPresent", "OnRuntimeDeleted"},
+			expectEnv: map[string]string{"TEST_ENV": "true"},
+		},
+		"test image, imageTag and pullPolicy from env": {
+			runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Fuse: datav1alpha1.VineyardSockSpec{
+						ImagePullPolicy: "IfNotPresent",
+						Env:             map[string]string{"TEST_ENV": "true"},
+						CleanPolicy:     "OnRuntimeDeleted",
+					},
 				},
 			},
-		}, &Vineyard{}, []string{"dummy-fuse-image", "dummy-tag", "IfNotPresent", "OnRuntimeDeleted"}, map[string]string{"TEST_ENV": "true"}},
+			value:     &Vineyard{},
+			expect:    []string{"image-from-env", "image-tag-from-env", "IfNotPresent", "OnRuntimeDeleted"},
+			expectEnv: map[string]string{"TEST_ENV": "true"},
+		},
 	}
-	for _, test := range tests {
+	for k, test := range tests {
+		if strings.Contains(k, "env") {
+			os.Setenv("VINEYARD_FUSE_IMAGE_ENV", "image-from-env:image-tag-from-env")
+		}
 		engine := &VineyardEngine{}
 		engine.Log = ctrl.Log
 		engine.transformFuse(test.runtime, test.value)
@@ -75,6 +99,9 @@ func TestTransformFuse(t *testing.T) {
 		if !reflect.DeepEqual(test.value.Fuse.Env, test.expectEnv) {
 			t.Errorf("Expected Fuse Env %v, got %v", test.expectEnv, test.value.Fuse.Env)
 		}
+		if strings.Contains(k, "env") {
+			os.Unsetenv("VINEYARD_FUSE_IMAGE_ENV")
+		}
 	}
 }
 
@@ -103,11 +130,32 @@ func TestTransformMaster(t *testing.T) {
 				},
 			},
 		},
+		"test image, imageTag and pullPolicy from env": {
+			runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Master: datav1alpha1.MasterSpec{
+						VineyardCompTemplateSpec: datav1alpha1.VineyardCompTemplateSpec{
+							ImagePullPolicy: "IfNotPresent",
+						},
+					},
+				},
+			},
+			wantValue: &Vineyard{
+				Master: Master{
+					Image:           "image-from-env",
+					ImageTag:        "image-tag-from-env",
+					ImagePullPolicy: "IfNotPresent",
+				},
+			},
+		},
 	}
 
 	engine := &VineyardEngine{Log: fake.NullLogger()}
 	ds := &datav1alpha1.Dataset{}
 	for k, v := range testCases {
+		if strings.Contains(k, "env") {
+			os.Setenv("VINEYARD_MASTER_IMAGE_ENV", "image-from-env:image-tag-from-env")
+		}
 		gotValue := &Vineyard{}
 		if err := engine.transformMasters(v.runtime, ds, gotValue); err == nil {
 			if gotValue.Master.Image != v.wantValue.Master.Image {
@@ -132,6 +180,9 @@ func TestTransformMaster(t *testing.T) {
 				)
 			}
 		}
+		if strings.Contains(k, "env") {
+			os.Unsetenv("VINEYARD_MASTER_IMAGE_ENV")
+		}
 	}
 }
 
@@ -160,10 +211,33 @@ func TestTransformWorker(t *testing.T) {
 				},
 			},
 		},
+		"test replicas, image, imageTag and pullPolicy from env": {
+			runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Replicas: 3,
+					Worker: datav1alpha1.VineyardCompTemplateSpec{
+						Replicas:        2,
+						Image:           "test-image",
+						ImageTag:        "test-tag",
+						ImagePullPolicy: "IfNotPresent",
+					},
+				},
+			},
+			wantValue: &Vineyard{
+				Worker: Worker{
+					Image:           "image-from-env",
+					ImageTag:        "image-tag-from-env",
+					ImagePullPolicy: "IfNotPresent",
+				},
+			},
+		},
 	}
 
 	engine := &VineyardEngine{Log: fake.NullLogger()}
 	for k, v := range testCases {
+		if strings.Contains(k, "env") {
+			os.Setenv("VINEYARD_WORKER_IMAGE_ENV", "image-from-env:image-tag-from-env")
+		}
 		gotValue := &Vineyard{}
 		engine.runtimeInfo, _ = base.BuildRuntimeInfo("test", "test", "vineyard", v.runtime.Spec.TieredStore)
 		if err := engine.transformWorkers(v.runtime, gotValue); err == nil {
@@ -196,6 +270,9 @@ func TestTransformWorker(t *testing.T) {
 				)
 			}
 		}
+		if strings.Contains(k, "env") {
+			os.Unsetenv("VINEYARD_WORKER_IMAGE_ENV")
+		}
 	}
 }
 
diff --git a/samples/vineyard/test-data/test-data.py b/samples/vineyard/test-data/test-data.py
new file mode 100644
index 00000000..0021e960
--- /dev/null
+++ b/samples/vineyard/test-data/test-data.py
@@ -0,0 +1,42 @@
+import argparse
+import os
+import time
+
+from sklearn.metrics import mean_squared_error
+
+import joblib
+import pandas as pd
+import vineyard
+
+def test_model(with_vineyard):
+    os.system('sync; echo 3 > /proc/sys/vm/drop_caches')
+    st = time.time()
+    if with_vineyard:
+        x_test_data = vineyard.get(name="X_test", fetch=True)
+        y_test_data = vineyard.get(name="Y_test", fetch=True)
+    else:
+        x_test_data = pd.read_pickle("/data/x_test.pkl")
+        y_test_data = pd.read_pickle("/data/y_test.pkl")
+    ed = time.time()
+    print('##################################')
+    print('read x_test and y_test execution time: ', ed - st)
+
+    model = joblib.load("/data/model.pkl")
+    y_pred = model.predict(x_test_data)
+
+    err = mean_squared_error(y_test_data, y_pred)
+
+    with open('/data/output.txt', 'a') as f:
+        f.write(str(err))
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--with_vineyard', type=bool, default=False, help='Whether to use vineyard')
+    args = parser.parse_args()
+    st = time.time()
+    print('Testing model...')
+    test_model(args.with_vineyard)
+    ed = time.time()
+    print('##################################')
+    print('Testing model data time: ', ed - st)
diff --git a/test/prow/testcases/common/csi_nodepublish_symlink.py b/test/prow/testcases/common/csi_nodepublish_symlink.py
index 97cee2a0..63b4cade 100644
--- a/test/prow/testcases/common/csi_nodepublish_symlink.py
+++ b/test/prow/testcases/common/csi_nodepublish_symlink.py
@@ -48,7 +48,7 @@ def main():
     dataset = fluidapi.assemble_dataset("alluxio-webufs").set_namespaced_name(namespace, name)
     runtime = fluidapi.assemble_runtime("alluxio-webufs").set_namespaced_name(namespace, name)
 
-    csi_symlink_annotation = "[{\"Labels\": {\"fluid.io/node-puhlish-method\": \"symlink\"}, \"selector\": { \"kind\": \"PersistentVolume\"}}]"
+    csi_symlink_annotation = "[{\"Labels\": {\"fluid.io/node-publish-method\": \"symlink\"}, \"selector\": { \"kind\": \"PersistentVolume\"}}]"
     runtime.set_annotation("data.fluid.io/metadataList", csi_symlink_annotation)
 
     flow = TestFlow("Common - Test CSI NodePublishVolume symlink")