Usar definições de instância de contêiner YAML

Concluído

Na unidade anterior, você usou comandos da CLI do Azure como az container create e seus argumentos para especificar opções de Instâncias de Contêiner do Azure. Nesta unidade, você aprende a usar a marcação YAML para especificar configurações mais sofisticadas para instâncias de contêiner.

YAML significa "Yet Another Markup Language" e fornece uma linguagem de descrição mais legível por humanos do que XML ou JSON. O YAML evita delimitadores como colchetes e cacheados que dificultam a legibilidade humana, mas depende de recuo para estruturar informações em uma hierarquia. Uma vantagem das configurações baseadas em YAML é que você pode armazená-las em sistemas de controle de versão e tratá-las da mesma forma que o código do aplicativo.

O Kubernetes é um sistema de orquestração de contêineres que usa YAML para descrever seus objetos, e sua popularidade significa que o YAML se tornou um padrão de fato para definições declarativas de contêiner. Kubernetes YAML usa muitas das mesmas construções como instâncias de contêiner YAML.

Os modelos do Azure Resource Manager (ARM) e o Terraform são métodos alternativos para implantar declarativamente as Instâncias de Contêiner do Azure. Um método não é inerentemente melhor do que os outros, mas o YAML é conveniente para trabalhar com grupos de contêineres mais complexos, como o padrão de sidecar neste módulo.

Extrair o código YAML de um recipiente existente

Você pode inspecionar as propriedades de sua instância de contêiner existente do Azure no formato YAML e salvar o código YAML em um arquivo para referência posterior e para criar novas instâncias. No Cloud Shell no portal do Azure, execute o seguinte comando da CLI do Azure:

# Browse YAML
az container export -n $aci_name -g $rg -f /tmp/aci.yaml
more /tmp/aci.yaml

Inspecione o código YAML gerado, por exemplo, usando cat /tmp/aci.yaml. Deverá ver algo semelhante ao resultado seguinte:

additional_properties: {}
apiVersion: '2023-05-01'
extended_location: null
location: northeurope
name: learnaci
properties:
  containers:
  - name: learnaci
    properties:
      environmentVariables:
      - name: SQL_SERVER_USERNAME
        value: azure
      - name: SQL_SERVER_PASSWORD
        value: NAwzq6sjdItw7Ot
      - name: SQL_SERVER_FQDN
        value: sqlserver24791.database.windows.net
      image: erjosito/sqlapi:1.0
      ports:
      - port: 8080
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
  initContainers: []
  ipAddress:
    ip: 192.168.2.4
    ports:
    - port: 8080
      protocol: TCP
    type: Private
  isCustomProvisioningTimeout: false
  osType: Linux
  provisioningTimeoutInSeconds: 1800
  restartPolicy: Always
  sku: Standard
  subnetIds:
  - id: /subscriptions/<<subscriptionid>>/resourceGroups/acilab/providers/Microsoft.Network/virtualNetworks/acivnet/subnets/aci
tags: {}
type: Microsoft.ContainerInstance/containerGroups

Gorjeta

As seções no arquivo YAML gerado automaticamente são ordenadas em ordem alfabética.

Observe as seguintes características da descrição do YAML:

  • O YAML é sensível ao recuo. Remover ou adicionar um espaço em branco antes de uma linha torna-o sintaticamente incorreto. Apenas espaços, não separadores, são suportados para recuo, por isso tenha cuidado com o seu editor de texto.
  • Propriedades e atributos são especificados hierarquicamente em pares chave-valor.
  • Muitos dos rótulos são familiares do Kubernetes. Por exemplo, as solicitações de recursos seguem a mesma sintaxe. No entanto, não espere que todas as propriedades sejam idênticas ao Kubernetes. Por exemplo, as variáveis de ambiente ACI são definidas na propriedade, enquanto o environmentVariables Kubernetes usa a env palavra-chave.
  • As variáveis de ambiente estão em texto não criptografado. Texto não criptografado é provavelmente aceitável para a maioria das variáveis de ambiente, mas outras, como a senha SQL neste exemplo, não devem ser visíveis abertamente. Uma maneira melhor de definir essas informações confidenciais é com um valor seguro, que você implementa na próxima seção.

Modificar e implantar o arquivo YAML

Você não quer que a senha do banco de dados SQL fique visível para os clientes, portanto, você precisa mascará-la usando valores seguros para as variáveis de ambiente em vez de valores padrão. Para gerar o YAML necessário, edite manualmente o arquivo YAML gerado automaticamente e reimplante-o para criar uma instância de contêiner modificada. Embora você possa alterar a variável de ambiente em uma variável de ambiente seguro usando a CLI do Azure, use o YAML em preparação para requisitos futuros.

  1. Use seu editor de texto favorito para alterar a linha 13 de /tmp/aci.yaml de
    value: <your Azure SQL password>
    para
    secureValue: <your Azure SQL password>.
    Tenha cuidado para não alterar o recuo. Você também pode usar o editor sed de texto on-line para fazer a alteração. Você também deve remover qualquer outra linha que não seja necessária, como o provisioningTimeoutInSeconds atributo, que não é suportado 2023-05-01 pela API.

    # Modify auto-generated YAML
    sed -i "s/        value: $sql_password/        secureValue: $sql_password/g" /tmp/aci.yaml
    # Delete the provisioningTimeoutInSeconds attribute
    sed -i /provisioningTimeoutInSeconds/d /tmp/aci.yaml
    
  2. Depois de modificar o arquivo, execute os seguintes comandos para excluir seu contêiner antigo e reimplantar o novo YAML. O comando az container create CLI do Azure usa o argumento --file, onde você pode inserir a descrição YAML do contêiner a ser criado. Você só precisa especificar o grupo de recursos, porque todas as outras informações estão contidas no arquivo YAML, incluindo o nome da instância do contêiner.

    # Recreate container using updated YAML
    az container delete -n $aci_name -g $rg -y
    az container create -g $rg --file /tmp/aci.yaml
    
  3. Exporte a nova instância de contêiner para um arquivo YAML diferente /tmp/aci2.yaml e observe que a senha SQL não é mais exposta como texto não criptografado no arquivo.

    # Recreate container
    az container export -n $aci_name -g $rg -f /tmp/aci2.yaml
    more /tmp/aci2.yaml
    
  4. Exclua o contêiner que você criou nesta unidade, porque você não precisa mais dele.

    # Cleanup unit 3
    az container delete -n $aci_name -g $rg -y
    

Você pode encontrar mais propriedades para usar em declarações YAML de Instâncias de Contêiner na referência YAML de Instâncias de Contêiner do Azure.