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:test2En 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: 4strategy: canarypercentage: 25En 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: canarytrafficSplitMethod: smipercentage: 20baselineAndCanaryReplicas: 1En 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:
- Acción de implementación especificada con
strategy: canaryypercentage: $(someValue). - 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.
- 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:
|
| 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.