Fusion with Google GKE and Google object storage
Fusion streamlines the deployment of Nextflow pipeline in a Kubernetes cluster, because it replaces the need to configure and maintain a shared file system in your cluster.
This feature requires Nextflow 23.02.1-edge or later.
Cluster preparation
- Create a GKE "standard" cluster ("Autopilot" is not supported yet). See Google documentation for details.
 - Make sure to use instance types with 2 or more CPUs and providing SSD instance storage (families: 
n1,n2,c2,m1,m2,m3) - Make sure to enable the Workload identity feature when creating (or updating) the cluster
- "Enable Workload Identity" in the cluster "Security" setting
 - "Enable GKE Metadata Server" in the node group "Security" settings
 - Configure the cluster following the See the Google documentation for details. documentation
 - The following values were used in this example (replace them with values corresponding your environment):
CLUSTER_NAME: the GKE cluster name e.g.cluster-1COMPUTE_REGION: the GKE cluster region e.g.europe-west1NAMESPACE: the GKE namespace e.g.fusion-demoKSA_NAME: the GKE service account name e.g.fusion-saGSA_NAME: the Google service account e.g.gsa-demoGSA_PROJECT: the Google project id e.g.my-nf-project-261815PROJECT_ID: the Google project id e.g.my-nf-project-261815ROLE_NAME: the role to grant access permission to the Google Storage bucket e.g.roles/storage.admin
 
 - Create the K8s role and rolebinding required to run Nextflow applying the Kubernetes config shown below:
 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: fusion-demo
  name: fusion-role
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/status", "pods/log", "pods/exec"]
    verbs: ["get", "list", "watch", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: fusion-demo
  name: fusion-rolebind
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: fusion-role
subjects:
  - kind: ServiceAccount
    name: fusion-sa
---
apiVersion: v1
kind: Secret
metadata:
  namespace: fusion-demo
  name: fusion-sa-token
  annotations:
    kubernetes.io/service-account.name: fusion-sa
type: kubernetes.io/service-account-token
...
Nextflow configuration
The minimal Nextflow configuration looks like the following:
wave.enabled = true
fusion.enabled = true
process.executor = 'k8s'
process.scratch = false
k8s.context = '<YOUR-GKE-CLUSTER-CONTEXT>'
k8s.namespace = 'fusion-demo'
k8s.serviceAccount = 'fusion-sa'
k8s.pod.nodeSelector = 'iam.gke.io/gke-metadata-server-enabled=true'
In the above snippet replace <YOUR-GKE-CLUSTER-CONTEXT> with the name of the context in you Kubernetes configuration,
and save it to a file named nextflow.config into the pipeline launching directory.
Then launch the pipeline execution with the usual run command:
nextflow run <YOUR PIPELINE SCRIPT> -w gs://<YOUR-BUCKET>/work
Make sure to specify a Google Storage bucket to which you have read-write access as work directory.