Tarea de manifiesto de Kubernetes

Use una tarea de manifiesto de Kubernetes en una canalización de compilación o versión para crear e implementar manifiestos en clústeres de Kubernetes.

Información general

En la lista siguiente se muestran las principales ventajas de esta tarea:

  • Sustitución deartefactos: la acción de implementación toma como entrada una lista de imágenes de contenedor que puede especificar junto con sus etiquetas e resúmenes. La misma entrada se sustituye en los archivos de manifiesto nontemplatized antes de la aplicación al clúster. Esta sustitución garantiza que los nodos del clúster extraigan la versión correcta de la imagen.

  • Estabilidad delmanifiesto: se comprueba el estado de lanzamiento de los objetos de Kubernetes implementados. Las comprobaciones de estabilidad se incorporan para determinar si el estado de la tarea es correcto o no.

  • Anotaciones de rastreabilidad:las anotaciones se agregan a los objetos de Kubernetes implementados para superponer la información de rastreabilidad. Se admiten las anotaciones siguientes:

    • azure-pipelines/org
    • azure-pipelines/project
    • azure-pipelines/pipeline
    • azure-pipelines/pipelineId
    • azure-pipelines/execution
    • azure-pipelines/executionuri
    • azure-pipelines/jobName
  • Control de secretos:la acción createSecret permite crear secretos del Registro de Docker mediante conexiones de servicio del Registro de Docker. También permite crear secretos genéricos mediante variables de texto sin formato o variables secretas. Antes de la implementación en el clúster, puede usar la entrada de secretos junto con la acción de implementación para aumentar los archivos de manifiesto de entrada con el valor imagePullSecrets adecuado.

  • Manifiesto de "bake":la acción de "bake" de la tarea permite la cocción de plantillas en archivos de manifiesto de Kubernetes. La acción usa herramientas como Helm, Compose y kustomize. Con la cocción, estos archivos de manifiesto de Kubernetes se pueden usar para las implementaciones en el clúster.

  • Estrategia de implementación:la elección de la estrategia de valor canario con la acción de implementación conduce a la creación de cargas de trabajo con nombres con el sufijo "-baseline" y "-canary". La tarea admite dos métodos de división de tráfico:

    • Interfaz de Service Mesh:la abstracción de la interfaz de Service Mesh (SMI) permite la configuración con proveedores de malla de servicio como Linkerd e Istio. La tarea Manifiesto de Kubernetes asigna objetos SMI TrafficSplit a los servicios estables, de línea de base y de valor canario durante el ciclo de vida de la estrategia de implementación.

      Las implementaciones de tipo "canary" que se basan en una malla de servicio y usan esta tarea son más precisas. Esta precisión se debe a que los proveedores de mallas de servicio habilitan la división de tráfico basada en porcentajes pormenorizados. La malla de servicio usa el registro de servicio y los contenedores sidecar que se insertan en pods. Esta inserción se produce junto con los contenedores de aplicaciones para lograr la división granular del tráfico.

    • Kubernetes sinmalla de servicio: en ausencia de una malla de servicio, es posible que no obtenga la división de porcentaje exacta que desea en el nivel de solicitud. Pero es posible que se puedan realizar implementaciones de valores canarios mediante variantes de línea base y de valor canario junto a la variante estable.

      El servicio envía solicitudes a pods de las tres variantes de carga de trabajo a medida que se cumplen las restricciones selector-label. El manifiesto de Kubernetes respeta estas solicitudes al crear variantes de línea base y de valor canario. Este comportamiento de enrutamiento logra el efecto previsto de enrutar solo una parte del total de solicitudes al valor canario.

    Compare las cargas de trabajo de línea base y de valor canario mediante una tarea de intervención manual en canalizaciones de versión o una tarea Retraso en canalizaciones YAML. Realice la comparación antes de usar la acción promover o rechazar de la tarea.

Acción de implementación

Parámetro Descripción
action
Acción
(Requerido)

deploy
kubernetesServiceConnection
Conexión del servicio Kubernetes
(Obligatorio a menos que la tarea se utilice en un entorno de Kubernetes)

