Chore [Docs]: Http Chaos Status Code experiment docs (#3677)

* Added http status code chaos experiment docs

Signed-off-by: avaakash <as86414@gmail.com>

* Added status code in examples

Signed-off-by: avaakash <as86414@gmail.com>

* Added in index

Signed-off-by: avaakash <as86414@gmail.com>

* Added explanation for random code selection and list of supported value

Signed-off-by: avaakash <as86414@gmail.com>

* fixed typos

Signed-off-by: avaakash <as86414@gmail.com>

* comment improvements

Signed-off-by: avaakash <as86414@gmail.com>

* updated image for headers

Signed-off-by: avaakash <as86414@gmail.com>
This commit is contained in:
Akash Shrivastava 2022-07-19 14:22:36 +05:30 committed by GitHub
parent 1ae9414182
commit 7803b54d25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 604 additions and 0 deletions

View File

@ -101,6 +101,11 @@ Chaos actions that apply to generic Kubernetes resources are classified into thi
<td>Injects HTTP latency into Application Pod</td>
<td><a href="/litmus/experiments/categories/pods/pod-http-latency">pod-http-latency</a></td>
</tr>
<tr>
<td>Pod HTTP Status Code</td>
<td>Injects HTTP status code chaos into Application Pod</td>
<td><a href="/litmus/experiments/categories/pods/pod-http-status-code">pod-http-status-code</a></td>
</tr>
<tr>
<td>Pod HTTP Modify Body</td>
<td>Injects HTTP modify body into Application Pod</td>

View File

@ -0,0 +1,435 @@
## Introduction
- It injects http status code chaos inside the pod which modifies the status code of the response from the provided application server to desired status code provided by user on the service whose port is provided as `TARGET_SERVICE_PORT` by starting proxy server and then redirecting the traffic through the proxy server.
- It can test the application's resilience to error code http responses from the provided application server.
!!! tip "Scenario: Modify http response status code of the HTTP request"
![Pod HTTP Status Code](../../images/pod-http.png)
## Uses
??? info "View the uses of the experiment"
coming soon
## Prerequisites
??? info "Verify the prerequisites"
- Ensure that Kubernetes Version > 1.17
- 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>pod-http-status-code</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=charts/generic/pod-http-status-code/experiment.yaml">here</a>
## Default Validations
??? info "View the default validations"
The application pods should be in running state before and after chaos injection.
## Minimal RBAC configuration example (optional)
!!! 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 [litmus-admin](https://litmuschaos.github.io/litmus/litmus-admin-rbac.yaml) RBAC, which is pre installed in the cluster as part of the agent setup.
??? note "View the Minimal RBAC permissions"
[embedmd]:# (https://raw.githubusercontent.com/litmuschaos/chaos-charts/master/charts/generic/pod-http-status-code/rbac.yaml yaml)
```yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-http-status-code-sa
namespace: default
labels:
name: pod-http-status-code-sa
app.kubernetes.io/part-of: litmus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-http-status-code-sa
namespace: default
labels:
name: pod-http-status-code-sa
app.kubernetes.io/part-of: litmus
rules:
# Create and monitor the experiment & helper pods
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update", "deletecollection"]
# Performs CRUD operations on the events inside chaosengine and chaosresult
- apiGroups: [""]
resources: ["events"]
verbs: ["create","get","list","patch","update"]
# Fetch configmaps details and mount it to the experiment pod (if specified)
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get","list",]
# Track and get the runner, experiment, and helper pods log
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
# for creating and managing to execute comands inside target container
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get","list","create"]
# deriving the parent/owner details of the pod(if parent is anyof {deployment, statefulset, daemonsets})
- apiGroups: ["apps"]
resources: ["deployments","statefulsets","replicasets", "daemonsets"]
verbs: ["list","get"]
# deriving the parent/owner details of the pod(if parent is deploymentConfig)
- apiGroups: ["apps.openshift.io"]
resources: ["deploymentconfigs"]
verbs: ["list","get"]
# deriving the parent/owner details of the pod(if parent is deploymentConfig)
- apiGroups: [""]
resources: ["replicationcontrollers"]
verbs: ["get","list"]
# deriving the parent/owner details of the pod(if parent is argo-rollouts)
- apiGroups: ["argoproj.io"]
resources: ["rollouts"]
verbs: ["list","get"]
# for configuring and monitor the experiment job by the chaos-runner pod
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create","list","get","delete","deletecollection"]
# for creation, status polling and deletion of litmus chaos resources used within a chaos workflow
- apiGroups: ["litmuschaos.io"]
resources: ["chaosengines","chaosexperiments","chaosresults"]
verbs: ["create","list","get","patch","update","delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-http-status-code-sa
namespace: default
labels:
name: pod-http-status-code-sa
app.kubernetes.io/part-of: litmus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-http-status-code-sa
subjects:
- kind: ServiceAccount
name: pod-http-status-code-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 experiment.
## Experiment tunables
??? info "check the experiment tunables"
<h2>Mandatory Fields</h2>
<table>
<tr>
<th> Variables </th>
<th> Description </th>
<th> Notes </th>
</tr>
<tr>
<td> TARGET_SERVICE_PORT </td>
<td> Port of the service to target</td>
<td>Defaults to port 80 </td>
</tr>
<tr>
<td> STATUS_CODE </td>
<td> Modified status code for the HTTP response</td>
<td> If no value is provided, then a random value is selected from the list of supported values.
Supported values: [200, 201, 202, 204, 300, 301, 302, 304, 307, 400, 401, 403, 404, 500, 501, 502, 503, 504].
Defaults to random status code </td>
</tr>
<tr>
<td> MODIFY_RESPONSE_BODY </td>
<td> Whether to modify the body as per the status code provided.</td>
<td> If true, then the body is replaced by a default template for the status code. Defaults to true </td>
</tr>
</table>
<h2>Optional Fields</h2>
<table>
<tr>
<th> Variables </th>
<th> Description </th>
<th> Notes </th>
</tr>
<tr>
<td> PROXY_PORT </td>
<td> Port where the proxy will be listening for requests</td>
<td> Defaults to 20000 </td>
</tr>
<tr>
<td> NETWORK_INTERFACE </td>
<td> Network interface to be used for the proxy</td>
<td> Defaults to `eth0` </td>
<tr>
<td> CONTAINER_RUNTIME </td>
<td> container runtime interface for the cluster</td>
<td> Defaults to docker, supported values: docker, containerd and crio for litmus and only docker for pumba LIB </td>
</tr>
<tr>
<td> SOCKET_PATH </td>
<td> Path of the containerd/crio/docker socket file </td>
<td> Defaults to `/var/run/docker.sock` </td>
</tr>
<tr>
<td> TOTAL_CHAOS_DURATION </td>
<td> The duration of chaos injection (seconds) </td>
<td> Default (60s) </td>
</tr>
<tr>
<td> TARGET_PODS </td>
<td> Comma separated list of application pod name subjected to pod http status code chaos</td>
<td> If not provided, it will select target pods randomly based on provided appLabels</td>
</tr>
<tr>
<td> PODS_AFFECTED_PERC </td>
<td> The Percentage of total pods to target </td>
<td> Defaults to 0 (corresponds to 1 replica), provide numeric value only </td>
</tr>
<tr>
<td> LIB_IMAGE </td>
<td> Image used to run the netem command </td>
<td> Defaults to `litmuschaos/go-runner:latest` </td>
</tr>
<tr>
<td> RAMP_TIME </td>
<td> Period to wait before and after injection of chaos in sec </td>
<td> </td>
</tr>
<tr>
<td> SEQUENCE </td>
<td> It defines sequence of chaos execution for multiple target pods </td>
<td> Default value: parallel. Supported: serial, parallel </td>
</tr>
</table>
## Experiment Examples
### Common and Pod specific tunables
Refer the [common attributes](../common/common-tunables-for-all-experiments.md) and [Pod specific tunable](common-tunables-for-pod-experiments.md) to tune the common tunables for all experiments and pod specific tunables.
### Target Service Port
It defines the port of the targeted service that is being targeted. It can be tuned via `TARGET_SERVICE_PORT` ENV.
Use the following example to tune this:
[embedmd]:# (pod-http-status-code/target-service-port.yaml yaml)
```yaml
## provide the port of the targeted service
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
# modified status code for the http response
- name: STATUS_CODE
value: '500'
```
### Proxy Port
It defines the port on which the proxy server will listen for requests. It can be tuned via `PROXY_PORT` ENV.
Use the following example to tune this:
[embedmd]:# (pod-http-status-code/proxy-port.yaml yaml)
```yaml
## provide the port for proxy server
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# provide the port for proxy server
- name: PROXY_PORT
value: '8080'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
# modified status code for the http response
- name: STATUS_CODE
value: '500'
```
### Status Code
It defines the status code value for the http response. It can be tuned via `STATUS_CODE` ENV.
Use the following example to tune this:
[embedmd]:# (pod-http-status-code/status-code.yaml yaml)
```yaml
## modified status code for the http response
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# modified status code for the http response
# if no value is provided, a random status code from the supported code list will selected
# if an invalid status code is provided, the experiment will fail
# supported status code list: [200, 201, 202, 204, 300, 301, 302, 304, 307, 400, 401, 403, 404, 500, 501, 502, 503, 504]
- name: STATUS_CODE
value: '500'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
```
### Modify Response Body
It defines whether to modify the respone body with a pre-defined template to match with the status code value of the http response. It can be tuned via `MODIFY_RESPONSE_BODY` ENV.
Use the following example to tune this:
[embedmd]:# (pod-http-status-code/modify-body-with-response.yaml yaml)
```yaml
## whether to modify the body as per the status code provided
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# whether to modify the body as per the status code provided
- name: "MODIFY_RESPONSE_BODY"
value: "true"
# modified status code for the http response
- name: STATUS_CODE
value: '500'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
```
### Network Interface
It defines the network interface to be used for the proxy. It can be tuned via `NETWORK_INTERFACE` ENV.
Use the following example to tune this:
[embedmd]:# (pod-http-status-code/network-interface.yaml yaml)
```yaml
## provide the network interface for proxy
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# provide the network interface for proxy
- name: NETWORK_INTERFACE
value: "eth0"
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: '80'
# modified status code for the http response
- name: STATUS_CODE
value: '500'
```
### Container Runtime Socket Path
It defines the `CONTAINER_RUNTIME` and `SOCKET_PATH` ENV to set the container runtime and socket file path.
- `CONTAINER_RUNTIME`: It supports `docker`, `containerd`, and `crio` runtimes. The default value is `docker`.
- `SOCKET_PATH`: It contains path of docker socket file by default(`/var/run/docker.sock`). For other runtimes provide the appropriate path.
Use the following example to tune this:
[embedmd]:# (pod-http-status-code/container-runtime-and-socket-path.yaml yaml)
```yaml
## provide the container runtime and socket file path
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# runtime for the container
# supports docker, containerd, crio
- name: CONTAINER_RUNTIME
value: 'docker'
# path of the socket file
- name: SOCKET_PATH
value: '/var/run/docker.sock'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
# modified status code for the http response
- name: STATUS_CODE
value: '500'
```

View File

@ -0,0 +1,31 @@
## provide the container runtime and socket file path
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# runtime for the container
# supports docker, containerd, crio
- name: CONTAINER_RUNTIME
value: 'docker'
# path of the socket file
- name: SOCKET_PATH
value: '/var/run/docker.sock'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
# modified status code for the http response
- name: STATUS_CODE
value: '500'

View File

@ -0,0 +1,27 @@
## whether to modify the body as per the status code provided
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# whether to modify the body as per the status code provided
- name: "MODIFY_RESPONSE_BODY"
value: "true"
# modified status code for the http response
- name: STATUS_CODE
value: '500'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"

View File

@ -0,0 +1,27 @@
## provide the network interface for proxy
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# provide the network interface for proxy
- name: NETWORK_INTERFACE
value: "eth0"
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: '80'
# modified status code for the http response
- name: STATUS_CODE
value: '500'

View File

@ -0,0 +1,27 @@
## provide the port for proxy server
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# provide the port for proxy server
- name: PROXY_PORT
value: '8080'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
# modified status code for the http response
- name: STATUS_CODE
value: '500'

View File

@ -0,0 +1,27 @@
## modified status code for the http response
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# modified status code for the http response
# if no value is provided, a random status code from the supported code list will selected
# if an invalid status code is provided, the experiment will fail
# supported status code list: [200, 201, 202, 204, 300, 301, 302, 304, 307, 400, 401, 403, 404, 500, 501, 502, 503, 504]
- name: STATUS_CODE
value: '500'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"

View File

@ -0,0 +1,24 @@
## provide the port of the targeted service
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: engine-nginx
spec:
engineState: "active"
annotationCheck: "false"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
chaosServiceAccount: pod-http-status-code-sa
experiments:
- name: pod-http-status-code
spec:
components:
env:
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
# modified status code for the http response
- name: STATUS_CODE
value: '500'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 228 KiB

View File

@ -100,6 +100,7 @@ nav:
- Pod Network Loss: experiments/categories/pods/pod-network-loss.md
- Pod Network Partition: experiments/categories/pods/pod-network-partition.md
- Pod HTTP Latency: experiments/categories/pods/pod-http-latency.md
- Pod HTTP Status Code: experiments/categories/pods/pod-http-status-code.md
- Pod HTTP Modify Body: experiments/categories/pods/pod-http-modify-body.md
- Pod HTTP Modify Header: experiments/categories/pods/pod-http-modify-header.md
- Node Chaos: