Ahora toca el turno de hablar de los ReplicaSet 1 y los Deployment 2.
ReplicaSet
El objeto de un ReplicaSet es el de mantener un conjunto estable de réplicas de Pods ejecutándose en todo momento. Así, se usa en numerosas ocasiones para garantizar la disponibilidad de un número específico de Pods idénticos.
Como vemos, los objetos ReplicaSet nos permiten realizar escalamiento horizontal de nuestros pods. Dicho esto, lo más común es no manejar directamente nuestros ReplicaSets, si no hacerlo mediante un Deployment Controller, ya que esto nos da varias conveniencias.
Deployment
Un controlador de Deployment proporciona actualizaciones declarativas para los Pods y los ReplicaSets.
Cuando describes el estado deseado en un objeto Deployment, el controlador del Deployment se encarga de cambiar el estado actual al estado deseado de forma controlada. Puedes definir Deployments para crear nuevos ReplicaSets, o eliminar Deployments existentes y adoptar todos sus recursos con nuevos Deployments.
Definiendo un Deployment
Ahora veamos como definir un deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Una particularidad que tenemos en este caso respecto a los ejemplos previos es el uso de template. Esto es debido a que un objeto puede definir a su vez otros objetos.
En este ejemplo, primero definimos un objeto de tipo Deployment, pero también debemos definir el ReplicaSet, que a su vez debe definir el Pod. Todo debe ir en la jerarquía correcta.
Veamos los pasos del deplyment.yml:
- Primero definimos un objeto de tipo Deployment con el nombre nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
- Definimos el numero de replicas mediante replicas,
- El campo
selector.matchLabels.app
identifica los pods que debe gestionar. Por lo que debe coincidir con el label del pod.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
- Finalmente definimos el pod mediante el campo template. Utilizando el label
nginx
- Con el campo spec definimos el contenedor que ejecutara el pod, el nombre y la imagen.
- Ademas abrimos el puesto 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Ahora creamos nuestro deployment:
▶ kubectl apply -f deployment.yml
deployment.apps/nginx-deployment created
Si obtenemos los pods de nuestro cluster, veremos que ya 3 ejecutandose al mismo tiempo:
▶ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d556bf558-bq846 1/1 Running 0 58s
nginx-deployment-d556bf558-h4qc5 1/1 Running 0 58s
nginx-deployment-d556bf558-pw87w 1/1 Running 0 58s