Project: Litmus (Observability and Analysis / Chaos Engineering)
File: pod-network-corruption.md

It injects packet corruption on the specified container by starting a traffic control (tc) process with netem rules to add egress packet corruption It can test the application's resilience to lossy/flaky network !!! tip "Scenario: Corrupt the network packets of target pod" ??? 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>pod-network-corruption</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/kubernetes/pod-network-corruption/fault.yaml">here</a> ??? info "View the default validations" The application pods should be in running state before and after chaos injection. !!! 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: pod-network-corruption-sa namespace: default labels: name: pod-network-corruption-sa app.kubernetes.io/part-of: litmus apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-network-corruption-sa namespace: default labels: name: pod-network-corruption-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: ["configmaps"] verbs: ["get","list",] apiGroups: [""] resources: ["pods/log"] verbs: ["get","list","watch"] apiGroups: [""] resources: ["pods/exec"] verbs: ["get","list","create"] apiGroups: ["apps"] resources: ["deployments","statefulsets","replicasets", "daemonsets"] verbs: ["list","get"] apiGroups: ["apps.openshift.io"] resources: ["deploymentconfigs"] verbs: ["list","get"] apiGroups: [""] resources: ["replicationcontrollers"] verbs: ["get","list"] apiGroups: ["argoproj.io"] resources: ["rollouts"] verbs: ["list","get"] apiGroups: ["batch"] resources: ["jobs"] verbs: ["create","list","get","delete","deletecollection"] 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-network-corruption-sa namespace: default labels: name: pod-network-corruption-sa app.kubernetes.io/part-of: litmus roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pod-network-corruption-sa subjects: kind: ServiceAccount name: pod-network-corruption-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. ??? info "check the experiment tunables" <h2>Optional Fields</h2> <table> <tr> <th> Variables </th> <th> Description </th> <th> Notes </th> </tr> <tr> <td> NETWORK_INTERFACE </td> <td> Name of ethernet interface considered for shaping traffic </td> <td> </td> </tr> <tr> <td> TARGET_CONTAINER </td> <td> Name of container which is subjected to network corruption </td> <td> Applicable for containerd & CRI-O runtime only. Even with these runtimes, if the value is not provided, it injects chaos on the first container of the pod </td> </tr> <tr> <td> NETWORKPACKETCORRUPTION_PERCENTAGE </td> <td> Packet corruption in percentage </td> <td> Default (100) </td> </tr> <tr> <td> CONTAINER_RUNTIME </td> <td> container runtime interface for the cluster</td> <td> Defaults to containerd, 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

