Compartir a través de


Implementación de aplicaciones con Helm

Se aplica a: AKS en Azure Stack HCI 22H2, AKS en Windows Server

Helm es una herramienta de empaquetado de código abierto que ayuda a instalar y administrar el ciclo de vida de las aplicaciones de Kubernetes. Al igual que los administradores de paquetes de Linux, como APT y Yum, Helm administra los gráficos de Kubernetes, que son paquetes de recursos de Kubernetes preconfigurados.

En este artículo se describe cómo usar Helm para empaquetar e implementar aplicaciones en AKS cuando se usa Azure Kubernetes Service habilitado por Azure Arc.

Antes de empezar

Compruebe que tiene configurados los requisitos siguientes:

  • Un clúster de Kubernetes con al menos un nodo de trabajo de Windows o Linux que esté en funcionamiento.
  • Configuró el entorno local kubectl para que apunte al clúster. Puede usar el comando de PowerShell Get-AksHciCredential para acceder al clúster mediante kubectl.
  • La línea de comandos y los requisitos previos de Helm v3 instalados.
  • Un registro de contenedor disponible, como DockerHub o Azure Container Registry.

En este artículo se usa una aplicación ASP.NET Core como ejemplo. Puede descargar la aplicación de ejemplo de este repositorio de GitHub.

Dado que la aplicación se implementa en Kubernetes, el ejemplo siguiente es un Dockerfile sencillo para el proyecto:

FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /src
COPY ["MyMicroservice.csproj", "./"]
RUN dotnet restore "MyMicroservice.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyMicroservice.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyMicroservice.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyMicroservice.dll"]

Creación e inserción de la aplicación de ejemplo en un registro de contenedor

Vaya a la carpeta de la aplicación y use el archivo Dockerfile para crear e insertar una imagen con el siguiente comando:

docker build -f Dockerfile -t acr.azurecr.io/mymicroservice:0.1.0 .

Nota:

El punto (.) al final del comando establece la ubicación del archivo Dockerfile (en este caso, el directorio actual).

Este comando crea la imagen mymicroservice:0.1.0 en el equipo local. Para comprobar que la imagen se creó correctamente, ejecute para confirmar lo siguiente docker images :

REPOSITORY              TAG     IMAGE ID       CREATED            SIZE  
acr.azurecr.io/mymicroservice 0.1.0   5be713db571b   About a minute ago 107MB
....

A continuación, inserte la imagen en un registro de contenedor, como DockerHub o Azure Container Registry. En este ejemplo, la imagen de contenedor se inserta en Azure Container Registry. Para más información, consulte Extracción de imágenes de un ACR a un clúster de Kubernetes:

docker push acr.azurecr.io/mymicroservice:0.1.0

Creación del gráfico de Helm

Ahora que la aplicación de ejemplo está lista, el siguiente paso es generar un gráfico de Helm mediante el helm create comando , como se indica a continuación:

helm create mymicroserviceapp

Actualice mymicroserviceapp/values.yaml, como se indica a continuación:

  • Cambie image.repository a acr.azurecr.io/mymicroservice.
  • Cambie service.type a NodePort.

Por ejemplo:

# Default values for webfrontend.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: acr.azurecr.io/mymicroservice
  pullPolicy: IfNotPresent
...
service:
  type: NodePort
  port: 80
...

Vaya al archivo mymicroserviceapp/templates/deployment.yaml para configurar las comprobaciones de estado. Kubernetes usa comprobaciones de estado para administrar las implementaciones de aplicaciones. Reemplace la ruta de acceso a los sondeos y liveness readiness por path: /weatherforecast, como se muestra en el ejemplo siguiente:

...
 livenessProbe:
    httpGet:
      path: /weatherforecast
      port: http
    initialDelaySeconds: 0
    periodSeconds: 10
    timeoutSeconds: 1
    failureThreshold: 3
 readinessProbe:
    httpGet:
      path: /weatherforecast
      port: http
    successThreshold: 3
...

Implementación del gráfico de Helm en Kubernetes

A partir del directorio charts\mymicroserviceapp del directorio de la solución, ejecute el siguiente comando:

helm upgrade --install mymicroserviceapp . --namespace=local --set mymicroserviceapp.image.tag="0.1.0" 

Este comando crea (o actualiza) una versión existente con el nombre mymicroserviceapp en el local espacio de nombres del clúster de Kubernetes y genera una salida similar a la de este ejemplo:

Release "mymicroserviceapp" does not exist. Installing it now.
NAME: mymicroserviceapp
LAST DEPLOYED: Fri Apr  2 08:47:24 2021
NAMESPACE: local
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace local -o jsonpath="{.spec.ports[0].nodePort}" services mymicroserviceapp)
  export NODE_IP=$(kubectl get nodes --namespace local -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

Después de implementar el gráfico de Helm, puede comprobar que los recursos se implementaron correctamente ejecutando kubectl get all -n local.

La salida de la ejecución del comando es:

NAME                                     READY   STATUS    RESTARTS   AGE
pod/mymicroserviceapp-7849f949df-fwgbn   1/1     Running   0          101s

NAME                        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/mymicroserviceapp   NodePort   10.100.149.1   <none>        80:30501/TCP   101s

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mymicroserviceapp   1/1     1            1           101s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/mymicroserviceapp-7849f949df   1         1         1       101s

Prueba de la implementación

La aplicación se implementa con un puerto de nodo y un servicio, por lo que puede llamar a la API desde fuera del clúster. Para realizar esta llamada, envíe una solicitud a: http://$NODE_IP:$NODE_PORT:

curl http://10.193.2.103:30501/WeatherForeCast/
StatusCode        : 200
StatusDescription : OK
Content           : [{"date":"2021-04-03T15:51:04.795216+00:00","temperatureC":45,"temperatureF":112,"summary":"Balmy"},{"date":"2021-04-04T15:51:04.
                    7952176+00:00","temperatureC":23,"temperatureF":73,"summary":"Cool"},{"...
RawContent        : HTTP/1.1 200 OK
                    Transfer-Encoding: chunked
                    Content-Type: application/json; charset=utf-8
                    Date: Fri, 02 Apr 2021 15:51:04 GMT
                    Server: Kestrel

                    [{"date":"2021-04-03T15:51:04.795216+00:00","tempera...
Forms             : {}
Headers           : {[Transfer-Encoding, chunked], [Content-Type, application/json; charset=utf-8], [Date, Fri, 02 Apr 2021 15:51:04 GMT], [Server,
                    Kestrel]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 494

Limpieza del clúster

El último paso es limpiar el clúster. Para eliminar los recursos de implementación de Kubernetes, ejecute el siguiente comando:

helm uninstall mymicroserviceapp -n local

Debe obtener una salida similar al siguiente ejemplo:

release "mymicroserviceapp" uninstalled

Pasos siguientes