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ámetros | Descripció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ámetros | Descripció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ámetros | Descripció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ámetros | Descripció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ámetros | Descripció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ámetros | Descripció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ámetros | Descripció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ámetros | Descripció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
Descargue GPG.
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
Se le pedirá la frase de contraseña. Dé el valor y haga clic en Aceptar.

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
Para ver la lista de claves públicas
gpg --list-keys
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.gpgVerá 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.gpgVerá 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.