## Introduction
- It injects http response latency 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 lossy/flaky http responses.
!!! tip "Scenario: Add latency to the HTTP request"

## 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 kubectl get pods
in operator namespace (typically, litmus
).If not, install from here
- Ensure that the pod-http-latency
experiment resource is available in the cluster by executing kubectl get chaosexperiments
in the desired namespace. If not, install from here
## 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"
```yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-http-latency-sa
namespace: default
labels:
name: pod-http-latency-sa
app.kubernetes.io/part-of: litmus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-http-latency-sa
namespace: default
labels:
name: pod-http-latency-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-latency-sa
namespace: default
labels:
name: pod-http-latency-sa
app.kubernetes.io/part-of: litmus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-http-latency-sa
subjects:
- kind: ServiceAccount
name: pod-http-latency-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"
Mandatory Fields
Variables |
Description |
Notes |
TARGET_SERVICE_PORT |
Port of the service to target |
Defaults to port 80 |
LATENCY |
Latency value in ms to be added to requests |
Defaults to 2000 |
Optional Fields
Variables |
Description |
Notes |
PROXY_PORT |
Port where the proxy will be listening for requests |
Defaults to 20000 |
NETWORK_INTERFACE |
Network interface to be used for the proxy |
Defaults to `eth0` |
TOXICITY |
Percentage of HTTP requests to be affected |
Defaults to 100 |
CONTAINER_RUNTIME |
container runtime interface for the cluster |
Defaults to containerd, supported values: docker, containerd and crio for litmus and only docker for pumba LIB |
SOCKET_PATH |
Path of the containerd/crio/docker socket file |
Defaults to `/run/containerd/containerd.sock` |
TOTAL_CHAOS_DURATION |
The duration of chaos injection (seconds) |
Default (60s) |
TARGET_PODS |
Comma separated list of application pod name subjected to pod http latency chaos |
If not provided, it will select target pods randomly based on provided appLabels |
PODS_AFFECTED_PERC |
The Percentage of total pods to target |
Defaults to 0 (corresponds to 1 replica), provide numeric value only |
LIB_IMAGE |
Image used to run the netem command |
Defaults to `litmuschaos/go-runner:latest` |
RAMP_TIME |
Period to wait before and after injection of chaos in sec |
|
SEQUENCE |
It defines sequence of chaos execution for multiple target pods |
Default value: parallel. Supported: serial, parallel |
## 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-latency/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-latency-sa
experiments:
- name: pod-http-latency
spec:
components:
env:
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
```
### 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-latency/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-latency-sa
experiments:
- name: pod-http-latency
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"
```
### Latency
It defines the latency value to be added to the http request. It can be tuned via `LATENCY` ENV.
Use the following example to tune this:
[embedmd]:# (pod-http-latency/latency.yaml yaml)
```yaml
## provide the latency value
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-latency-sa
experiments:
- name: pod-http-latency
spec:
components:
env:
# provide the latency value
- name: LATENCY
value: '2000'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
```
### Toxicity
It defines the toxicity value to be added to the http request. It can be tuned via `TOXICITY` ENV.
Toxicity value defines the percentage of the total number of http requests to be affected.
Use the following example to tune this:
[embedmd]:# (pod-http-latency/toxicity.yaml yaml)
```yaml
## provide the toxicity
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-latency-sa
experiments:
- name: pod-http-latency
spec:
components:
env:
# toxicity is the probability of the request to be affected
# provide the percentage value in the range of 0-100
# 0 means no request will be affected and 100 means all request will be affected
- name: TOXICITY
value: "100"
# 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-latency/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-latency-sa
experiments:
- name: pod-http-latency
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'
```
### 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(`/run/containerd/containerd.sock`). For other runtimes provide the appropriate path.
Use the following example to tune this:
[embedmd]:# (pod-http-latency/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-latency-sa
experiments:
- name: pod-http-latency
spec:
components:
env:
# runtime for the container
# supports docker, containerd, crio
- name: CONTAINER_RUNTIME
value: 'containerd'
# path of the socket file
- name: SOCKET_PATH
value: '/run/containerd/containerd.sock'
# provide the port of the targeted service
- name: TARGET_SERVICE_PORT
value: "80"
```