Flujo de trabajo de Kubernetes

He estado usando kubernetes desde hace un time.

$ kubectl version Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0+2831379", GitCommit:"283137936a 498aed572ee22af6774b6fb6e9fd94", GitTreeState:"not a git tree", BuildDate:"2016-07-05T15:40:25Z", GoV ersion:"go1.6.2", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"2", GitVersion:"v1.2.0", GitCommit:"5cb86ee022267586db 386f62781338b0483733b3", GitTreeState:"clean", BuildDate:"", GoVersion:"", Compiler:"", Platform:""} 

Normalmente establezco un controller de input, service y replicación para cada proyecto.

 apiVersion: extensions/v1beta1 kind: Ingress metadata: namespace: portifolio name: portifolio-ingress spec: rules: - host: www.cescoferraro.xyz http: paths: - path: / backend: serviceName: portifolio servicePort: 80 --- apiVersion: v1 kind: Service metadata: namespace: portifolio name: portifolio labels: name: portifolio spec: selector: name: portifolio ports: - name: web port: 80 targetPort: 80 protocol: TCP --- apiVersion: v1 kind: ReplicationController metadata: namespace: portifolio name: portifolio labels: name: portifolio spec: replicas: 1 selector: name: portifolio template: metadata: namespace: portifolio labels: name: portifolio spec: containers: - image: cescoferraro/portifolio:latest imagePullPolicy: Always name: portifolio env: - name: KUBERNETES value: "true" - name: BRANCH value: "production" 

Mi "problema" es que para implementar mi aplicación generalmente lo hago:

 kubectl -f delete kubernetes.yaml kubectl -f create kubernetes.yaml 

Desearía poder usar un solo command para implementar, siempre que mi aplicación esté activada o desactivada. Las actualizaciones continuas no funcionan cuando utilizo la misma image (creo que es un error en la versión de mi server kubernetes). Pero tampoco funciona cuando la aplicación nunca se implementó.

He leído sobre Implementaciones. Me pregunto cómo podría ayudarme.

Objetivos 1. Implementar si la aplicación es nueva. 2. Reemplazar los pod existentes por otros nuevos usando una nueva image del logging de Docker.

No creo que mantener todos los resources dentro de un solo manifiesto lo ayude con lo que quiere lograr, ya que es probable que su Servicio, Entrada y Replicación no cambien simultáneamente.

Si todo lo que desea hacer es desplegar nuevos pods, le recomendaría replace su ReplicationController con un deployment . Los manifiestos tienen casi la misma syntax, por lo que es fácil migrar desde RC estándar, y se puede realizar una actualización continua del lado del server con un solo kubectl replace -f manifest.yml .

Tenga en count que incluso con un recurso de Implementación no puede desencadenar una nueva implementación si no ha cambiado nada en su manifiesto. kubectl replace simplemente no haría nada. Por lo tanto, podría, por ejemplo, incrementar o cambiar una label dentro de su manifiesto para forzar la implementación, si es necesario (por ejemplo, revision: 003 ).

Como ya se ha escrito en la respuesta anterior, se recomienda utilizar un Despliegue en lugar de un ReplicationController para esto.

Uso de imagePullPolicy: Always solo se asegurará de que Kubernetes docker pull un acoplador antes de iniciar nuevos POD. No obliga a la recreación de POD cuando no cambia nada en el recurso de Implementación.

Sugeriría agregar 2 cosas a su solución:

  • Agregue una label a la Implementación con el valor CURRENT_DATE como valor de marcador de position
  • Agregue un guión de shell simple a su proyecto que reemplaza el marcador de position con la date actual + hora y luego usa kubectl para aplicar los resources.

Ejemplo de script Bash

 #!/usr/bin/env bash sed "s/CURRENT_DATE/$(date)/" kubernetes.yaml | kubectl apply -f - 

A continuación, utilice este script para volver a implementarlo en lugar de llamar a kubectl solo.

Esto solo se entiende como un ejemplo muy simple. Cuando se trata de crear / aplicar / parchar resources en Kubernetes, las cosas se complican cada vez más por el time. Si esto sucede, considere usar algunas soluciones de templates más avanzadas, por ejemplo, usando Python y Jinja2.

Podría usar una implementación para esto. kubectl set image deploy/my-app app=user/image:tag --record la primera vez, y después solo tiene que hacer kubectl set image deploy/my-app app=user/image:tag --record y listo.

Al hacer eso, también puedes hacer cosas interesantes como kubectl rollout undo deploy/my-app u get historial y estado.

Puede considerar usar Argo .

Argo es un motor de flujo de trabajo de código abierto para Kubernetes. Permite definir la implementación de aplicaciones complejas basadas en microservices utilizando YAML en el repository de origen y volver a implementar automáticamente la aplicación en el cambio de YAML (por ejemplo, en cada compromiso con la twig de production ).