Criar e instalar um gráfico do Helm

Concluído

Os gráficos do Helm simplificam a implantação de aplicativos em qualquer cluster do Kubernetes. Use o Helm para criar um modelo das informações de implantação do aplicativo como um gráfico Helm, que depois você usará para implantar seu aplicativo.

Digamos que sua equipe de desenvolvimento já implantou o site de pet shop da sua empresa no seu cluster do AKS. A equipe cria três arquivos para implantar o site:

  • Um manifesto de implantação que descreve como instalar e executar o aplicativo no cluster;
  • um manifesto de serviço que descreve como expor o site no cluster;
  • um manifesto de entrada que descreve como o tráfego de fora do cluster é roteado para o aplicativo Web.

A equipe implanta esses arquivos em cada um dos três ambientes como parte do ciclo de vida de desenvolvimento de software. Cada um dos três arquivos é atualizado com variáveis e valores específicos para o ambiente. Uma vez que cada arquivo é codificado, a manutenção desses arquivos é propensa a erros.

Como o Helm processa um gráfico?

O cliente do Helm implementa um mecanismo de modelo baseado na linguagem Go que analisa todos os arquivos disponíveis nas pastas de um gráfico. O mecanismo de modelo cria arquivos de manifesto do Kubernetes combinando os modelos na pasta templates/ do gráfico com os valores dos arquivos Chart.yaml e values.yaml.

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

Depois que os arquivos de manifesto estiverem disponíveis, o cliente poderá instalar, atualizar e excluir o aplicativo definido nos arquivos de manifesto gerados.

Como definir um arquivo Chart.yaml

O Chart.yaml é um dos arquivos necessários em uma definição de gráfico do Helm e fornece informações sobre o gráfico. O conteúdo do arquivo consiste em três campos obrigatórios e vários campos opcionais.

Os três campos obrigatórios são:

  • apiVersion: A versão da API do gráfico a ser usada. Você define a versão como v2 para Gráficos que usam o Helm 3.
  • name: O nome do gráfico.
  • version: O número de versão do gráfico, que usa o controle de versão semântico 2.0.0 e segue a notação de número de versão MAJOR.MINOR.PATCH.

O seguinte exemplo mostra o conteúdo de um arquivo Chart.yaml básico:

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0

Observe o uso do campo type no arquivo de exemplo. Você pode criar gráficos para instalar aplicativos ou bibliotecas. O tipo de gráfico padrão é application e pode ser definido como library para especificar que o gráfico instalará uma biblioteca.

Muitos campos opcionais estão disponíveis para personalizar o processo de implantação do gráfico. Por exemplo, você pode usar o campo dependencies para especificar requisitos adicionais para o gráfico, como um aplicativo Web que depende de um banco de dados.

Observação

A cobertura de detalhes de todos os campos opcionais está fora do escopo deste módulo. No entanto, um link para a documentação do Helm está disponível na seção de resumo do módulo.

Como definir um modelo de gráfico

Um modelo de gráfico do Helm é um arquivo que descreve arquivos de manifesto de tipo de implantação diferentes. Os modelos de gráfico são escritos na linguagem do modelo Go e fornecem funções de modelo para automatizar a criação de arquivos de manifesto de objeto do Kubernetes.

Os arquivos de modelo são armazenados na pasta templates/ de um gráfico. O mecanismo de modelo processa esses arquivos para criar o manifesto do objeto final.

Por exemplo, digamos que sua equipe de desenvolvimento use o seguinte arquivo de manifesto de implantação para implantar o componente de vitrine de pet shop na solução:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: store-front
  template:
    metadata:
      labels:
        app: store-front
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
        - containerPort: 8080
          name: store-front
        env: 
        - name: VUE_APP_ORDER_SERVICE_URL
          value: "http://order-service:3000/"
        - name: VUE_APP_PRODUCT_SERVICE_URL
          value: "http://product-service:3002/"
        resources:
          requests:
            cpu: 1m
            memory: 200Mi
          limits:
            cpu: 1000m
            memory: 512Mi
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 5
          initialDelaySeconds: 3
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: store-front

Observe como o local da imagem de contêiner é codificado usando a sintaxe {{.Values.<property>}}. A sintaxe permite que você crie espaços reservados para cada valor personalizado.

O processo de criação manual de gráficos do Helm é entediante. Uma forma fácil de criar um gráfico do Helm é usar o comando helm create. Então personalize os arquivos gerados automaticamente conforme os requisitos do seu aplicativo.

Como definir um arquivo values.yaml

Você usa valores de gráfico para personalizar a configuração de um gráfico do Helm. Os valores de gráfico podem ser predefinidos ou fornecidos pelo usuário no momento da implantação do gráfico.

Um valor predefinido diferencia maiúsculas de minúsculas, é predefinido no contexto de um gráfico do Helm e não pode ser alterado por um usuário. Por exemplo, você pode usar Release.Name para fazer referência ao nome da versão ou Release.IsInstall para verificar se a operação atual é uma instalação.

Você também pode usar valores predefinidos para extrair dados do conteúdo de Chart.yaml. Por exemplo, se você quiser verificar a versão do gráfico, referenciará Chart.Version. Você só pode referenciar campos bem conhecidos. Você pode considerar os valores predefinidos como constantes para usar nos modelos criados.