Nombre de la conexión de servicio de Kubernetes.
namespace
Espacio de nombres
(Obligatorio a menos que la tarea se utilice en un entorno de Kubernetes)

Espacio de nombres dentro del clúster en el que se implementará.
manifests
Manifiestos
(Requerido)

Ruta de acceso a los archivos de manifiesto que se usarán para la implementación. Cada línea representa una única ruta de acceso. Un patrón de coincidencia de archivos es un valor aceptable para cada línea.
containers
Contenedores
(Opcional)

Dirección URL completa de la imagen que se va a usar para sustituciones en los archivos de manifiesto. Esta entrada acepta la especificación de varias sustituciones de artefactos en formato separado por nueva línea. Veamos un ejemplo:

containers: |
  contosodemo.azurecr.io/foo:test1
  contosodemo.azurecr.io/bar:test2

En este ejemplo, se buscan todas las referencias a contosodemo.azurecr.io/foo y en el campo de imagen de los archivos de manifiesto de contosodemo.azurecr.io/bar entrada. Para cada coincidencia encontrada, la etiqueta test1 o reemplaza la referencia test2 coincidente.
imagePullSecrets
La imagen extrae secretos
(Opcional)

Entrada multilínea donde cada línea contiene el nombre de un secreto del Registro de Docker que ya se ha configurado en el clúster. Cada nombre de secreto se agrega en imagePullSecrets para las cargas de trabajo que se encuentran en los archivos de manifiesto de entrada.
Estrategia
Estrategia
(Opcional)

La estrategia de implementación que se usa mientras se aplican los archivos de manifiesto en el clúster. Actualmente, canary es la única estrategia de implementación aceptable.
trafficSplitMethod
Método de división de tráfico
(Opcional)

Los valores aceptables son pod y smi. El valor predeterminado es pod.

Para el valor smi, la división de porcentaje de tráfico se realiza en el nivel de solicitud mediante una malla de servicio. Un administrador de clúster debe configurar una malla de servicio. Esta tarea controla la orquestación de objetos TrafficSplit de SMI.

Para el pod de valor, la división de porcentaje no es posible en el nivel de solicitud en ausencia de una malla de servicio. En su lugar, el porcentaje de entrada se usa para calcular las réplicas para la línea base y el valor canario. El cálculo es un porcentaje de réplicas que se especifican en los manifiestos de entrada para la variante estable.
Porcentaje
Porcentaje
(Obligatorio solo si la estrategia está establecida en valor de valor canario)

Porcentaje que se usa para calcular el número de réplicas de tipo baseline-variant y canary-variant de las cargas de trabajo contenidas en los archivos de manifiesto.

Para la entrada de porcentaje especificada, calcule:

(porcentajenúmero de   réplicas) / 100

Si el resultado no es un entero, se usa el suelo matemático del resultado cuando se crean variantes de línea base y valor canario.

Por ejemplo, suponga que la implementación hello-world está en el archivo de manifiesto de entrada y que las líneas siguientes están en la entrada de la tarea:

replicas: 4
strategy: canary
percentage: 25

En este caso, las implementaciones hello-world-baseline y hello-world-canary se crean con una réplica cada una. La variante de línea base se crea con la misma imagen y etiqueta que la versión estable, que es la variante de cuatro réplicas antes de la implementación. La variante canary se crea con la imagen y la etiqueta correspondientes a los cambios recién implementados.
baselineAndCanaryReplicas
Base de referencia y réplicas de valores canarios
(Opcional y pertinente solo si trafficSplitMethod está establecido en smi)

Cuando se establece trafficSplitMethod en smi,la división del porcentaje de tráfico se controla en el plano de malla de servicio. Sin embargo, puede controlar el número real de réplicas para las variantes de valores controlados y de línea base independientemente de la división del tráfico.

Por ejemplo, suponga que el manifiesto de implementación de entrada especifica 30 réplicas para la variante estable. Asimismo, suponga que especifica la siguiente entrada para la tarea:

strategy: canary
trafficSplitMethod: smi
percentage: 20
baselineAndCanaryReplicas: 1

