Contêineres em Aplicativos de Contêiner do Azure

Os Aplicativos de Contêiner do Azure gerenciam os detalhes do Kubernetes e orquestração de contêineres para você. Os contêineres nos Aplicativos de Contêiner do Azure podem usar o runtime, a linguagem de programação ou a pilha de desenvolvimento de sua preferência.

Azure Container Apps: Containers

Os Aplicativos de Contêiner do Azure são compatíveis com:

  • Qualquer imagem de contêiner x86-64 (linux/amd64) baseada em Linux sem imagem base necessária
  • Contêineres de qualquer registro de contêiner, público ou privado
  • Sidecar e contêineres init

Os recursos também incluem:

  • As alterações na seção de configuração disparam uma nova revisão do template aplicativo de contêiner.
  • Se um contêiner falha, ele é reiniciado automaticamente.

Os recursos do Jobs incluem:

  • As execuções de trabalho usam a seção de configuração para definir a template imagem do contêiner e outras configurações quando cada execução é iniciada.
  • Se um contêiner sair com um código de saída diferente de zero, a execução do trabalho será marcada como falha. Você pode configurar um trabalho para repetir execuções com falha.

Configuração

O código a seguir está um exemplo da matriz containers na seção properties.template de um modelo de recurso de aplicativo de contêiner. O trecho mostra as opções de configuração disponíveis para um contêiner.

{
  "properties": {
    "template": {
      "containers": [
        {
          "name": "main",
          "image": "[parameters('container_image')]",
          "env": [
            {
              "name": "HTTP_PORT",
              "value": "80"
            },
            {
              "name": "SECRET_VAL",
              "secretRef": "mysecret"
            }
          ],
          "resources": {
            "cpu": 0.5,
            "memory": "1Gi"
          },
          "volumeMounts": [
            {
              "mountPath": "/appsettings",
              "volumeName": "appsettings-volume"
            }
          ],
          "probes": [
            {
              "type": "liveness",
              "httpGet": {
                "path": "/health",
                "port": 8080,
                "httpHeaders": [
                  {
                    "name": "Custom-Header",
                    "value": "liveness probe"
                  }
                ]
              },
              "initialDelaySeconds": 7,
              "periodSeconds": 3
            },
            {
              "type": "readiness",
              "tcpSocket": {
                "port": 8081
              },
              "initialDelaySeconds": 10,
              "periodSeconds": 3
            },
            {
              "type": "startup",
              "httpGet": {
                "path": "/startup",
                "port": 8080,
                "httpHeaders": [
                  {
                    "name": "Custom-Header",
                    "value": "startup probe"
                  }
                ]
              },
              "initialDelaySeconds": 3,
              "periodSeconds": 3
            }
          ]
        }
      ]
    },
    "initContainers": [
      {
        "name": "init",
        "image": "[parameters('init_container_image')]",
        "resources": {
          "cpu": 0.25,
          "memory": "0.5Gi"
        },
        "volumeMounts": [
          {
            "mountPath": "/appsettings",
            "volumeName": "appsettings-volume"
          }
        ]
      }
    ]
    ...
  }
  ...
}
Configuração Descrição Comentários
image O nome da imagem de contêiner do seu aplicativo de contêiner. Esse valor assume a forma de repository/<IMAGE_NAME>:<TAG>.
name Nome amigável do contêiner. Usado para relatório e identificação.
command O comando de inicialização do contêiner. Equivalente ao campo entrypoint do Docker.
args Argumentos do comando de inicialização. As entradas na matriz são unidas para criar uma lista de parâmetros a ser passada para o comando de inicialização.
env Uma matriz de pares chave/valor que definem variáveis de ambiente. Use secretRef em vez do campo value para fazer referência a um segredo.
resources.cpu O número de CPUs alocadas para o contêiner. Com o plano de Consumo, os valores devem seguir as seguintes regras:

