Azure 容器应用中的容器

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

Azure Container Apps: Containers

Azure 容器应用支持:

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

功能还包括:

  • template 配置部分的更改会触发新的容器应用修订
  • 如果容器发生故障,它会自动重启。

“作业”功能包括:

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

配置

以下代码是容器应用资源模板的 properties.template 部分中的 containers 数组的一个示例。 此摘录显示了在设置容器时可用的配置选项。

{
  "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 数量。 使用消耗计划时,值必须遵循以下规则:

• 大于零
• 小于或等于 2
• 可以是任何十进制数(最多两位小数)

例如,1.25 有效,但 1.555 无效。
默认每个容器 0.25 个 CPU。

在专用计划中使用消耗工作负载配置文件时,相同的规则适用,但 CPU 必须小于或等于 4。

使用专用计划时,最大 CPU 必须小于或等于运行容器应用的配置文件中可用的核心数。
resources.memory 分配给容器的 RAM 量。 使用消耗计划时,值必须遵循以下规则:

• 大于零
• 小于或等于 4Gi
• 可以是任何十进制数(最多两位小数)

例如,1.25Gi 有效,但 1.555Gi 无效。
默认值为每个容器 0.5Gi

专用计划中使用消耗工作负荷时,相同的规则适用,但内存必须小于或等于 8Gi

使用专用计划时,最大内存必须小于或等于运行容器的配置文件中可用的内存量。
volumeMounts 卷装载定义的数组。 你可以为容器定义一个临时卷或多个永久存储卷。 有关存储卷的详细信息,请参阅 在 Azure 容器应用中使用存储装载
probes 容器中启用的运行状况探测的数组。 此功能基于 Kubernetes 运行状况探测。 有关探测设置的详细信息,请参阅 Azure 容器应用中的运行状况探测

在专用计划中使用消耗计划或消耗工作负载时,为容器应用中的所有容器请求的总 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
  • 所有容器中的 CPU 请求总计必须与 vCPU 列中的值之一匹配。

  • 所有容器中的内存请求总量必须与 CPU 列的同一行中的内存列中的内存值匹配。

在专用计划中使用消耗配置文件时,为容器应用中的所有容器请求的总 CPU 和内存分配必须小于或等于配置文件中可用的核心数和内存。

多个容器

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

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

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

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

挎斗容器

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

挎斗容器的示例包括:

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

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

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

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

初始化容器

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

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

注意

Init 容器支持使用托管标识拉取映像,但在 init 容器中运行的进程无权访问托管标识。

容器注册表

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

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

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

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

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

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

注意

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

托管标识与 Azure 容器注册表

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

将托管标识分配给注册表时,请使用托管标识资源 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) 的容器映像。

后续步骤