En este caso, la variante estable recibe el 80 % del tráfico, mientras que las variantes de línea base y valor canario reciben cada una la mitad del 20 % especificado. Pero las variantes de línea base y valor canario no reciben tres réplicas cada una. En su lugar, reciben el número especificado de réplicas, lo que significa que cada una de ellas recibe una réplica.
rolloutStatusTimeout
Tiempo de espera para el estado de lanzamiento
(Opcional)

Período de tiempo (en segundos) que se debe esperar antes de finalizar la reloj en el estado de lanzamiento. El valor predeterminado es 0 (no espere).

El siguiente código YAML es un ejemplo de implementación en un espacio de nombres de Kubernetes mediante archivos de manifiesto:

steps:
- task: KubernetesManifest@0
  displayName: Deploy
  inputs:
    kubernetesServiceConnection: someK8sSC1
    namespace: default
    manifests: |
      manifests/deployment.yml
      manifests/service.yml
    containers: |
      foo/demo:$(tagVariable1)
      bar/demo:$(tagVariable2)
    imagePullSecrets: |
      some-secret
      some-other-secret

En el ejemplo anterior, la tarea intenta buscar coincidencias para las imágenes y en los foo/demo campos de imagen de los archivos de bar/demo manifiesto. Para cada coincidencia encontrada, el valor de o se anexa tagVariable1 como una etiqueta al nombre de la tagVariable2 imagen. También puede especificar resúmenes en la entrada de contenedores para la sustitución de artefactos.

Nota

Aunque puede crear acciones de implementación, promoción y rechazo con la entrada de YAML relacionada con la estrategia de implementación, la compatibilidad con una tarea de intervención manual no está disponible actualmente para las canalizaciones de compilación.

En el caso de las canalizaciones de versión, se recomienda usar acciones y entradas relacionadas con la estrategia de implementación en la secuencia siguiente:

  1. Acción de implementación especificada con strategy: canary y percentage: $(someValue) .
  2. Una tarea de intervención manual para que pueda pausar la canalización y comparar la variante de línea base con la variante de valor canario.
  3. Acción de promoción que se ejecuta si se reanuda una tarea de intervención manual y una acción de rechazo que se ejecuta si se rechaza una tarea de intervención manual.

Acciones de promoción y rechazo

Parámetro Descripción
action
Acción
(Requerido)

promover o rechazar
kubernetesServiceConnection
Conexión del servicio Kubernetes
(Requerido)

Nombre de la conexión de servicio de Kubernetes.
namespace
Espacio de nombres
(Requerido)

Espacio de nombres dentro del clúster en el que se implementará.
manifests
Manifiestos
(Requerido)

Ruta de acceso a los archivos de manifiesto que se usarán para la implementación. Cada línea representa una única ruta de acceso. Un patrón de coincidencia de archivos es un valor aceptable para cada línea.
containers
Contenedores
(Opcional)

Dirección URL de recurso completa de la imagen que se va a usar para las sustituciones en los archivos de manifiesto. La dirección URL contosodemo.azurecr.io/helloworld:test es un ejemplo.
imagePullSecrets
Secretos de extracción de imágenes
(Opcional)

Entrada multilínea donde cada línea contiene el nombre de un secreto del Registro de Docker que ya está configurado en el clúster. Cada nombre de secreto se agrega en el campo imagePullSecrets para las cargas de trabajo que se encuentran en los archivos de manifiesto de entrada.
Estrategia
Estrategia
(Opcional)

La estrategia de implementación usada en la acción de implementación antes de una acción de promoción o de rechazo. Actualmente, canary es la única estrategia de implementación aceptable.

Creación de una acción secreta

Parámetro Descripción
action
Acción
(Requerido)

createSecret
secretType
Tipo de secreto
(Requerido)

Los valores aceptables son dockerRegistry y genérico. El valor predeterminado es dockerRegistry.

Si establece secretType en dockerRegistry,el campo imagePullSecrets se crea o actualiza en un clúster para ayudar a extraer imágenes de un registro de contenedor privado.
secretName
Nombre del secreto
(Requerido)

Nombre del secreto que se va a crear o actualizar.
dockerRegistryEndpoint
Conexión del servicio de registro de Docker
(Obligatorio solo si secretType está establecido en dockerRegistry)