</td> </tr> <tr> <td> TOTALCHAOSDURATION </td> <td> The time duration for chaos insertion (seconds) </td> <td> Default (60s) </td> </tr> <tr> <td> TARGET_PODS </td> <td> Comma separated list of application pod name subjected to pod network corruption chaos</td> <td> If not provided, it will select target pods randomly based on provided appLabels</td> </tr> <tr> <td> DESTINATION_IPS </td> <td> IP addresses of the services or pods or the CIDR blocks(range of IPs), the accessibility to which is impacted </td> <td> comma separated IP(S) or CIDR(S) can be provided. if not provided, it will induce network chaos for all ips/destinations</td> </tr> <tr> <td> DESTINATION_HOSTS </td> <td> DNS Names/FQDN names of the services, the accessibility to which, is impacted </td> <td> if not provided, it will induce network chaos for all ips/destinations or DESTINATION_IPS if already defined</td> </tr> <tr> <td> SOURCE_PORTS </td> <td> ports of the target application, the accessibility to which is impacted </td> <td> comma separated port(s) can be provided. If not provided, it will induce network chaos for all ports</td> </tr> <tr> <td> DESTINATION_PORTS </td> <td> ports of the destination services or pods or the CIDR blocks(range of IPs), the accessibility to which is impacted </td> <td> comma separated port(s) can be provided. If not provided, it will induce network chaos for all ports</td> </tr> <tr> <td> PODSAFFECTEDPERC </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 </td> <td> The chaos lib used to inject the chaos </td> <td> Default value: litmus, supported values: pumba and litmus </td> </tr> <tr> <td> TC_IMAGE </td> <td> Image used for traffic control in linux </td> <td> default value is `gaiadocker/iproute2` </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> Refer the and to tune the common tunables for all experiments and pod specific tunables. It defines the network packet corruption percentage to be injected in the targeted application. It can be tuned via `NETWORKPACKETCORRUPTION_PERCENTAGE` ENV. Use the following example to tune this: ```yaml 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-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: NETWORKPACKETCORRUPTION_PERCENTAGE value: '100' #in percentage name: TOTALCHAOSDURATION value: '60' ``` The network experiments interrupt traffic for all the IPs/hosts by default. The interruption of specific IPs/Hosts can be tuned via `DESTINATIONIPS` and `DESTINATIONHOSTS` ENV. `DESTINATION_IPS`: It contains the IP addresses of the services or pods or the CIDR blocks(range of IPs), the accessibility to which is impacted. `DESTINATION_HOSTS`: It contains the DNS Names/FQDN names of the services, the accessibility to which, is impacted. Use the following example to tune this: ```yaml apiVersion:

kind: ChaosEngine metadata: name: engine-nginx spec: engineState: "active" annotationCheck: "false" appinfo: appns: "default" applabel: "app=nginx" appkind: "deployment" chaosServiceAccount: pod-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: DESTINATION_IPS value: '8.8.8.8,192.168.5.6' name: DESTINATION_HOSTS value: 'nginx.default.svc.cluster.local,google.com' name: TOTALCHAOSDURATION value: '60' ``` The network experiments interrupt traffic for all the source & destination ports by default. The interruption of specific port(s) can be tuned via `SOURCEPORTS` and `DESTINATIONPORTS` ENV. `SOURCE_PORTS`: It contains ports of the target application, the accessibility to which is impacted `DESTINATION_PORTS`: It contains the ports of the destination services or pods or the CIDR blocks(range of IPs), the accessibility to which is impacted Use the following example to tune this: ```yaml 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-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: SOURCE_PORTS value: '80' name: DESTINATION_PORTS value: '8080,9000' name: TOTALCHAOSDURATION value: '60' ``` By default, the network experiments disrupt traffic for all the source and destination ports. The specific ports can be blacklisted via `SOURCEPORTS` and `DESTINATIONPORTS` ENV. `SOURCE_PORTS`: Provide the comma separated source ports preceded by `!`, that you'd like to blacklist from the chaos. `DESTINATION_PORTS`: Provide the comma separated destination ports preceded by `!` , that you'd like to blacklist from the chaos. Use the following example to tune this: ```yaml 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-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: SOURCE_PORTS value: '!80,8080' name: DESTINATION_PORTS value: '!8080,9000' name: TOTALCHAOSDURATION value: '60' ``` The defined name of the ethernet interface, which is considered for shaping traffic. It can be tuned via `NETWORK_INTERFACE` ENV. Its default value is `eth0`. Use the following example to tune this: ```yaml 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-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: NETWORK_INTERFACE value: 'eth0' name: TOTALCHAOSDURATION value: '60' ``` It defines the `CONTAINERRUNTIME` and `SOCKETPATH` 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: ```yaml 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-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: CONTAINER_RUNTIME value: 'containerd' name: SOCKET_PATH value: '/run/containerd/containerd.sock' name: TOTALCHAOSDURATION value: '60' ``` It specifies the Pumba chaos library for the chaos injection. It can be tuned via `LIB` ENV. The defaults chaos library is `litmus`. Provide the traffic control image via `TC_IMAGE` ENV for the pumba library. Use the following example to tune this: ```yaml 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-network-corruption-sa experiments: name: pod-network-corruption spec: components: env: name: LIB value: 'pumba' name: TC_IMAGE value: 'gaiadocker/iproute2' name: TOTALCHAOSDURATION value: '60' ```