Implementación
Puede que se pregunte por qué Kubernetes tiene objetos diferentes para hacer casi el mismo trabajo. Como se mencionó anteriormente, las características de RC se han ampliado a través de RS y la implementación. Hemos’visto el RS, que ha hecho el mismo trabajo de RC, solo con un formato de selector diferente. Ahora vamos’a desproteger el otro objeto nuevo, implementar – la implementación y explorar las características que provienen.
Crear una implementación
Si simplemente cambia el atributo Kind de ReplicaSet a Deployment,’obtendrá el archivo YAML de un objeto de implementación:
#deploy-webserver-do.yaml apiVersion: apps/v1 kind: Deployment metadata: name: webserver labels: app: webserver spec: replicas: 1 selector: matchLabels: app: webserver matchExpressions: - {key: app, operator: In, values: [webserver]} template: metadata: name: webserver labels: app: webserver spec: containers: - name: webserver image: contrailk8sdayone/contrail-webserver securityContext: privileged: true ports: - containerPort: 80
Crear una implementación con el kubectl
mando
..... $ kubectl create -f deploy-webserver-do.yaml deployment.extensions/webserver created $ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/webserver 1 1 1 1 21s .....
En realidad, la implementación es un nivel de abstracción relativamente superior al de RC y RS. La implementación no crea un conjunto Pod directamente, y el comando Descripción revela lo siguiente:
$ kubectl describe deployments Name: webserver Namespace: default CreationTimestamp: Sat, 14 Sep 2019 23:17:17 -0400 Labels: app=webserver Annotations: deployment.kubernetes.io/revision: 5 kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{}, "labels":{"app":"webserver"}, "name":"webserver","namespace":"defa... Selector: app=webserver,app in (webserver) Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=webserver Containers: webserver: Image: contrailk8sdayone/contrail-webserver Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason .... ..... ...... Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: webserver-7c7c458cc5 (1/1 replicas created) #<--- Events: <none>
Flujo de trabajo de implementación
Cuando se crea una implementación, se crea automáticamente un conjunto de réplicas. Los pods definidos en el objeto de implementación se crean y supervisan mediante’la implementación s REPLICASET.
El flujo de trabajo se muestra en la Figure 1:

Es posible que aún se pregunte por qué es necesario utilizar RS como una capa más en el mismo nivel’de implementación y en la siguiente respuesta.
Actualización sucesiva
La característica actualización sucesiva es una de las características más eficaces que incluye el objeto de implementación. A’continuación, demuestre la característica con un caso de prueba para explicar cómo funciona.
De hecho, existe una función de actualización gradual similar para el antiguo objeto RC. La implementación tiene bastantes inconvenientes en comparación con la nueva versión admitida por la implementación. En este libro, nos centraremos en la implementación nueva con la implementación.
Caso de prueba: Actualización sucesiva
Suponga que tiene una nginx-deployment
, con réplica = 3 y 1.7.9 de imagen Pod. Deseamos actualizar la imagen de la versión 1.7.9 a la nueva versión 1.9.1 de la imagen. Con kuberctl puede usar la opción definir imagen y especificar el nuevo número de versión para activar la actualización:
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 deployment.extensions/nginx-deployment image updated
Ahora vuelva a comprobar la información de la implementación:
$ kubectl describe deployment/nginx-deployment Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 11 Sep 2018 20:49:45 -0400 Labels: app=nginx Annotations: deployment.Kubernetes.io/revision=2 Selector: app=nginx Replicas: 3 desired | 1 updated | 4 total | 3 available | 1 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.9.1 #<------ Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason .... ..... ..... Available True MinimumReplicasAvailable Progressing True ReplicaSetUpdated OldReplicaSets: nginx-deployment-67594d6bf6 (3/3 replicas created) NewReplicaSet: nginx-deployment-6fdbb596db (1/1 replicas created) Events: Type Reason Age From Message .... ...... ... .... ...... Normal ScalingReplicaSet 4m deployment-controller Scaled up replica set nginx-deployment-67594d6bf6 to 3 #<--- Normal ScalingReplicaSet 7s deployment-controller Scaled up replica set nginx-deployment-6fdbb596db to 1 #<---
Hay dos cambios que puede observar aquí:
Se actualiza la versión de la imagen en la implementación
Se crea un nuevo RS nginx-Deployment-6fdbb596db, con una réplica establecida en 1
Y con el nuevo RS con la réplica en 1, se genera un nuevo conjunto Pod (el cuarto):
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-67594d6bf6-88wqk 1/1 Running 0 4m nginx-deployment-67594d6bf6-m4fbj 1/1 Running 0 4m nginx-deployment-67594d6bf6-td2xn 1/1 Running 0 4m nginx-deployment-6fdbb596db-4b8z7 0/1 ContainerCreating 0 17s #<------
El nuevo conjunto Pod se proporciona con la nueva imagen:
$ kubectl describe pod/nginx-deployment-6fdbb596db-4b8z7 | grep Image: ...(snipped)... Image: nginx:1.9.1 #<--- ...(snipped)...
Mientras la antigua caja Pod aún está en la imagen antigua:
$ kubectl describe pod/nginx-deployment-67594d6bf6-td2xn | grep Image: ...(snipped)... Image: nginx:1.7.9 #<------ ...(snipped)...
’Esperemos y siga comprobando el estado… de los pods finalmente se terminarán todos los pods antiguos y se ejecutarán – tres nuevos pods los nombres Pod confirmamos que son nuevos:
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-6fdbb596db-4b8z7 1/1 Running 0 1m nginx-deployment-6fdbb596db-bsw25 1/1 Running 0 18s nginx-deployment-6fdbb596db-n9tpg 1/1 Running 0 21s
Así que la actualización se realiza y todos los pods se ejecutan con la nueva versión de la imagen.
Cómo funciona
Espera, es posible que esto no se actualice, se debe llamar un reemplazo, ya que Kubernetes utilizó tres nuevos pods con nuevas imágenes para reemplazar los pods antiguos. Hablando de forma precisa, esto es cierto. Pero así es cómo funciona. La’filosofía de Kubernetes s es que los pods son más baratos, – y la sustitución es fácil Imagínese qué cantidad de trabajo será cuando tenga que iniciar sesión en cada conjunto Pod, desinstalar imágenes antiguas, limpiar el entorno, solo para instalar una nueva imagen. Veamos’más detalles de este proceso y comprenda por qué se denomina actualización sucesiva.
Cuando se actualiza la caja Pod con nuevo software, el objeto de implementación introduce un nuevo RS que iniciará el proceso de actualización del conjunto Pod. La idea aquí es no iniciar sesión en el conjunto Pod existente y, en su lugar, hacer que la imagen se actualice en contexto, el nuevo RS crea simplemente un nuevo conjunto Pod equipado con el nuevo lanzamiento de software. Una vez que este nuevo conjunto (y adicional) esté activo y en funcionamiento, el RS original se reducirá en uno, por lo que el número total de pods en marcha permanecerá sin cambios. El nuevo RS continuará utilizándose en una sola vez y el original de RS se reducirá en una escala. Este proceso se repite hasta que el número de pods creado por el nuevo RS alcance el número de réplica original definido en la implementación, y eso es cuando se terminan todos los pods de RS originales. El proceso se representa en la Figure 2.