• maior que zero
• menor ou igual a 2
• pode ser qualquer número decimal (com um máximo de duas casas decimais)

Por exemplo, 1.25 é válido, mas 1.555 é inválido.
O padrão é 0,25 CPUs por contêiner.

Quando você usa o perfil de carga de trabalho Consumo no plano Dedicado, as mesmas regras se aplicam, exceto que as CPUs devem ser menores ou iguais a 4.

Quando você usa o plano Dedicado, o máximo de CPUs deve ser menor ou igual ao número de núcleos disponíveis no perfil em que o aplicativo de contêiner está sendo executado.
resources.memory A quantidade de RAM alocada para o contêiner. Com o plano de Consumo, os valores devem seguir as seguintes regras:

• maior que zero
• menor ou igual a 4Gi
• pode ser qualquer número decimal (com um máximo de duas casas decimais)

Por exemplo, 1.25Gi é válido, mas 1.555Gi é inválido.
O padrão é 0.5Gi por contêiner.

Quando você usa a carga de trabalho Consumo no plano Dedicado, as mesmas regras se aplicam, exceto que a memória deve ser menor ou igual a .8Gi

Quando você usa o plano Dedicado, a memória máxima deve ser menor ou igual à quantidade de memória disponível no perfil em que o aplicativo de contêiner está sendo executado.
volumeMounts Uma matriz de definições de montagem de volume. Você pode definir um volume temporário ou vários volumes de armazenamento permanentes para o contêiner. Para obter mais informações sobre volumes de armazenamento, confira Usar montagens de armazenamento em Aplicativos de Contêiner do Azure.
probes Uma matriz de investigações de integridade habilitadas no contêiner. Esse recurso é baseado nas investigações de integridade do Kubernetes. Para obter mais informações sobre as configurações de investigações, confira Investigações de integridade em Aplicativos de Contêiner do Azure.

Quando você usa o plano de Consumo ou uma carga de trabalho de Consumo no plano Dedicado, o total de alocações de CPU e memória solicitadas para todos os contêineres em um aplicativo de contêiner deve ser somado a uma das seguintes combinações.

vCPUs (núcleos) Memória Plano de Consumo Perfil da carga de trabalho de consumo
0.25 0.5Gi
0.5 1.0Gi
0.75 1.5Gi
1.0 2.0Gi
1.25 2.5Gi
1.5 3.0Gi
1.75 3.5Gi
2.0 4.0Gi
2.25 4.5Gi
2.5 5.0Gi
2.75 5.5Gi
3.0 6.0Gi
3.25 6.5Gi
3.5 7.0Gi
3.75 7.5Gi
4.0 8.0Gi
  • O total de solicitações de CPU em todos os contêineres deve corresponder a um dos valores na coluna vCPUs .

  • O total das solicitações de memória em todos os seus contêineres deve corresponder ao valor de memória na coluna de memória na mesma linha da coluna de CPU.

Quando você usa o perfil de Consumo no plano Dedicado, o total de alocações de CPU e memória solicitadas para todos os contêineres em um aplicativo de contêiner deve ser menor ou igual aos núcleos e à memória disponíveis no perfil.

Vários contêineres

Em cenários avançados, você pode executar vários contêineres em um único aplicativo de contêiner. Use esse padrão somente em casos específicos em que seus contêineres estejam firmemente acoplados.

Para a maioria dos cenários de microsserviço, a prática recomendada é implantar cada serviço como um aplicativo de contêiner separado.

Os vários contêineres no mesmo aplicativo de contêiner compartilham recursos de disco rígido e rede e experimentam o mesmo ciclo de vida do aplicativo.

Há duas maneiras de executar vários contêineres em um aplicativo de contêiner: contêineres sidecar e contêineres init.

Contentores sidecar

Você pode definir vários contêineres em um único aplicativo de contêiner para implementar o padrão sidecar.

