Tarea Empaquetar e implementar gráficos de Helm

Azure Pipelines

Use esta tarea para implementar, configurar o actualizar un clúster de Kubernetes en Azure Container Service mediante la ejecución de comandos de Helm. Helm es una herramienta que simplifica la implementación y administración de aplicaciones de Kubernetes mediante un formato de empaquetado denominado gráficos.

Puede definir, crear versiones, compartir, instalar y actualizar incluso la aplicación de Kubernetes más compleja mediante Helm.

  • Helm le ayuda a combinar varios manifiestos de Kubernetes (yaml), como el servicio, las implementaciones, los mapas de configuración, etc. en una sola unidad denominada Gráficos de Helm. No es necesario inventar ni usar una tokenización ni una herramienta de templación.
  • Los gráficos de Helm le ayudan a administrar las dependencias de la aplicación e implementar, así como la reversión como una unidad. También son fáciles de crear, crear, publicar y compartir con otros equipos asociados.

Azure Pipelines compatibilidad integrada con gráficos de Helm:

  • La tarea del instalador de la herramienta Helm se puede usar para instalar la versión correcta de Helm en los agentes.
  • El paquete de Helm y la tarea de implementación se pueden usar para empaquetar la aplicación e implementarla en un clúster de Kubernetes. Puede usar la tarea para instalar o actualizar Tiller a un espacio de nombres de Kubernetes, conectarse de forma segura a Tiller a través de TLS para implementar gráficos o ejecutar cualquier comando de Helm, como lint.
  • La tarea helm admite la conexión a un Azure Kubernetes Service mediante una conexión de servicio de Azure. Puede conectarse a cualquier clúster de Kubernetes mediante kubeconfig o una cuenta de servicio.
  • Las implementaciones de Helm se pueden complementar mediante la tarea Kubectl; por ejemplo, create/update, imagepullsecret y otros.

Conexión de servicio

La tarea funciona con dos tipos de conexión de servicio: Azure Resource Manager y Kubernetes Service Connection.

Nota

No se requiere una conexión de servicio si un recurso de entorno que apunta a un clúster de Kubernetes ya se ha especificado en la fase de la canalización.

Azure Resource Manager

ParámetrosDescripción
connectionType
(Tipo de conexión de servicio)
(Obligatorio a menos que ya haya un recurso de entorno) Azure Resource Manager usar Azure Kubernetes Service. Conexión de Kubernetes Service para cualquier otro clúster.
Valor predeterminado: Azure Resource Manager
azureSubscriptionEndpoint
(suscripción de Azure)
(Obligatorio) Nombre de la conexión de servicio de Azure.
azureResourceGroup
(Grupo de recursos)
(Obligatorio) Nombre del grupo de recursos dentro de la suscripción.
kubernetesCluster
(clúster de Kubernetes)
(Obligatorio) Nombre del clúster de AKS.
namespace
(Espacio de nombres)
(Opcional) Espacio de nombres en el que se ejecutan los comandos kubectl. Si no se especifica, se usa el espacio de nombres predeterminado.

En este ejemplo de YAML, YAML se muestra Azure Resource Manager se usa para hacer referencia al clúster de Kubernetes. Esto se usa con uno de los comandos de Helm y los valores adecuados necesarios para el comando:

variables:
  azureSubscriptionEndpoint: Contoso
  azureContainerRegistry: contoso.azurecr.io
  azureResourceGroup: Contoso
  kubernetesCluster: Contoso

- task: HelmDeploy@0
  displayName: Helm deploy
  inputs:
    connectionType: Azure Resource Manager
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)

Conexión de Kubernetes Service

ParámetrosDescripción
kubernetesServiceEndpoint
(Conexión de servicio de Kubernetes)
(Obligatorio a menos que ya haya un recurso de entorno) Seleccione una conexión de servicio de Kubernetes.
namespace
(Espacio de nombres)
(Opcional) Espacio de nombres en el que se ejecutan los comandos kubectl. Si no se especifica, se usa el espacio de nombres predeterminado.

Este YAML de ejemplo de YAML muestra cómo se usa la conexión de servicio de Kubernetes para hacer referencia al clúster de Kubernetes. Esto se usa con uno de los comandos de Helm y los valores adecuados necesarios para el comando:

- task: HelmDeploy@0
  displayName: Helm deploy
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceEndpoint: Contoso

Valores de comando

La entrada del comando acepta uno de los siguientes comandos de Helm:create/delete/expose/get/init/install/login/logout/ls/package/rollback/upgrade.