Como puede ver, todo el proceso de crear un nuevo RS, escalar el nuevo RS, y reducir simultáneamente el antiguo uno al mismo tiempo, está completamente automatizado y se encarga de todo el objeto de implementación. Es una implementación que está implementando y impulsando el objeto ReplicaSet, que, en este sentido, funciona solo como un back-end.
Por este motivo, la implementación se considera un objeto de capa superior en Kubernetes y la razón por la que se recomienda oficialmente que no utilice nunca ReplicaSet solo, sin implementación.
Record
La implementación también tiene la capacidad de registrar todo el proceso de las actualizaciones sucesivas, por si es necesario, puede revisar el historial de actualizaciones después de que finalice el trabajo de actualización:
$ kubectl describe deployment/nginx-deployment Name: nginx-deployment ...(snipped)... NewReplicaSet: nginx-deployment-6fdbb596db (3/3 replicas created) Events: Type Reason Age From Message Normal ScalingReplicaSet 28m deployment-controller Scaled up replica set nginx-deployment-67594d6bf6 to 3 Normal ScalingReplicaSet 24m deployment-controller Scaled up replica set nginx-deployment-6fdbb596db to 1 Normal ScalingReplicaSet 23m deployment-controller Scaled down replica set nginx-deployment-67594d6bf6 to 2 Normal ScalingReplicaSet 23m deployment-controller Scaled up replica set nginx-deployment-6fdbb596db to 2 Normal ScalingReplicaSet 23m deployment-controller Scaled down replica set nginx-deployment-67594d6bf6 to 1 Normal ScalingReplicaSet 23m deployment-controller Scaled up replica set nginx-deployment-6fdbb596db to 3 Normal ScalingReplicaSet 23m deployment-controller Scaled down replica set nginx-deployment-67594d6bf6 to 0
Pausa/reanudar/deshacer
Además, también puede pausar/reanudar el proceso de actualización para comprobar los cambios antes de continuar:
$ kubectl rollout pause deployment/nginx-deployment $ kubectl rollout resume deployment/nginx-deployment
Puede incluso deshacer la actualización cuando se producen errores durante la ventana de mantenimiento:
$ kubectl rollout undo deployment/nginx-deployment $ kubectl describe deployment/nginx-deployment Name: nginx-deployment ...(snipped)... NewReplicaSet: nginx-deployment-6fdbb596db (3/3 replicas created) NewReplicaSet: nginx-deployment-67594d6bf6 (3/3 replicas created) Events: Type Reason Age From Message Normal DeploymentRollback 8m deployment-controller Rolled back deployment "nginx-deployment" to revision 1 #<------ Normal ScalingReplicaSet 8m deployment-controller Scaled up replica set nginx-deployment-67594d6bf6 to 1 #<------ Normal ScalingReplicaSet 8m deployment-controller Scaled down replica set nginx-deployment-6fdbb596db to 2 #<------ Normal ScalingReplicaSet 8m deployment-controller Scaled up replica set nginx-deployment-67594d6bf6 to 2 #<------ Normal ScalingReplicaSet 8m deployment-controller Scaled up replica set nginx-deployment-67594d6bf6 to 3 #<------ Normal ScalingReplicaSet 8m deployment-controller Scaled down replica set nginx-deployment-6fdbb596db to 1 #<------ Normal ScalingReplicaSet 8m deployment-controller Scaled down replica set nginx-deployment-6fdbb596db to 0 #<------
Normalmente, esto se hace cuando se rompe algo en la implementación. En comparación con la cantidad de trabajo que se tarda en preparar para actualizar el software durante las ventanas de mantenimiento de los viejos tiempos, ésta es una característica sorprendente para todo el que sufrió la actualización de software.
Es similar a la Junos comando de restauración mágica que probablemente utilice todos los días cuando necesite revertir rápidamente los cambios realizados en el enrutador.