You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.5 KiB
Markdown
91 lines
2.5 KiB
Markdown
## Resiliency of pods
|
|
|
|
|
|
#### 1. Simulate a node failure
|
|
|
|
A pod is the smallest unit of compute in kubernetes. It is tied to a single node runtime and does not come with a lot of workload logic.
|
|
|
|
To ensure that controle plan no schedule pod run this command
|
|
```bash
|
|
kubectl taint node/k3d-upec-server-0 node-role.kubernetes.io/master:NoSchedule
|
|
```
|
|
|
|
|
|
This command prints the node running our simple-pod.
|
|
|
|
```bash
|
|
kubectl get pod/simple-pod-nginx -o jsonpath='{.spec.nodeName}{"\n"}'
|
|
```
|
|
|
|
<br>
|
|
We will observe the behaviour of this pod in the event of a node failure.
|
|
|
|
1. Stop the node where the pod is running with `docker stop <node>`
|
|
|
|
2. Check the state of the pod. Is it still running ?
|
|
|
|
> Don't forget to run `docker start <node>` before pursuing.
|
|
|
|
|
|
#### 2. Create replicas
|
|
|
|
A naive solution to this problem is to create replicas of this pod spread across multiple nodes.
|
|
|
|
You will create a `ReplicationController` resource that adds workload logic to our application by maintaining 3 replicas of our pod.
|
|
|
|
> The `spec.template` object describes the pod that will be created in the case of insufficient replicas. It is the same as the pod declaration.
|
|
|
|
```yaml
|
|
---
|
|
apiVersion: v1
|
|
kind: ReplicationController
|
|
metadata:
|
|
name: simple-rc-nginx
|
|
spec: {}
|
|
```
|
|
|
|
> Be careful in the usage of labels with selectors. Read the documentation.
|
|
|
|
<br>
|
|
As usual, you can monitor the state of the controller and the numbers of ready replicas.
|
|
|
|
```bash
|
|
kubectl get rc/simple-rc-nginx
|
|
NAME DESIRED CURRENT READY AGE
|
|
simple-rc-nginx 3 3 3 21s
|
|
```
|
|
|
|
<br>
|
|
If you delete one pod, the controller should detect it and schedule a new pod to replace it.
|
|
|
|
<br>
|
|
|
|
Additionally you can scale replicas up and down, either by modifying the resource/manifest or with kubectl.
|
|
```bash
|
|
kubectl scale --replicas=5 rc/simple-rc-nginx
|
|
```
|
|
|
|
#### 3. Create a service
|
|
|
|
Port forwarding to a pod is not very convenient with multiple replicas. Ideally we need a way to address them in a load balanced manner.
|
|
A `Service` resource is the standard way of exposing an application inside the cluster. It uses selectors to distribute traffic amongst selected pods.
|
|
|
|
Create a `svc.spec.type.clusterIP` service to expose the replicas inside the cluster.
|
|
|
|
> You should consider using labelled selectors as you did for the RC.
|
|
|
|
```yaml
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: simple-rc-nginx
|
|
spec: {}
|
|
```
|
|
|
|
|
|
You can then access this service through a forwarded port.
|
|
|
|
```bash
|
|
kubectl port-forward svc/simple-rc-nginx 8080:80
|
|
```
|