ParámetrosDescripción
command
(Comando)
(Obligatorio) Seleccione un comando de Helm.
Valor predeterminado: ls
arguments
(Argumentos)
Opciones de comando de Helm.

En este ejemplo de YAML se muestra el comando ls:

- task: HelmDeploy@0
  displayName: Helm list
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: ls
    arguments: --all

Comando init

ParámetrosDescripción
command
(Comando)
(Obligatorio) Seleccione un comando de Helm.
Valor predeterminado: ls
canaryimage
(Usar la versión de la imagen de valor canario)
Use la imagen de Tiller de canario, la versión anterior más reciente de Tiller.
Valor predeterminado: false
upgradetiller
(Actualizar Tiller)
Actualice si Tiller ya está instalado.
Valor predeterminado: true.
waitForExecution
(Esperar)
Bloquee hasta que se complete la ejecución del comando.
Valor predeterminado: true.
arguments
(Argumentos)
Opciones de comando de Helm.

En este ejemplo de YAML se muestra el comando init:

- task: HelmDeploy@0
  displayName: Helm init
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: init
    upgradetiller: true
    waitForExecution: true
    arguments: --client-only

Comando install

ParámetrosDescripción
command
(Comando)
(Obligatorio) Seleccione un comando de Helm.
Valor predeterminado: ls
chartType
(Tipo de gráfico)
(Obligatorio) Seleccione cómo desea especificar la información del gráfico. Puede proporcionar el nombre del gráfico o la ruta de acceso de carpeta o archivo al gráfico.
Opciones disponibles: Nombre, FilePath. Valor predeterminado: Nombre
chartName
(Nombre del gráfico)
(Obligatorio) Referencia de gráfico que se va a instalar, puede ser una dirección URL o un nombre de gráfico. Por ejemplo, si el nombre del gráfico es stable/mysql,la tarea ejecutará helm install stable/mysql.
releaseName
(Nombre de la versión)
(Opcional) Nombre de la versión. Si no se especifica, se genera automáticamente. La entrada releaseName solo es válida para los comandos "install" y "upgrade".
overrideValues
(Establecer valores)
(Opcional) Establezca valores en la línea de comandos. Puede especificar varios valores separando los valores con comas. Por ejemplo, key1=val1,key2=val2. También puede especificar varios valores delimitándolos con nueva línea de la siguiente manera:
key1=val1
key2=val2

Tenga en cuenta que si tiene un valor que contiene nuevas líneas, use la opción ; de lo contrario, la tarea tratará la nueva línea como valueFile delimitador. La tarea construirá el comando helm mediante estos valores establecidos. Por ejemplo, helm install --set key1=val1 ./redis
valueFile
(Archivo de valor)
(Opcional) Especifique valores en un archivo YAML o una dirección URL. Por ejemplo, si se especifica myvalues.yaml,helm instalará --values=myvalues.yaml.
updatedependency
(Actualizar dependencia)
(Opcional) Ejecute la actualización de dependencias de Helm antes de instalar el gráfico. Actualice las dependencias de requirements.yaml al directorio charts/antes del empaquetado.
Valor predeterminado: false
waitForExecution
(Esperar)
(Opcional) Bloquee hasta que se complete la ejecución del comando.
Valor predeterminado: true.
arguments
(Argumentos)
Opciones de comando de Helm

En este ejemplo de YAML se muestra el comando install:

- task: HelmDeploy@0
  displayName: Helm install
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: install
    chartType: FilePath
    chartPath: Application/charts/sampleapp

comando package

ParámetrosDescripción
command
(Comando)
(Obligatorio) Seleccione un comando de Helm.
Valor predeterminado: ls
chartPath
(Ruta de acceso del gráfico)
(Obligatorio) Ruta de acceso al gráfico que se instalará. Puede ser una ruta de acceso a un gráfico empaquetado o una ruta de acceso a un directorio de gráfico desempaquetar. Por ejemplo, si se especifica ./redis, la tarea ejecutará helm install ./redis. Si está consumiendo un gráfico que se publica como un artefacto, la ruta de acceso será $(System.DefaultWorkingDirectory)/ARTIFACT-NAME/Charts/CHART-NAME
version
(Versión)
(Opcional) Especifique la versión exacta del gráfico que se instalará. Si no se especifica, se instala la versión más reciente. Establezca la versión del gráfico en esta versión de semver.
destination
(Destino)
(Opcional) Especifique valores en un archivo YAML o una dirección URL.
Valor predeterminado: $(Build.ArtifactStagingDirectory)
updatedependency
(Actualizar dependencia)
(Opcional) Ejecute la actualización de dependencias de Helm antes de instalar el gráfico. Actualice las dependencias de requirements.yaml al directorio charts/antes del empaquetado.
Valor predeterminado: false
save
(Guardar)
(Opcional) Guarde el gráfico empaquetado en el repositorio de gráficos local.
Valor predeterminado: true.
arguments
(Argumentos)
Opciones de comando de Helm.

