技术概述

了解 Pod

DC/OS 作为单一服务处理并展示 pod。pod 共享网络命名空间中的容器和临时卷。您可以通过 pod 定义配置 pod,这类似于 Marathon 应用定义。然而 Pod 和应用定义之间有一些差异。例如:

  • 您必须指定端点(不是端口号),以便其他应用程序与 Pod 通信。
  • Pod 具有单独的重置 API。
  • Pod 仅支持 Mesos 级健康检查。

网络

Marathon Pod 仅支持 ,该运行时间支持多种镜像格式,包括 Docker。

通用容器运行时间允许每个 pod 实例的容器通过 VLAN 或专用网络共享网络命名空间并进行通信,从而简化网络。如果在 pod 定义中指定没有名称的容器网络,它将被分配到默认网络。如果您已使用 AWS 模板 安装了 DC/OS,则默认网络是 .

如果其他应用需要与您的 pod 通信,请在 pod 定义中指定一个端点。其他应用程序将通过访问这些端点与 Pod 进行通信。参见 ,了解更多信息。

在您的 pod 定义中,您可以声明 hostcontainer 网络类型。借助 host 类型创建的 Pod 共享主机的网络命名空间。借助 container 类型创建的 Pod 则使用虚拟网络。如果您指定 container 网络类型且 Marathon 未配置为具有默认网络名称,您也必须在 name 字段中声明虚拟网络名称。参见完整 JSON 的 示例 部分。

临时存储库

Pod 内的容器共享临时存储库。在 pod 级别声明卷,且在被 name 引用之后安装到特定容器中。

Pod 事件和状态

更新已启动的 pod 时,只有在重新部署完成时才可使用 pod 的新版本。查询系统,了解在重新部署之前部署哪个版本时,您收到的回复可能是先前的版本。询问 Pod 状态时会收到同样的答复:如果更新 pod,在完成重新部署之前,状态更改将不会反映在查询中。

历史记录永久关联 pod_id. 如果删除 pod,然后重新使用该 ID,即使 Pod 的详细信息不同,新的 pod 仍会显示先前的历史记录(例如,版本信息)。

Pod 定义

Pod 通过 JSON pod 定义接受配置,与 Marathon 方式相似 . 您必须声明 Pod 中每个容器所需的资源,因为Mesos(而非 Marathon)决定了对 Pod 请求的所有资源执行隔离的方式和时间。参见 示例 部分,了解完整的 pod 定义。

环境变量

端口的环境变量使用 pod 容器端点名称(即,ENDPOINT_==).)定义。

