Project: Litmus (Observability and Analysis / Chaos Engineering)
File: gcp-vm-instance-stop.md

It causes power-off of a GCP VM instance by instance name or list of instance names before bringing it back to the running state after the specified chaos duration. It helps to check the performance of the application/process running on the VM instance. When the `MANAGEDINSTANCEGROUP` is `enable` then the experiment will not try to start the instances post chaos, instead it will check the addition of new instances to the instance group. !!! tip "Scenario: stop the gcp vm" ??? info "View the uses of the experiment" coming soon ??? info "Verify the prerequisites" Ensure that Kubernetes Version > 1.16 Ensure that the Litmus Chaos Operator is running by executing <code>kubectl get pods</code> in operator namespace (typically, <code>litmus</code>).If not, install from <a href="https://v1-docs.litmuschaos.io/docs/getstarted/#install-litmus">here</a> Ensure that the <code>gcp-vm-instance-stop</code> experiment resource is available in the cluster by executing <code>kubectl get chaosexperiments</code> in the desired namespace. If not, install from <a href="https://hub.litmuschaos.io/api/chaos/master?file=faults/gcp/gcp-vm-instance-stop/fault.yaml">here</a> Ensure that you have sufficient GCP permissions to stop and start the GCP VM instances. Ensure to create a Kubernetes secret having the GCP service account credentials in the default namespace. A sample secret file looks like: ```yaml apiVersion: v1 kind: Secret metadata: name: cloud-secret type: Opaque stringData: type: project_id: privatekeyid: private_key: client_email: client_id: auth_uri: token_uri: authproviderx509certurl: clientx509cert_url: ``` ??? info "View the default validations" VM instance should be in healthy state. !!! tip "NOTE" If you are using this experiment as part of a litmus workflow scheduled constructed & executed from chaos-center, then you may be making use of the RBAC, which is pre installed in the cluster as part of the agent setup. ??? note "View the Minimal RBAC permissions" ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: gcp-vm-instance-stop-sa namespace: default labels: name: gcp-vm-instance-stop-sa app.kubernetes.io/part-of: litmus apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: gcp-vm-instance-stop-sa labels: name: gcp-vm-instance-stop-sa app.kubernetes.io/part-of: litmus rules: apiGroups: [""] resources: ["pods"] verbs: ["create","delete","get","list","patch","update", "deletecollection"] apiGroups: [""] resources: ["events"] verbs: ["create","get","list","patch","update"] apiGroups: [""] resources: ["secrets","configmaps"] verbs: ["get","list",] apiGroups: [""] resources: ["pods/log"] verbs: ["get","list","watch"] apiGroups: [""] resources: ["pods/exec"] verbs: ["get","list","create"] apiGroups: ["batch"] resources: ["jobs"] verbs: ["create","list","get","delete","deletecollection"] apiGroups: ["litmuschaos.io"] resources: ["chaosengines","chaosexperiments","chaosresults"] verbs: ["create","list","get","patch","update","delete"] apiGroups: [""] resources: ["nodes"] verbs: ["get","list"] apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: gcp-vm-instance-stop-sa labels: name: gcp-vm-instance-stop-sa app.kubernetes.io/part-of: litmus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: gcp-vm-instance-stop-sa subjects: kind: ServiceAccount name: gcp-vm-instance-stop-sa namespace: default ``` Use this sample RBAC manifest to create a chaosServiceAccount in the desired (app) namespace. This example consists of the minimum necessary role permissions to execute the

??? info "check the experiment tunables" <h2>Mandatory Fields</h2> <table> <tr> <th> Variables </th> <th> Description </th> <th> Notes </th> </tr> <tr> <td> GCPPROJECTID </td> <td> GCP project ID to which the VM instances belong </td> <td> All the VM instances must belong to a single GCP project </td> </tr> <tr> <td> VMINSTANCENAMES </td> <td> Name of target VM instances </td> <td> Multiple instance names can be provided as instance1,instance2,... </td> </tr> <tr> <td> ZONES </td> <td> The zones of the target VM instances </td> <td> Zone for every instance name has to be provided as zone1,zone2,... in the same order of <code>VMINSTANCENAMES</code> </td> </tr> </table> <h2>Optional Fields</h2> <table> <tr> <th> Variables </th> <th> Description </th> <th> Notes </th> </tr> <tr> <td> TOTALCHAOSDURATION </td> <td> The total time duration for chaos insertion (sec) </td> <td> Defaults to 30s </td> </tr> <tr> <td> CHAOS_INTERVAL </td> <td> The interval (in sec) between successive instance termination </td> <td> Defaults to 30s </td> </tr> <tr> <td> MANAGEDINSTANCEGROUP </td> <td> Set to <code>enable</code> if the target instance is the part of a managed instance group </td> <td> Defaults to <code>disable</code> </td> </tr> <tr> <td> SEQUENCE </td> <td> It defines sequence of chaos execution for multiple instance </td> <td> Default value: parallel. Supported: serial, parallel </td> </tr> <tr> <td> RAMP_TIME </td> <td> Period to wait before and after injection of chaos in sec </td> <td> </td> </tr> </table> Refer the to tune the common tunables for all the experiments. It will stop all the instances with the given `VMINSTANCENAMES` instance names and corresponding `ZONES` zone names in `GCPPROJECTID` project. `NOTE:` The `VMINSTANCENAMES` contains multiple comma-separated vm instances. The comma-separated zone names should be provided in the same order as instance names. Use the following example to tune this: ```yaml apiVersion: litmuschaos.io/v1alpha1 kind: ChaosEngine metadata: name: engine-nginx spec: engineState: "active" annotationCheck: "false" chaosServiceAccount: gcp-vm-instance-stop-sa experiments: name: gcp-vm-instance-stop spec: components: env: name: VMINSTANCENAMES value: 'instance-01,instance-02' name: ZONES value: 'zone-01,zone-02' name: GCPPROJECTID value: 'project-id' name: TOTALCHAOSDURATION value: '60' ``` If vm instances belong to a managed instance group then provide the `MANAGEDINSTANCEGROUP` as `enable` else provided it as `disable`, which is the default value. Use the following example to tune this: ```yaml apiVersion: litmuschaos.io/v1alpha1 kind: ChaosEngine metadata: name: engine-nginx spec: engineState: "active" annotationCheck: "false" chaosServiceAccount: gcp-vm-instance-stop-sa experiments: name: gcp-vm-instance-stop spec: components: env: name: MANAGEDINSTANCEGROUP value: 'enable' name: VMINSTANCENAMES value: 'instance-01,instance-02' name: ZONES value: 'zone-01,zone-02' name: GCPPROJECTID value: 'project-id' name: TOTALCHAOSDURATION value: '60' ``` The multiple iterations of chaos can be tuned via setting `CHAOS_INTERVAL` ENV. Which defines the delay between each iteration of chaos. Use the following example to tune this: ```yaml apiVersion: litmuschaos.io/v1alpha1 kind: ChaosEngine metadata: name: engine-nginx spec: engineState: "active" annotationCheck: "false" chaosServiceAccount: gcp-vm-instance-stop-sa experiments: name: gcp-vm-instance-stop spec: components: env: name: CHAOS_INTERVAL value: '15' name: TOTALCHAOSDURATION value: '60' name: VMINSTANCENAMES value: 'instance-01,instance-02' name: ZONES value: 'zone-01,zone-02' name: GCPPROJECTID value: 'project-id' ```