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

  1. https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/ ↩︎

  2. https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ ↩︎