Las credenciales de la conexión de servicio especificada se usan para crear un secreto del Registro de Docker dentro del clúster. Los archivos de manifiesto del campo imagePullSecrets pueden hacer referencia al nombre de este secreto.
secretArguments
Argumentos secretos
(Obligatorio solo si secretType está establecido en genérico)

Acepta claves y valores literales que se usarán para crear y actualizar secretos. Veamos un ejemplo:
--from-literal=key1=value1--from-literal=key2="top secret"
kubernetesServiceConnection
Conexión del servicio Kubernetes
(Requerido)

Nombre de la conexión de servicio de Kubernetes.
namespace
Espacio de nombres
(Requerido)

Espacio de nombres del clúster en el que se va a crear un secreto.

El siguiente código YAML muestra un ejemplo de creación de secretos del Registro de Docker mediante la conexión del servicio Docker Registry:

steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: dockerRegistry
    secretName: foobar
    dockerRegistryEndpoint: demoACR
    kubernetesServiceConnection: someK8sSC
    namespace: default

Este código YAML muestra una creación de ejemplo de secretos genéricos:

steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: generic
    secretName: some-secret
    secretArguments: --from-literal=key1=value1
    kubernetesServiceConnection: someK8sSC
    namespace: default

Acción de "bake"

Parámetro Descripción
action
Acción
(Requerido)

Hornear
renderType
Motor de representación
(Requerido)

Tipo de representación utilizado para generar los archivos de manifiesto.

Los valores aceptables
y kustomize.
El valor predeterminado es helm2.
helmChart
Gráfico de Helm
(Obligatorio solo si renderType está establecido en helm2)

Ruta de acceso al gráfico de Helm que se usa para la cocción.
overrideFiles
Invalidar archivos
(Opcional y pertinente solo si renderType está establecido en helm2)

Entrada multilínea que acepta la ruta de acceso a los archivos de invalidación. Los archivos se usan cuando se cuecen archivos de manifiesto de gráficos de Helm.
Reemplaza
Invalidación de valores
(Opcional y pertinente solo si renderType está establecido en helm2)

Valores de invalidación adicionales que se usan a través del modificador de línea de comandos --set cuando se cuecen archivos de manifiesto mediante Helm.

Especifique los valores de invalidación como pares clave-valor en la clave de formato:valor. Si usa varios pares clave-valor de reemplazo, especifique cada par clave-valor en una línea independiente. Use un carácter de nueva línea como delimitador entre distintos pares clave-valor.
releaseName
Nombre de la versión.
(Opcional y pertinente solo si renderType está establecido en helm2)

Nombre de la versión usada al crear gráficos de Helm.
kustomizationPath
Ruta de acceso de Kustomization
(Opcional y pertinente solo si renderType está establecido en kustomize)

Ruta de acceso al directorio que contiene el archivo kustomization.yaml.
dockerComposeFile
Ruta de acceso al archivo de Docker Compose
(Opcional y pertinente solo si renderType está establecido en ).

Ruta de acceso al archivo de Docker Compose.

El siguiente código YAML es un ejemplo de cómo crear archivos de manifiesto de los gráficos de Helm. Observe el uso de la entrada de nombre en la primera tarea. Más adelante se hace referencia a este nombre desde el paso de implementación para especificar la ruta de acceso a los manifiestos generados por el paso de elaboración.

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx: 1.7.9

Acción de escalado

Parámetro Descripción
action
Acción
(Requerido)

scale
Tipo
Tipo
(Requerido)

Tipo de objeto de Kubernetes que se va a escalar o reducir verticalmente. Algunos ejemplos son ReplicaSet y StatefulSet.
name
Nombre
(Requerido)

Nombre del objeto de Kubernetes que se va a escalar o reducir verticalmente.
Réplicas
Recuento de réplicas
(Requerido)

Número de réplicas a las que se escala.
kubernetesServiceConnection
Conexión del servicio Kubernetes
(Requerido)

Nombre de la conexión de servicio de Kubernetes.
namespace
Espacio de nombres
(Requerido)

