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 https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/ ↩︎ https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ ↩︎