Azure 容器应用中的容器

Azure 容器应用为你管理 Kubernetes 和容器业务流程的详细信息。 Azure 容器应用中的容器可以使用你选择的任何运行时、编程语言或开发堆栈。

Azure 容器应用:容器

Azure 容器应用支持:

  • 任何基于 Linux x86-64 (linux/amd64) 的容器映像
  • 任何公共或专用容器注册表中的容器
  • 可选的 sidecarinit 容器

功能还包括:

  • 应用使用 template 配置部分来定义每次执行启动时的容器映像和其他设置。 对 template 配置部分的更改会触发新的容器应用修订
  • 如果容器发生故障,它会自动重启。

“作业”功能包括:

  • “作业执行”使用 template 配置部分来定义每次执行启动时的容器映像和其他设置。
  • 如果容器退出并包含非零退出代码,则作业执行将标记为失败。 可以将作业配置为重试失败的执行。

配置

大多数容器应用都有单独的容器。 在高级方案中,应用可能还具有挎斗和 init 容器。 在容器应用定义中,主应用及其挎斗容器列在 properties.template 部分中的 containers 数组中,init 容器则列在 initContainers 数组中。 以下摘录显示了设置应用的容器时可用的配置选项。

{
  "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"
          }
        ]
      }
    ]
    ...
  }
  ...
}
设置 说明 备注
image 容器应用的容器映像名称。 此值采用 repository/<IMAGE_NAME>:<TAG> 形式。
name 易记的容器名称。 用于报告和识别。
command 容器的启动命令。 等效于 Docker 的 entrypoint 字段。
args 启动命令参数。 数组中的条目联接在一起,用于创建要传递给启动命令的参数列表。
env 定义环境变量的名称/值对数组。 使用 secretRef 而不是 value 字段来引用机密。
resources.cpu 分配给容器的 CPU 数量。 请参阅“vCPU 和内存分配要求
resources.memory 分配给容器的 RAM 量。 请参阅“vCPU 和内存分配要求
volumeMounts 卷装载定义的数组。 你可以为容器定义一个临时卷或多个永久存储卷。 有关存储卷的详细信息,请参阅 在 Azure 容器应用中使用存储装载
probes 容器中启用的运行状况探测的数组。 有关探测设置的详细信息,请参阅 Azure 容器应用中的运行状况探测

vCPU 和内存分配要求

使用“消耗”计划中,为容器应用中的所有容器分配的总 CPU 和内存加起来必须为以下其中一个组合。

vCPU(核心) 内存
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

注意

在“仅消耗”环境中使用“消耗”计划的应用最多可分配 2 个核和 4Gi 内存。

多个容器

在高级方案中,可以在单个容器应用中运行多个容器。 仅在容器紧密耦合的特定实例中使用此模式。

对于大多数微服务方案,最佳做法是将每个服务部署为单独的容器应用。

同一容器应用中的多个容器共享硬盘和网络资源,并经历相同的应用程序生命周期

可通过两种方法在容器应用中运行其他容器:挎斗容器init 容器

挎斗容器

可以在单个容器应用中定义多个容器,以实现挎斗模式

挎斗容器的示例包括:

  • 一个代理,可从共享卷上的主应用容器读取日志并将其转发到日志记录服务。

  • 一个后台进程,用于刷新共享卷中的主应用容器使用的缓存。

这些方案是示例,并不代表实现 sidecar 的唯一方法。

若要在容器应用中运行多个容器,请在容器应用模板的 containers 数组中添加多个容器。

初始化容器

可以在容器应用中定义一个或多个 init 容器。 init 容器在主应用容器之前运行,用于执行初始化任务,例如下载数据或准备环境。

init 容器在容器应用模板的 initContainers 数组中定义。 容器按照它们在数组中定义的顺序运行,并且必须在主应用容器启动之前成功完成。

注意

使用专用计划或在“仅消耗”环境中运行的应用中的 init 容器无法访问运行时的托管标识。

容器注册表

通过在容器应用配置中提供凭据,你可以部署托管在专用注册表上的映像。

若要使用容器注册表,请在容器应用资源模板的 properties.configuration 部分的 registries 数组中定义注册表。 passwordSecretRef 字段标识 secrets 数组名称中你在其中定义了密码的机密的名称。

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

保存的凭据用于在部署应用时从专用注册表拉取容器映像。

以下示例展示了如何在容器应用中配置 Azure 容器注册表凭据。

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

注意

Docker Hub 限制了 Docker 镜像下载的数量。 达到限制时,你的应用程序中的容器将无法启动。 使用具有足够上限的注册表(例如 Azure 容器注册表),以避免此问题。

托管标识与 Azure 容器注册表

你可以使用 Azure 托管标识向 Azure 容器注册表进行身份验证,而不是使用用户名和密码。 有关详细信息,请参阅 Azure 容器应用中的托管标识

若要将托管标识用于注册表,必须在应用中启用标识,并且必须在注册表中为其分配 acrPull 角色。 要配置注册表,请为注册表中 identity 属性中的用户分配的标识使用托管标识资源 ID 或为系统分配的标识使用 system。 使用托管标识时不要配置用户名和密码。

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

有关配置用户分配的标识的更多信息,请参阅添加用户分配的标识

限制

Azure 容器应用具有以下限制:

  • 特权容器:Azure 容器应用不允许具有主机级访问权限的特权容器模式。

  • 操作系统:需要基于 Linux (linux/amd64) 的容器映像。

  • 图像大小上限

    • 消耗工作负荷配置文件支持每个应用或作业副本最多 8GB 的容器映像。
    • 专用工作负荷配置文件支持更大的容器映像。 由于专用工作负荷配置文件可以运行多个应用或作业,因此多个容器映像共享可用的磁盘空间。 实际支持的图像大小因其他应用和作业消耗的资源而异。

后续步骤