以下是反映 [多个 Pod JSON pod 定义示例] 的环境变量示例。(/mesosphere/dcos/cn/2.1/deploying-services/pods/examples/#multi-pod).

资源请求和限制

Pod 中的每个容器都需要一些资源才能执行。resources 字段包含一个对象,其中包含指定容器所需的各种资源数量的字段。这些数量被称为资源“请求”,并且需确保容器至少可以访问每个资源的这些数量。此外,DC/OS 还具有 CPU 和内存“限制”概念,允许您指定应用程序可能消耗的 CPU 或内存的最大数量。资源限制必须等于或大于“请求”;此外,限制可能会被赋予“无限”值,这意味着应用程序对资源的使用不受限制。以下应用程序在 CPU 方面无限制,而内存限制为 4096 MB:

  1. {
  2. "resources": {
  3. "cpus": 2,
  4. "mem": 1024,
  5. "disk": 10240,
  6. "gpus": 2
  7. },
  8. "resourceLimits": {
  9. "cpus": "unlimited",
  10. "mem": 4096
  11. }
  12. }

如果在安装期间未将任何特殊配置应用于 DC/OS 群集,那么未设置明确 CPU 限制的任务会将其限制默示设置为 CPU 请求的值。将 DC/OS 安装参数的值更改为 false,意味着不会设置这些默示的限制。

执行器在每个节点上运行,以管理脚本。默认情况下,执行器为每个 Pod 保留 32 MB 和 0.1 个 CPU 作为日常使用。在为 Pod 中的容器声明资源需求时,请将此日常使用考虑在内。可以修改 Pod 定义的 executorResources 字段中的执行器资源。

  1. {
  2. "executorResources": {
  3. "cpus": 0.1,
  4. "mem": 64,
  5. "disk": 10
  6. }
  7. }

在 Pod 定义的 secrets 字段中指定密钥。论据应该是存储库中的密钥的完全限定路径。

Pod 支持临时卷,临时卷在 pod 级别定义。Pod 定义必须包括 volumes 字段(其中至少指定卷的名称)和 volumeMounts 字段(其中至少指定卷挂载路径)。

  1. {
  2. "volumes": [
  3. {
  4. "name": "etc"
  5. }
  6. ]
  7. }
  1. {
  2. "volumeMounts": [
  3. "name": "env",
  4. "mountPath": "/mnt/etc"
  5. ]
  6. }

Pod 还支持主机卷。Pod 卷参数可以声明 host 字段,用于引用代理上的已有文件或目录。

注意:重新启动 pod 后,数据不复存在。

可以在容器和/或执行器上定义 linuxInfo 对象,用 modeshmSize 定义 ipcInfo

规则通常如下:

对于 mode

  • PRIVATE:容器/执行器具有专用共享内存段
  • SHARE_PARENT:容器/执行器使用其各自父代的共享内存段。

注意:如果 SHARE_PARENT 用于执行器,则共享内存命名空间与代理共享。这种情况可能会在 Mesos 配置中被禁用,可能并非总是有效。

对于 shmSize

  • 只能在模式为 PRIVATE 时使用
  • 允许您以兆字节定义共享内存段的大小

本示例定义了一个 pod,其带有一个具有 16MB 大小专用共享内存段的容器。

  1. {
  2. "id": "/pod",
  3. "containers": [
  4. {
  5. "name": "container0",
  6. "resources": {
  7. "cpus": 0.1,
  8. "mem": 32
  9. },
  10. "image": {
  11. "kind": "DOCKER",
  12. "id": "private/image"
  13. },
  14. "linuxInfo": {
  15. "ipcInfo": {
  16. "mode": "PRIVATE",
  17. "shmSize": 16
  18. }
  19. },
  20. "exec": {
  21. "command": {
  22. "shell": "sleep 1000"
  23. }
  24. }
  25. }
  26. ]
  27. }

任务之间共享

要共享 IPC 命名空间,需要定义执行器(任务的父容器)上的共享内存设置和大小。任务本身需要将模式设置为 SHARE_PARENT

此示例定义了一个具有共享内存的两个容器的 pod,该内存在执行器上定义,因此可以被两个容器访问。

  1. {
  2. "id": "/pod",
  3. "containers": [
  4. {
  5. "name": "container0",
  6. "resources": {
  7. "cpus": 0.1,
  8. "mem": 32
  9. "image": {
  10. "id": "private/image"
  11. },
  12. "linuxInfo": {
  13. "ipcInfo": {
  14. "mode": "SHARE_PARENT"
  15. }
  16. },
  17. "exec": {
  18. "command": {
  19. "shell": "sleep 1000"
  20. }
  21. }
  22. },
  23. {
  24. "name": "container1",
  25. "resources": {
  26. "cpus": 0.1,
  27. "mem": 32
  28. },
  29. "image": {
  30. "kind": "DOCKER",
  31. "id": "private/image"
  32. },
  33. "linuxInfo": {
  34. "ipcInfo": {
  35. "mode": "SHARE_PARENT"
  36. }
  37. },
  38. "exec": {
  39. "command": {
  40. "shell": "sleep 1000"
  41. }
  42. }
  43. }
  44. ],
  45. "linuxInfo": {
  46. "ipcInfo": {
  47. "mode": "PRIVATE",
  48. "shmSize": 16
  49. }
  50. }
  51. }

Marathon Pod 支持 DC/OS 通用容器运行时间. 通用容器运行时 。

限制

  • 目前仅支持基于 Mesos 的运行状况检查。
  • 不支持就绪检查。
  • 不支持服务端口。
  • 无法配置依赖关系。