Criar e instalar um gráfico Helm

Concluído

Os gráficos de leme simplificam a implantação de aplicativos em qualquer cluster do Kubernetes. Utilize o Helm para modelar as informações de implementação da sua aplicação como um gráfico Helm, que pode depois utilizar para implementar a sua aplicação.

Digamos que sua equipe de desenvolvimento já implantou o site da loja de animais de estimação da sua empresa no seu cluster 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 e
  • Um manifesto de entrada que descreve como o tráfego de fora do cluster foi 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 ficheiros é atualizado com variáveis e valores específicos para cada ambiente. Dado que cada ficheiro está codificado, a manutenção desses ficheiros é propensa a erros.

Como é que o Helm processa um gráfico?

O cliente do Helm implementa um motor de modelos baseado em linguagem Go que analisa todos os ficheiros disponíveis nas pastas de um gráfico. O motor do modelo cria ficheiros de manifesto do Kubernetes através da combinação de modelos da pasta templates/ do gráfico com valores dos ficheiros 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.

Assim que os ficheiros de manifesto estiverem disponíveis, o cliente pode instalar, atualizar e eliminar uma aplicação definida nos ficheiros de manifesto gerados.

Como definir um ficheiro Chart.yaml

O Chart.yaml é um dos ficheiros necessários numa definição do gráfico Helm e fornece informações sobre o mesmo. O conteúdo do ficheiro é composto por três campos obrigatórios e vários campos opcionais.

Os três campos obrigatórios incluem:

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

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

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 type uso do campo no arquivo de exemplo. Pode criar gráficos para instalar aplicações ou bibliotecas. O tipo de gráfico predefinido é application e pode ser definido como library para especificar que o gráfico irá 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 dependencies campo para especificar requisitos extras para o gráfico, como um aplicativo Web que depende de um banco de dados.

Nota

A cobertura detalhada de todos os campos opcionais está fora do âmbito deste módulo. No entanto, uma ligação para a documentação do Helm está disponível na secção de resumo do módulo.

Como definir um modelo de gráfico

Um modelo de gráfico Helm é um arquivo que descreve diferentes arquivos de manifesto de tipo de implantação. Os modelos de gráfico são escritos na linguagem de 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 templates/ pasta de um gráfico. O mecanismo de modelo processa esses arquivos para criar o manifesto final do objeto.

Por exemplo, digamos que sua equipe de desenvolvimento use o seguinte arquivo de manifesto de implantação para implantar o componente de frente de loja de animais de estimação da 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 do contêiner é codificado usando a {{.Values.<property>}} sintaxe. A sintaxe permite-lhe criar marcadores de posição para cada valor personalizado.

O processo manual de criação de gráficos Helm é entediante. Uma forma fácil de criar um gráfico Helm é ao utilizar o comando helm create para criar um novo gráfico Helm. Em seguida, personalize os ficheiros gerados automaticamente para corresponderem aos requisitos da sua aplicação.

Como definir um ficheiro values.yaml

Utilize os valores do gráfico para personalizar a configuração de um gráfico Helm. Os valores do gráfico podem ser predefinidos ou fornecidos pelo utilizador na altura da implementação do gráfico.

Um valor predefinido é um valor que diferencia maiúsculas de minúsculas que é predefinido no contexto de um gráfico Helm e não pode ser alterado por um usuário. Por exemplo, pode utilizar Release.Name para referenciar o 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 do Chart.yaml. Por exemplo, se quisesse verificar a versão do gráfico, referenciaria Chart.Version. Tenha em atenção que apenas pode referenciar campos conhecidos. Pode pensar nos valores predefinidos como constantes para utilizar nos modelos que cria.

A sintaxe para incluir nomes de valor em um arquivo de modelo envolve colocar o nome do valor em chaves duplas, por exemplo, {{.Release.Name}}. Repare na utilização de um ponto final em frente ao nome do valor. Quando utiliza um ponto final desta forma, o ponto final funciona como um operador de procura e indica o âmbito atual da variável.

Por exemplo, o seguinte trecho YAML contém um dicionário definido em um arquivo de valores:

object:
  key: value

Para aceder ao valor num modelo, pode utilizar a seguinte sintaxe:

{{ .Values.object.key }}

Um valor fornecido permite-lhe processar valores arbitrários no modelo do gráfico. O ficheiro values.yaml define esses valores.

No exemplo, a equipe de desenvolvimento permite os seguintes 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 }}
  ...

Aqui está um exemplo do values.yaml arquivo:

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

Assim que o motor do modelo aplica os valores, o resultado final terá o aspeto deste 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 utilizar um repositório Helm

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

Por exemplo, você pode adicionar o repositório 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 gráficos disponíveis num repositório são colocadas em cache no anfitrião do cliente. Você precisa atualizar periodicamente o cache para buscar as informações mais recentes do repositório usando o helm repo update comando.

O helm search repo comando permite pesquisar gráficos em todos os repositórios Helm adicionados localmente. Pode executar o comando helm search repo sozinho para devolver uma lista de todos os gráficos Helm conhecidos de cada repositório adicionado. O resultado lista o nome, a versão e a versão do aplicativo implantados pelo gráfico, conforme mostrado na saída de exemplo a seguir:

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...

Pode procurar um gráfico específico ao adicionar um termo de pesquisa ao comando helm search repo. Por exemplo, se você estiver procurando por um gráfico baseado em 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 na saída de exemplo a seguir:

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 Helm

O Helm fornece uma opção para gerar os ficheiros de manifesto que o motor do modelo cria a partir do gráfico. Esse recurso permite que você teste o gráfico antes de uma versão, combinando dois parâmetros extras: --dry-run e debug. O --dry-run parâmetro garante que a instalação seja simulada e o --debug parâmetro permite uma saída detalhada.

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

O comando indica informações sobre os valores utilizados e todos os ficheiros gerados. Talvez seja necessário rolar para visualizar toda a saída gerada.

Como instalar um gráfico Helm

Utilizamos o comando helm install para instalar um gráfico. Você pode instalar um gráfico Helm de qualquer um dos seguintes locais:

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

No entanto, os parâmetros necessários são diferentes consoante a localização do gráfico. Em todos os casos, o install comando requer o nome do gráfico que você deseja instalar e um nome para a versão criada pela instalação.

Você pode instalar um gráfico local usando uma pasta de gráficos descompactados de arquivos ou um arquivo tar compactado .tgz . Para instalar um gráfico, o helm comando faz referência ao sistema de arquivos local para o local do gráfico. Aqui está um exemplo do comando install que implantará uma versão de um gráfico descompactado:

helm install my-release ./chart-name

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

Um gráfico empacotado é instalado ao referenciar o nome do ficheiro do gráfico empacotado. O exemplo a seguir mostra a sintaxe do mesmo aplicativo agora empacotado como um arquivo tar:

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

Ao instalar um gráfico a partir de um repositório Helm, utilizamos 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 exemplo a seguir:

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

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