En este ejemplo de YAML se muestra el comando package:

- task: HelmDeploy@0
  displayName: Helm package
  inputs:
    command: package
    chartPath: Application/charts/sampleapp
    destination: $(Build.ArtifactStagingDirectory)

Comando upgrade

ParámetrosDescripción
command
(Comando)
(Obligatorio) Seleccione un comando de Helm.
Valor predeterminado: ls
chartType
(Tipo de gráfico)
(Obligatorio) Seleccione cómo desea especificar la información del gráfico. Puede proporcionar el nombre del gráfico o la ruta de acceso de carpeta o archivo al gráfico.
Opciones disponibles: Nombre, FilePath. Valor predeterminado: Nombre
chartName
(Nombre del gráfico)
(Obligatorio) Referencia de gráfico que se va a instalar, puede ser una dirección URL o un nombre de gráfico. Por ejemplo, si el nombre del gráfico es stable/mysql,la tarea ejecutará helm install stable/mysql.
releaseName
(Nombre de la versión)
(Opcional) Nombre de la versión. Si no se especifica, se genera automáticamente.
overrideValues
(Establecer valores)
(Opcional) Establezca valores en la línea de comandos. Puede especificar varios valores separando los valores con comas. Por ejemplo, key1=val1,key2=val2. También puede especificar varios valores delimitándolos con nueva línea de la siguiente manera:
key1=val1
key2=val2

Tenga en cuenta que si tiene un valor que contiene nuevas líneas, use la opción ; de lo contrario, la tarea tratará la nueva línea como valueFile delimitador. La tarea construirá el comando helm mediante estos valores establecidos. Por ejemplo, helm install --set key1=val1 ./redis
valueFile
(Archivo de valor)
(Opcional) Especifique valores en un archivo YAML o una dirección URL. Por ejemplo, si se especifica myvalues.yaml,helm instalará --values=myvalues.yaml.
install
(Instale si la versión no está presente)
(Opcional) Si aún no existe una versión con este nombre, inicie una instalación.
Valor predeterminado: true.
recreate
(Volver a crear pods)
(Opcional) Realiza el reinicio de pods para el recurso si procede.
Valor predeterminado: false
resetValues
(Restablecer valores)
(Opcional) Restablezca los valores a los integrados en el gráfico.
Valor predeterminado: false
force
(Forzar)
(Opcional) Forzar la actualización de recursos mediante eliminación o volver a crear si es necesario.
Valor predeterminado: false
waitForExecution
(Esperar)
(Opcional) Bloquee hasta que se complete la ejecución del comando.
Valor predeterminado: true
arguments
(Argumentos)
Opciones de comando de Helm

En este ejemplo de YAML se muestra el comando de actualización:

- task: HelmDeploy@0
  displayName: Helm upgrade
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: upgrade
    chartType: filepath
    chartPath: $(Build.ArtifactStagingDirectory)/sampleapp-v0.2.0.tgz
    releaseName: azuredevopsdemo
    install: true
    waitForExecution: false

Comando save

ParámetrosDescripción
command
(Comando)
(Obligatorio) Seleccione un comando de Helm.
Valor predeterminado: ls
chartNameForACR
(Nombre del gráfico para Azure Container Registry)
(Obligatorio) Nombre del gráfico con el que se almacenará el gráfico en Azure Container Registry.
chartPathForACR
(Ruta de acceso del gráfico para Azure Container Registry)
(Obligatorio) Ruta de acceso al directorio del gráfico.
azureSubscriptionEndpointForACR
(Suscripción de Azure para Container Registry)
(Obligatorio) Seleccione una suscripción de Azure que tenga su Azure Container Registry.
azureResourceGroupForACR
(Grupo de recursos)
(Obligatorio) Seleccione un grupo de recursos de Azure que tenga su Container Registry.
azureContainerRegistry
(Azure Container Registry)
(Obligatorio) Seleccione un Azure Container Registry que se usará para insertar gráficos de Helm.
arguments
(Argumentos)
Opciones de comando de Helm