A sintaxe para incluir nomes de valores em um arquivo de modelo envolve colocar o nome do valor entre chaves duplas, por exemplo, {{.Release.Name}}. Observe o uso de um ponto na frente do nome do valor. Quando você usa um ponto dessa forma, ele funciona como um operador de pesquisa e indica o escopo atual da variável.

Por exemplo, o seguinte snippet de código YAML contém um dicionário definido em um arquivo de valores:

object:
  key: value

Para acessar o valor em um modelo, você pode usar a seguinte sintaxe:

{{ .Values.object.key }}

Um valor fornecido permite processar valores arbitrários no modelo de gráfico. O arquivo values.yaml define esses valores.

No exemplo, a equipe de desenvolvimento permite os seguintes três valores configuráveis:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  ...
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
  ...
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ...

Veja um exemplo do arquivo values.yaml:

...
replicaCount: 1
...
storeFront:
  image:
    repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
    tag: "latest"
  serviceType: LoadBalancer
...

Depois que o mecanismo de modelo aplicar os valores, o resultado final será semelhante a este exemplo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: 1
  ...
      containers:
      - name: store-front
        image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
        ports:
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: LoadBalancer
  ...

Como usar um repositório do Helm

Um repositório do Helm é um servidor HTTP dedicado que armazena informações em gráficos do Helm. Configure os repositórios do Helm com o cliente Helm para que ele instale gráficos de um repositório usando o comando helm repo add.

Por exemplo, você pode adicionar o repositório do Helm do Azure Marketplace ao seu cliente Helm local executando o seguinte comando:

helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo

As informações sobre os gráficos disponíveis em um repositório são armazenadas em cache no host do cliente. Você precisará atualizar periodicamente o cache de modo manual para buscar as informações mais recentes do repositório executando o comando helm repo update.

O comando helm search repo permite pesquisar gráficos em todos os repositórios do Helm adicionados localmente. Você pode executar o comando helm search repo sozinho para retornar uma lista de todos os gráficos do Helm conhecidos para cada repositório adicionado. O resultado lista o nome do gráfico, a versão e a versão do aplicativo implantada pelo gráfico, conforme mostra este exemplo:

NAME                               CHART VERSION   APP VERSION   DESCRIPTION
azure-marketplace/airflow          11.0.8          2.1.4         Apache Airflow is a platform to programmaticall...
azure-marketplace/apache           8.8.3           2.4.50        Chart for Apache HTTP Server
azure-marketplace/aspnet-core      1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common   0.0.7           0.0.7         Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra        8.0.5           4.0.1         Apache Cassandra is a free and open-source dist...

Você pode pesquisar um gráfico específico adicionando um termo de pesquisa ao comando helm search repo. Por exemplo, se você estiver procurando um gráfico baseado no e ASP.NET, poderá usar o seguinte comando:

helm search repo aspnet

Neste exemplo, o cliente local tem dois repositórios registrados e retorna um resultado de cada um, conforme mostrado no seguinte exemplo:

NAME                            CHART VERSION   APP VERSION   DESCRIPTION                                       
azure-marketplace/aspnet-core   1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
bitnami/aspnet-core             1.3.18          3.1.19        ASP.NET Core is an open-source framework create...

Como testar um gráfico do Helm

O Helm oferece uma opção para gerar os arquivos de manifesto que o mecanismo de modelo cria com base no gráfico. Esse recurso permite testar o gráfico antes de uma liberação, combinando dois parâmetros adicionais: --dry-run e debug. O parâmetro --dry-run garante que a instalação seja simulada e o parâmetro --debug habilita a saída detalhada.

helm install --debug --dry-run my-release ./chart-name

O comando lista informações sobre os valores usados e todos os arquivos gerados. Talvez seja necessário rolar a página para ver toda a saída gerada.

Como instalar um gráfico do Helm

Use o comando helm install para instalar um gráfico. Instale um gráfico do Helm de uma das seguintes localizações:

  • Pastas de gráfico
  • Gráficos de arquivo tar .tgz compactado
  • Repositórios do Helm

No entanto, os parâmetros necessários diferem conforme o local do gráfico. Em todos os casos, o comando install exige o nome do gráfico que você deseja instalar e um nome para a versão que será criada pela instalação.

Instale um gráfico local usando uma pasta de gráficos desempacotados de arquivos ou um arquivo TAR .tgz compactado. Para instalar um gráfico, o comando helm faz referência ao sistema de arquivos local para o local do gráfico. Veja um exemplo do comando de instalação que implantará uma versão de um gráfico desempacotado:

helm install my-release ./chart-name

No exemplo anterior, o parâmetro my-release é o nome da versão, e o parâmetro ./chart-name é o nome do pacote de gráficos desempacotados.

Um gráfico empacotado é instalado fazendo referência ao nome de arquivo do gráfico empacotado. O seguinte exemplo mostra a sintaxe para o mesmo aplicativo agora empacotado como um arquivo TAR:

helm install my-release ./chart-name.tgz

Ao instalar um gráfico de um repositório do Helm, você usa uma referência de gráfico como o nome do gráfico. A referência do gráfico inclui dois parâmetros, o nome do repositório e o nome do gráfico, conforme mostrado no seguinte exemplo:

helm install my-release repository-name/chart-name

No exemplo, o parâmetro repository-name/chart-name contém a referência do repositório, repository-name, e o nome do gráfico, chart-name.