# Sample installation

1. Prepare a cluster and setup kubectl context
Do whatever you want to customize your cluster. You can use existing cluster
or create a new one.
- **ML Usage** GPU normally is required for deep learning task.
You may consider create **zero-sized GPU node-pool with autoscaling**.
Please reference [GPU Tutorial](/samples/tutorials/gpu/).
- **Security** You may consider use **Workload Identity** in GCP cluster.

Here for simplicity, we create a small cluster with **--scopes=cloud-platform**
which grants all the GCP permissions to the cluster.

```
gcloud container clusters create mycluster \
  --zone us-central1-a \
  --machine-type n1-standard-2 \
  --scopes cloud-platform \
  --enable-autoscaling \
  --min-nodes 1 \
  --max-nodes 5 \
  --num-nodes 3
```

2. Prepare CloudSQL

Create CloudSQL instance. [Console](https://console.cloud.google.com/sql/instances).

Here is a sample for demo.

```
gcloud beta sql instances create mycloudsqlname \
  --database-version=MYSQL_5_7 \
  --tier=db-n1-standard-1 \
  --region=us-central1 \
  --root-password=password123
```

You may use **Private IP** to well protect your CloudSQL.
If you use **Private IP**, please go to [VPC network peering](https://console.cloud.google.com/networking/peering/list)
to double check whether the "cloudsql-mysql-googleais-com" is created and the "Exchange custom routes" is enabled. You
are expected to see "Peer VPC network is connected".

3. Prepare GCS Bucket

Create Cloud Storage bucket. [Console](https://console.cloud.google.com/storage).

```
gsutil mb -p myProjectId gs://myBucketName/
```

4. Customize your values
- Edit **params.env**, **params-db-secret.env** and **cluster-scoped-resources/params.env**
- Edit kustomization.yaml to set your namespace, e.x. "kubeflow"

5. (Optional.) If the cluster is on Workload Identity, please run **[gcp-workload-identity-setup.sh](../gcp-workload-identity-setup.sh)**
  The script prints usage documentation when calling without argument. Note, you should
  call it with `USE_GCP_MANAGED_STORAGE=true` env var.

  - make sure the Google Service Account (GSA) can access the CloudSQL instance and GCS bucket
  - if your workload calls other GCP APIs, make sure the GSA can access them

6. Install

```
kubectl apply -k sample/cluster-scoped-resources/

kubectl wait crd/applications.app.k8s.io --for condition=established --timeout=60s

kubectl apply -k sample/
# If upper one action got failed, e.x. you used wrong value, try delete, fix and apply again
# kubectl delete -k sample/

kubectl wait applications/mypipeline -n kubeflow --for condition=Ready --timeout=1800s
```

Now you can find the installation in [Console](http://console.cloud.google.com/ai-platform/pipelines)