En este ejemplo de YAML se muestra el comando save:

- task: HelmDeploy@0
  displayName: Helm save
  inputs:
    command: save
    chartNameForACR: mycontainerregistry.azurecr.io/helm/hello-world:v1
    chartPathForACR: Application/charts/sampleapp
    azureSubscriptionEndpointForACR: $(azureSubscriptionEndpointForACR)
    azureResourceGroupForACR: $(azureResourceGroupForACR)
    azureContainerRegistry: $(azureContainerRegistry)

Empaquetado y firma de gráficos de Helm

En esta sección aprenderá a empaquetar y firmar gráficos de Helm en una canalización.

Generación de un par de claves pública y privada para firmar el gráfico de Helm mediante GPG

  1. Descargue GPG.

  2. Inicie el símbolo del sistema en modo de administrador. Ejecute el siguiente comando para generar un par de claves pública y privada para firmar el gráfico de Helm mediante gpg. Al crear la clave, se le pedirá el nombre de usuario y la dirección de correo electrónico. La "dirección de correo electrónico de nombre" se usa más adelante para dar nombre al par de claves pública-privada que se crea.

    gpg --full-generate-key
    

    Generar clave

  3. Se le pedirá la frase de contraseña. Dé el valor y haga clic en Aceptar.

    Captura de pantalla que muestra la frase de contraseña.

  4. Después de crear la clave, puede ver la lista de claves que contiene tanto privadas como públicas mediante el comando siguiente.

    • Para ver la lista de claves privadas

      gpg --list-secret-keys
      

      Claves privadas

    • Para ver la lista de claves públicas

      gpg --list-keys
      

      Claves públicas

  5. Almacene las claves privadas y públicas en dos archivos diferentes con la extensión gpg, como se muestra a continuación.

    • Para una clave privada
    gpg --export-secret-key 94325E18E53EDD99DD8339C3CFD9DAF0707CB788 contoso@microsoft.com > C:/somepath/privatekeys.gpg
    

    Verá el archivo privatekeys.gpg exportado a la ruta de acceso mencionada anteriormente.

    • Para una clave pública
    gpg --export-key 94325E18E53EDD99DD8339C3CFD9DAF0707CB788 contoso@microsoft.com > C:/somepath/publickey.gpg
    

    Verá el archivo publickey.gpg exportado a la ruta de acceso mencionada anteriormente.

En Azure DevOps, guarde el archivo privatekey.gpg en la sección archivos seguros de biblioteca.

Ejemplo

pool:
  name: Hosted Ubuntu 1604

variables:
  # The below variable should be secure
  HelmKeyPassphrase: contoso@123
  keyName: contoso contoso@microsoft.com
  azureSubscriptionEndpoint: contoso
  azureResourceGroup: contoso
  kubernetesCluster: contoso

steps:
- task: DownloadSecureFile@1
  displayName: Download Secure file
  inputs:
    secureFile: privatekey.gpg
  name: privateKeyRing

- task: HelmInstaller@0
  displayName: Install Helm 2.12.0
  inputs:
    helmVersion: 2.12.0

- task: HelmDeploy@0
  displayName: helm init
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: init
    arguments: --client-only

- task: HelmDeploy@0
  displayName: helm package
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: package
    chartPath: Application/charts/sampleapp
    arguments: --sign --key "$(keyName)" --keyring $(privateKeyRing.secureFilePath)
  env:
    HelmKeyPassphrase: $(HelmKeyPassphrase)

Solución de problemas

La tarea HelmDeploy produce el error "unknown flag: --wait" mientras se ejecuta "helm init --wait --client-only" en la versión helm 3.0.2.

Hay algunos cambios importantes entre Helm 2 y Helm 3. Una de ellas incluye la eliminación de tiller y, por tanto, helm init el comando ya no se admite. Quitar comando: init cuando se usa Helm 3.0 y versiones posteriores.

Cuando se usa Helm 3, si System.debug está establecido en true y la actualización de Helm es el comando que se usa, se produce un error en la canalización aunque la actualización se haya realizado correctamente.

Se trata de un problema conocido con Helm 3, ya que escribe algunos registros en stderr. La tarea de implementación de Helm se marca como con errores si hay registros en stderr o el código de salida es distinto de cero. Establezca la entrada de la tarea failOnStderr: false para omitir los registros impresos en stderr.

Código Abierto

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