Exemplos de contêineres sidecar incluem:

  • Um agente que lê os logs do contêiner do aplicativo primário em um volume compartilhado e os encaminha para um serviço registrar em log.

  • Um processo em segundo plano que atualiza um cache usado pelo contêiner de aplicativo primário em um volume compartilhado.

Esses cenários são exemplos e não representam as únicas maneiras de implementar um sidecar.

Para executar vários contêineres em um aplicativo de contêiner, adicione mais de um contêiner na matriz containers do modelo de aplicativo de contêiner.

Contêineres de inicialização

Você pode definir um ou mais contêineres de inicialização em um aplicativo de contêiner. Os contêineres de inicialização são executados antes do contêiner de aplicativo principal e são usados para executar tarefas de inicialização, como baixar dados ou preparar o ambiente.

Os contêineres de inicialização são definidos na initContainers matriz do modelo de aplicativo de contêiner. Os contêineres são executados na ordem em que estão definidos na matriz e devem ser concluídos com êxito antes que o contêiner do aplicativo principal seja iniciado.

Registros de contêiner

Você pode implantar imagens hospedadas em registros privados fornecendo as credenciais na configuração de Aplicativos de Contêiner.

Para usar um registro de contêiner, defina os campos necessários na matriz registries na seção properties.configuration do modelo de recurso do aplicativo de contêiner. O campo passwordSecretRef identifica o nome do segredo no nome da matriz secrets em que você definiu a senha.

{
  ...
  "registries": [{
    "server": "docker.io",
    "username": "my-registry-user-name",
    "passwordSecretRef": "my-password-secret-name"
  }]
}

As credenciais salvas são usadas para extrair uma imagem de contêiner do registro privado à medida que seu aplicativo é implantado.

O exemplo a seguir mostra como configurar as credenciais do Registro de Contêiner do Azure em um aplicativo de contêiner.

{
  ...
  "configuration": {
    "secrets": [
      {
        "name": "acr-password",
        "value": "my-acr-password"
      }
    ],
    ...
    "registries": [
      {
        "server": "myacr.azurecr.io",
        "username": "someuser",
        "passwordSecretRef": "acr-password"
      }
    ]
  }
}

Observação

O Docker Hub limita o número de downloads de imagens do Docker. Quando o limite for atingido, os contêineres em seu aplicativo não serão iniciados. Use um Registro com limites suficientes, como o Registro de Contêiner do Azure para evitar esse problema.

Identidade gerenciada com Registro de Contêiner do Azure

Você pode usar uma identidade gerenciada do Azure para autenticar o Registro de Contêiner do Azure em vez de usar um nome de usuário e uma senha. Para obter mais informações, confira Identidades gerenciadas nos Aplicativos de Contêiner do Azure.

Ao atribuir uma identidade gerenciada a um registro, use a ID do recurso de identidade gerenciada para uma identidade atribuída pelo usuário ou system para a identidade atribuída pelo sistema.

{
    "identity": {
        "type": "SystemAssigned,UserAssigned",
        "userAssignedIdentities": {
            "<IDENTITY1_RESOURCE_ID>": {}
        }
    }
    "properties": {
        "configuration": {
            "registries": [
            {
                "server": "myacr1.azurecr.io",
                "identity": "<IDENTITY1_RESOURCE_ID>"
            },
            {
                "server": "myacr2.azurecr.io",
                "identity": "system"
            }]
        }
        ...
    }
}

Para obter mais informações sobre como configurar identidades atribuídas pelo usuário, confira Adicionar uma identidade atribuída pelo usuário.

Limitações

Os Aplicativos de Contêiner do Azure têm as seguintes limitações:

  • Contêineres privilegiados: os Aplicativos de Contêiner do Azure não permitem o modo de contêineres privilegiados com acesso no nível do host.

  • Sistema operacional: são necessárias imagens de contêiner baseadas em Linux (linux/amd64).

Próximas etapas