Espacio de nombres dentro del clúster en el que se implementará.
rolloutStatusTimeout
Tiempo de espera para el estado de lanzamiento
(Opcional)

Período de tiempo (en segundos) que se debe esperar antes de finalizar la reloj en el estado de lanzamiento. El valor predeterminado es 0 (no espere).

El siguiente código YAML muestra un ejemplo de escalado de objetos:

steps:
- task: KubernetesManifest@0
  displayName: Scale
  inputs: 
    action: scale
    kind: deployment
    name: bootcamp-demo
    replicas: 5
    kubernetesServiceConnection: someK8sSC
    namespace: default

Acción de revisión

Parámetro Descripción
action
Acción
(Requerido)

Parche
resourceToPatch
Recurso que se debe aplicar a la revisión
(Requerido)

Indica uno de los siguientes métodos de revisión:
  • Un archivo de manifiesto identifica los objetos a los que se va a aplicar la revisión.
  • Un objeto individual se identifica por tipo y nombre como destino de revisión.
Los valores aceptables son file yname. El valor predeterminado es File.
resourceFiletoPatch
Ruta del archivo
(Solo es necesario si la acción se establece en patch y resourceToPatch se establece en file)

Ruta de acceso al archivo utilizado para la revisión.
Tipo
Tipo
(Solo es necesario si resourceToPatch está establecido en el nombre)

Tipo del objeto de Kubernetes. Algunos ejemplos son ReplicaSet y StatefulSet.
name
Nombre
(Solo es necesario si resourceToPatch está establecido en el nombre)

Nombre del objeto de Kubernetes al que se va a aplicar la revisión.
mergeStrategy
Estrategia de combinación
(Requerido)

Estrategia que se va a usar para aplicar la revisión.

Los valores aceptables
y strategic. El valor predeterminado es estratégico.
Parche
Revisión
(Requerido)

Contenido de la revisión.
kubernetesServiceConnection
Conexión del servicio Kubernetes
(Requerido)

Nombre de la conexión de servicio de Kubernetes.
namespace
Espacio de nombres
(Requerido)

Espacio de nombres dentro del clúster en el que se implementará.
rolloutStatusTimeout
Tiempo de espera para el estado de lanzamiento
(Opcional)

Período de tiempo (en segundos) que se debe esperar antes de finalizar la reloj en el estado de lanzamiento. El valor predeterminado es 0 (no espere).

El código YAML siguiente muestra un ejemplo de aplicación de revisiones de objetos:

steps:
- task: KubernetesManifest@0
  displayName: Patch
  inputs: 
    action: patch
    kind: pod
    name: demo-5fbc4d6cd9-pgxn4
    mergeStrategy: strategic
    patch: '{"spec":{"containers":[{"name":"demo","image":"foobar/demo:2239"}]}}'
    kubernetesServiceConnection: someK8sSC
    namespace: default

Eliminar acción

Parámetro Descripción
action
Acción
(Requerido)

delete
Argumentos
Argumentos
(Requerido)

Argumentos que se pasarán a kubectl para eliminar los objetos necesarios. Ejemplo:
arguments: deployment hello-world foo-bar
kubernetesServiceConnection
Conexión del servicio Kubernetes
(Requerido)

Nombre de la conexión de servicio de Kubernetes.
namespace
Espacio de nombres
(Requerido)

Espacio de nombres dentro del clúster en el que se implementará.

Este código YAML muestra una eliminación de objeto de ejemplo:

steps:
- task: KubernetesManifest@0
  displayName: Delete
  inputs:
    action: delete
    arguments: deployment expressapp
    kubernetesServiceConnection: someK8sSC
    namespace: default

Solución de problemas

Mi clúster de Kubernetes está detrás de un firewall y estoy usando agentes hospedados. ¿Cómo se puede implementar en este clúster?

Puede conceder acceso a los agentes hospedados a través del firewall, permitiendo las direcciones IP de los agentes hospedados. Para más información, consulte el artículo sobre los intervalos IP del agente.

Código Abierto

Esta tarea es de código abierto en GitHub. Los comentarios y las contribuciones son bienvenidos.