Pod 示例

了解字段定义和 Pod 示例

本专题提供 Pod 字段定义和使用示例。如需字段定义的详细信息,请参阅 Marathon 配置参考

带注释的简单 Pod 定义

这个名为 simple-pod 的 Pod 只有一个容器 simpletask1。容器展开镜像(python:3.5.2-alpine)并运行命令。

  1. {
  2. "id":"/simple-pod",
  3. "containers":[
  4. {
  5. "name":"simpletask1",
  6. "exec":{
  7. "command":{
  8. "shell":"env && sleep 10000"
  9. }
  10. },
  11. "resources":{
  12. "cpus":0.1,
  13. "mem":32
  14. },
  15. "image":{
  16. "kind":"DOCKER",
  17. "id":"python:3.5.2-alpine"
  18. }
  19. }
  20. ],
  21. "networks":[
  22. {
  23. "mode":"host"
  24. }
  25. ]
  26. }

基本 Pod 字段

字段类型描述
id (必填)字符串Pod 唯一 ID。
containers (必填)阵列参见 pod 容器基础字段
volumes阵列与 Pod 关联的所有卷。
volumes.name字符串共享卷的名称。
volumes.host字符串代理上文件或目录的绝对路径,或者执行器沙箱中目录的相对路径。有助于映射代理上或执行器沙箱内存在的目录。
networks阵列接受以下参数:modenamelabels
networks.mode字符串网络模式: hostcontainerhost 使用主机的网络命名空间。 container 使用虚拟网络,并且必须指定虚拟网络名称。
networks:name字符串container 网络模式必填。
networks.labels对象密钥/值对(即,将元数据传递到 Mesos 模块)。
scaling阵列接受以下参数:kindinstancesmaxInstances
scaling.kind字符串扩展类型。当前仅支持 fixed
scaling.instances整数pod 实例的初始数量(默认值:1)。
scaling.maxInstances整数此 pod 的最大实例数。

基本 Pod 容器字段

字段类型描述
containers (必填)阵列所有属于 pod 的容器的定义。
containers.name字符串容器的唯一名称。
containers.exec对象接受 command 参数。
containers.exec.command对象Mesos 执行的命令。
containers.exec.command.shell字符串要执行的命令。如果使用容器进入点,请使用空字符串。
containers.exec.overrideEntrypoint布尔值如果提供 command,将该值默示设置为 true。要使用默认进入点,则设置为 false
containers:resources (必填)对象资源的容器配置。
containers.resources.cpus数字CPU 共享(默认值:1.0)。
containers.resources.mem数字以 MiB 计算的内存资源(默认值:128)。
containers.resources.disk双倍以 MiB 计算的磁盘资源(默认值:128)。
containers.resources.gpus整数GPU 资源(默认值:0)。
containers.image对象如果省略 image,就使用 Mesos containerizer。
containers.image.kind字符串容器镜像格式(DOCKERAPPC)。
containers.image.id字符串容器镜像标签。
containers.image.forcePull布尔值设置为 true 即可始终拉取镜像(默认值:假)。
containers.volumeMounts阵列接受以下参数:namemountPath
containers.volumeMounts.name字符串共享卷的名称(必须是在 pod 层定义的有效卷)。
containers.volumeMounts.mountPath字符串挂载卷的容器路径。
containers.endpoints阵列对象阵列。
containers.endpoints.name字符串端口的唯一名称。
containers.endpoints.containerPort数字容器任务正在侦听的容器点。如果网络模式为 container,则必填。
containers.endpoints.hostPort数字主机上的映射端口。如果设置为 0,Marathon 就会灵活分配端口。
containers.endpoints.protocol阵列端口协议(tcphttp )。
containers.endpoints.labels对象元数据作为密钥/值对。

带注释的多个 Pod 及所有参数

下面的示例显示了一个 pod(test-pod),以及三个容器( healthtask1healthtask2、和 clienttask)。Pod 使用共享卷和本地 DC/OS 虚拟网络解决方案。

  1. {
  2. "id":"/test-pod",
  3. "labels":{
  4. "pod_label":"pod"
  5. },
  6. "environment":{
  7. "POD_ENV":"pod"
  8. },
  9. "containers":[
  10. {
  11. "name":"healthtask1",
  12. "exec":{
  13. "command":{
  14. "shell":"./read-write-server.py 8080 mount1/test-file.txt"
  15. }
  16. },
  17. "resources":{
  18. "cpus":0.1,
  19. "mem":32,
  20. "disk":32,
  21. "gpus":0
  22. },
  23. "endpoints":[
  24. {
  25. "name":"httpendpoint",
  26. "containerPort":8080,
  27. "hostPort":0,
  28. "protocol":[
  29. "tcp"
  30. ],
  31. "labels":{
  32. "ep1_label":"ep1"
  33. }
  34. }
  35. ],
  36. "image":{
  37. "kind":"DOCKER",
  38. "id":"python:3.5.2-alpine"
  39. },
  40. "environment":{
  41. "C1_ENV":"c1"
  42. },
  43. "healthCheck":{
  44. "http":{
  45. "endpoint":"httpendpoint",
  46. "path":"/ping",
  47. "scheme":"HTTP"
  48. },
  49. "gracePeriodSeconds":30,
  50. "intervalSeconds":5,
  51. "maxConsecutiveFailures":3,
  52. "timeoutSeconds":3,
  53. "delaySeconds":2
  54. },
  55. "volumeMounts":[
  56. {
  57. "name":"sharedvolume",
  58. "mountPath":"mount1"
  59. }
  60. ],
  61. "artifacts":[
  62. {
  63. "uri":"https://s3-us-west-2.amazonaws.com/mesos-soak-cluster/read-write-server.py",
  64. "extract":false,
  65. "executable":true,
  66. "cache":true,
  67. "destPath":"read-write-server.py"
  68. }
  69. ],
  70. "labels":{
  71. "c1_label":"c1"
  72. }
  73. },
  74. {
  75. "name":"healthtask2",
  76. "exec":{
  77. "command":{
  78. "shell":"./read-write-server.py 8081 mount2/test-file.txt"
  79. }
  80. },
  81. "resources":{
  82. "cpus":0.1,
  83. "mem":32,
  84. "disk":32,
  85. "gpus":0
  86. },
  87. "endpoints":[
  88. {
  89. "name":"httpendpoint2",
  90. "containerPort":8081,
  91. "hostPort":0,
  92. "protocol":[
  93. "tcp"
  94. ],
  95. "labels":{
  96. "ep2_label":"ep2"
  97. }
  98. }
  99. ],
  100. "image":{
  101. "kind":"DOCKER",
  102. "id":"python:3.5.2-alpine"
  103. },
  104. "environment":{
  105. "C2_ENV":"c2"
  106. },
  107. "healthCheck":{
  108. "http":{
  109. "endpoint":"httpendpoint2",
  110. "path":"/ping",
  111. "scheme":"HTTP"
  112. },
  113. "gracePeriodSeconds":30,
  114. "intervalSeconds":5,
  115. "maxConsecutiveFailures":3,
  116. "timeoutSeconds":3,
  117. "delaySeconds":2
  118. },
  119. "volumeMounts":[
  120. {
  121. "name":"sharedvolume",
  122. "mountPath":"mount2"
  123. }
  124. ],
  125. "artifacts":[
  126. {
  127. "uri":"https://s3-us-west-2.amazonaws.com/mesos-soak-cluster/read-write-server.py",
  128. "extract":false,
  129. "executable":true,
  130. "cache":true,
  131. "destPath":"read-write-server.py"
  132. }
  133. ],
  134. "labels":{
  135. "c2_label":"c2"
  136. }
  137. },
  138. {
  139. "name":"clienttask",
  140. "exec":{
  141. "command":{
  142. "shell":"while true; do sleep 5 && curl -X GET localhost:8080/write && curl -X GET localhost:8081/read; done"
  143. }
  144. },
  145. "resources":{
  146. "cpus":0.1,
  147. "mem":32,
  148. "disk":32,
  149. "gpus":0
  150. },
  151. "endpoints":[
  152. ],
  153. "environment":{
  154. "C3_ENV":"c3"
  155. },
  156. "volumeMounts":[
  157. ],
  158. "artifacts":[
  159. ],
  160. "labels":{
  161. "c3_label":"c3"
  162. }
  163. }
  164. ],
  165. "secrets":{
  166. },
  167. "volumes":[
  168. {
  169. "name":"sharedvolume"
  170. }
  171. ],
  172. "networks":[
  173. {
  174. "name":"dcos",
  175. "mode":"container",
  176. "labels":{
  177. "net_label":"net"
  178. }
  179. }
  180. ],
  181. "scaling":{
  182. "kind":"fixed",
  183. "instances":1,
  184. "maxInstances":null
  185. },
  186. "scheduling":{
  187. "backoff":{
  188. "backoff":1,
  189. "backoffFactor":1.15,
  190. "maxLaunchDelaySeconds":3600
  191. },
  192. "upgrade":{
  193. "minimumHealthCapacity":1,
  194. "maximumOverCapacity":1
  195. },
  196. "placement":{
  197. "constraints":[
  198. ],
  199. "acceptedResourceRoles":[
  200. ]
  201. },
  202. "killSelection":"YOUNGEST_FIRST",
  203. "unreachableStrategy":{
  204. "inactiveAfterSeconds":900,
  205. "expungeAfterSeconds":604800
  206. }
  207. },
  208. "executorResources":{
  209. "cpus":0.1,
  210. "mem":32,
  211. "disk":10
  212. }
  213. }

其他 Pod 字段

字段类型描述
labels对象Pod 元数据作为密钥/值对。
environment对象pod 级别的环境变量。所有 pod 容器都将继承这些环境变量。必须大写。
secrets对象存储库中的密钥的完全符合要求的路径。
scheduling对象定义故障应用程序的指数退避行为,防止沙盒填满。
scheduling.backoff数字启动实例失败时应用的初始退避(秒)(默认值:1)。
scheduling.backoffFactor数字应用于当前退避的因数,可确定新的退避(默认值:1.15)。
scheduling.maxLaunchDelaySeconds数字检测到后续故障时应用的最大退避(秒)(默认值:3600)。
scheduling.unreachableStrategy字符串或对象定义不可访问实例的处理。
scheduling.unreachableStrategy.inactiveAfterSeconds数字实例被标记为非活动后无法访问的时长。
scheduling.unreachableStrategy.expungeAfterSeconds数字实例被排除后无法访问的时长。
scheduling.upgrade对象控制 pod 更新的升级策略。
scheduling.upgrade.minimumHealthCapacity数字介于 0 和 1 之间的数字,表示在升级期间保持的最少运行良好的节点数量(默认值:1)。
scheduling.upgrade.maximumOverCapacity数字0 至 1 之间的数字,表示升级期间启动的最大附加实例数(默认值:1)。
placement对象控制 pod 任务的放置。
placement.constraints字符串[]约束控制 pod 任务的布局策略。选项:UNIQUECLUSTERGROUP_BYLIKEUNLIKEMAX_PER
placement.acceptedResourceRoles字符串[]资源角色列表。Marathon 组件只会考虑在此列表中列出角色,为此 Pod 的任务提供的资源邀请。
killSelection字符串定义应用程序处于过度调配状态时首先被关闭的实例。选项:YOUNGEST_FIRSTOLDEST_FIRST
unreachableStrategy代理从管理节点分区后的行为
killSelection.inactiveAfterSeconds整数替换任务前等待的时间(秒)(默认值:900)。
killSelection.expungeAfterSeconds整数在排除前等待任务恢复的时间(秒)(默认值:603800)。
executorResources对象为 Pod 执行器保留的资源。
executorResources.cpus数字CPU 共享(默认值:0.1)。
executorResources.mem数字以 MiB 计算的内存资源(默认值:32)。
executorResources.disk数字以 MiB 计算的磁盘资源(默认值:10.0),

其他 Pod 容器字段

字段类型描述
labels对象作为密钥/值对的容器元数据。
environment对象容器环境变量。可覆盖 pod 环境变量。必须大写。
healthCheck对象接受以下参数: httptcpexec
healthCheck.http协议类型。选项:httptcpexec
healthCheck.http.endpoint字符串要使用的端点名称。
healthCheck.http.path字符串由提供运行状态的任务披露的端点路径。
healthCheck.http.scheme字符串对于 httpHealthCheck,使用 http
healthCheck.gracePeriodSeconds整数忽略运行状况检查失败距离第一次启动任务,或距离任务初次显示运行良好的时间间隔(默认值:300)。
healthCheck.intervalSeconds整数运行状况检查时间间隔(默认值:60)。
healthCheck.maxConsecutiveFailures整数任务被关闭之前连续故障的次数(默认值:3)。
healthCheck.timeoutSeconds整数等待运行状况检查完成的时间(默认值:20)。
healthCheck.delaySeconds整数开始运行状况检查之前等待的时间(默认值:2)。
artifacts阵列工件对象阵列
healthCheck.uri字符串要下载资源的 URI(即 .tgztar.gz.zip.txz、等)。
healthCheck.extract布尔值提取抓取工件。
healthCheck.executable布尔值将抓取的工件设置为可执行。
healthCheck.cache布尔值缓存抓取的工件。
healthCheck.destPath字符串工件的目标路径。

带有多个容器的 Pod

以下 pod 定义指定了带有 3 个容器的 pod。

  1. {
  2. "id":"/pod-with-multiple-containers",
  3. "version":"2017-01-03T18:21:19.31Z",
  4. "containers":[
  5. {
  6. "name":"sleep1",
  7. "exec":{
  8. "command":{
  9. "shell":"sleep 1000"
  10. }
  11. },
  12. "resources":{
  13. "cpus":0.01,
  14. "mem":32,
  15. "disk":0,
  16. "gpus":0
  17. }
  18. },
  19. {
  20. "name":"sleep2",
  21. "exec":{
  22. "command":{
  23. "shell":"sleep 1000"
  24. }
  25. },
  26. "resources":{
  27. "cpus":0.01,
  28. "mem":32,
  29. "disk":0,
  30. "gpus":0
  31. }
  32. },
  33. {
  34. "name":"sleep3",
  35. "exec":{
  36. "command":{
  37. "shell":"sleep 1000"
  38. }
  39. },
  40. "resources":{
  41. "cpus":0.01,
  42. "mem":32,
  43. "disk":0,
  44. "gpus":0
  45. }
  46. }
  47. ],
  48. "networks":[
  49. {
  50. "mode":"host"
  51. }
  52. ],
  53. "scaling":{
  54. "kind":"fixed",
  55. "instances":10,
  56. "maxInstances":null
  57. },
  58. "scheduling":{
  59. "backoff":{
  60. "backoff":1,
  61. "backoffFactor":1.15,
  62. "maxLaunchDelaySeconds":3600
  63. },
  64. "upgrade":{
  65. "minimumHealthCapacity":1,
  66. "maximumOverCapacity":1
  67. },
  68. "killSelection":"Youngest_First",
  69. "unreachableStrategy":{
  70. "inactiveAfterSeconds":900,
  71. "expungeAfterSeconds":604800
  72. }
  73. },
  74. "executorResources":{
  75. "cpus":0.1,
  76. "mem":32,
  77. "disk":10
  78. }
  79. }

使用临时卷的 Pod

以下 pod 定义指定了称为 v1 的临时卷。

  1. {
  2. "id": "/with-ephemeral-vol",
  3. "version": "2017-01-03T17:36:39.389Z",
  4. "containers": [
  5. {
  6. "name": "ct1",
  7. "exec": {
  8. "command": {
  9. "shell": "while true; do echo the current time is $(date) > ./jdef-v1/clock; sleep 1; done"
  10. }
  11. },
  12. "resources": {
  13. "cpus": 0.1,
  14. "mem": 32,
  15. "disk": 0,
  16. "gpus": 0
  17. },
  18. "volumeMounts": [
  19. {
  20. "name": "v1",
  21. "mountPath": "jdef-v1"
  22. }
  23. ]
  24. },
  25. {
  26. "name": "ct2",
  27. "exec": {
  28. "command": {
  29. "shell": "while true; do cat ./etc/clock; sleep 1; done"
  30. }
  31. },
  32. "resources": {
  33. "cpus": 0.1,
  34. "mem": 32,
  35. "disk": 0,
  36. "gpus": 0
  37. },
  38. "volumeMounts": [
  39. {
  40. "name": "v1",
  41. "mountPath": "etc"
  42. }
  43. ]
  44. }
  45. ],
  46. "volumes": [
  47. {
  48. "name": "v1"
  49. }
  50. ],
  51. "networks": [
  52. {
  53. "mode": "host"
  54. }
  55. ],
  56. "scaling": {
  57. "kind": "fixed",
  58. "instances": 1,
  59. "maxInstances": null
  60. },
  61. "scheduling": {
  62. "backoff": {
  63. "backoff": 1,
  64. "backoffFactor": 1.15,
  65. "maxLaunchDelaySeconds": 3600
  66. },
  67. "upgrade": {
  68. "minimumHealthCapacity": 1,
  69. "maximumOverCapacity": 1
  70. },
  71. "killSelection": "Youngest_First",
  72. "unreachableStrategy": {
  73. "inactiveAfterSeconds": 900,
  74. "expungeAfterSeconds": 604800
  75. }
  76. },
  77. "executorResources": {
  78. "cpus": 0.1,
  79. "mem": 32,
  80. "disk": 10
  81. }
  82. }

使用持久卷的 Pod

如需查看使用持久卷的 pod 的示例,请参见 创建具有本地持久卷的 pod

各 Pod 的 IP 网络

以下 pod 定义指定名为 dcos 的虚拟(用户)网络。networks:mode:container 字段创建虚拟网络。name 字段为可选。如果您已使用 我们的 AWS 模板安装 DC/OS,则默认虚拟网络名称为 dcos

  1. {
  2. "id":"/pod-with-virtual-network",
  3. "scaling":{
  4. "kind":"fixed",
  5. "instances":1
  6. },
  7. "containers":[
  8. {
  9. "name":"sleep1",
  10. "exec":{
  11. "command":{
  12. "shell":"sleep 1000"
  13. }
  14. },
  15. "resources":{
  16. "cpus":0.1,
  17. "mem":32
  18. }
  19. }
  20. ],
  21. "networks":[
  22. {
  23. "mode":"container",
  24. "name":"dcos"
  25. }
  26. ]
  27. }

此 pod 声明端口 80 的侦听“web”端点。

  1. {
  2. "id":"/pod-with-endpoint",
  3. "containers":[
  4. {
  5. "name":"simple-docker",
  6. "resources":{
  7. "cpus":1,
  8. "mem":128,
  9. "disk":0,
  10. "gpus":0
  11. },
  12. "image":{
  13. "kind":"DOCKER",
  14. "id":"nginx"
  15. },
  16. "endpoints":[
  17. {
  18. "name":"web",
  19. "containerPort":80,
  20. "protocol":[
  21. "http"
  22. ]
  23. }
  24. ]
  25. }
  26. ],
  27. "networks":[
  28. {
  29. "mode":"container"
  30. }
  31. ]
  32. }

此 pod 添加引用了 web 端点的运行状况检查。Mesos 将根据 <container_ip>:80 执行 HTTP 请求。如果 Mesos 收到 HTTP 200 响应,则会通过运行状况检查。

  1. {
  2. "id":"/pod-with-healthcheck",
  3. "containers":[
  4. {
  5. "name":"simple-docker",
  6. "resources":{
  7. "cpus":1,
  8. "mem":128,
  9. "disk":0,
  10. "gpus":0
  11. },
  12. "image":{
  13. "kind":"DOCKER",
  14. "id":"nginx"
  15. },
  16. "endpoints":[
  17. {
  18. "name":"web",
  19. "containerPort":80,
  20. "protocol":[
  21. "http"
  22. ]
  23. }
  24. ],
  25. "healthCheck":{
  26. "http":{
  27. "endpoint":"web",
  28. "path":"/"
  29. }
  30. }
  31. }
  32. ],
  33. "networks":[
  34. {
  35. "mode":"container"
  36. }
  37. ]
  38. }

完成 Pod

以下 pod 定义可作为参考,用于创建更复杂的 Pod。

  1. {
  2. "id": "/complete-pod",
  3. "labels": {
  4. "owner": "zeus",
  5. "note": "Away from olympus"
  6. },
  7. "environment": {
  8. "XPS1": "Test"
  9. },
  10. "volumes": [
  11. {
  12. "name": "etc",
  13. "host": "/etc"
  14. }
  15. ],
  16. "networks": [
  17. {
  18. "mode": "container",
  19. "name": "dcos"
  20. }
  21. ],
  22. "scaling": {
  23. "kind": "fixed",
  24. "instances": 1
  25. },
  26. "scheduling": {
  27. "backoff": {
  28. "backoff": 1,
  29. "backoffFactor": 1.15,
  30. "maxLaunchDelaySeconds": 3600
  31. },
  32. "upgrade": {
  33. "minimumHealthCapacity": 1,
  34. "maximumOverCapacity": 1
  35. },
  36. "placement": {
  37. "constraints": [],
  38. "acceptedResourceRoles": []
  39. }
  40. },
  41. "containers": [
  42. {
  43. "name": "container1",
  44. "resources": {
  45. "cpus": 1,
  46. "mem": 128,
  47. "disk": 0,
  48. "gpus": 0
  49. },
  50. "endpoints": [
  51. {
  52. "name": "http-endpoint",
  53. "containerPort": 80,
  54. "hostPort": 0,
  55. "protocol": [ "HTTP" ],
  56. "labels": {}
  57. }
  58. ],
  59. "image": {
  60. "id": "nginx:latest",
  61. "kind": "DOCKER",
  62. "forcePull": false
  63. },
  64. "environment": {
  65. "XPS1": "Test"
  66. },
  67. "user": "root",
  68. "healthCheck": {
  69. "gracePeriodSeconds": 30,
  70. "intervalSeconds": 5,
  71. "maxConsecutiveFailures": 3,
  72. "timeoutSeconds": 4,
  73. "delaySeconds": 2,
  74. "http": {
  75. "path": "/",
  76. "scheme": "HTTP",
  77. "endpoint": "http-endpoint"
  78. }
  79. },
  80. "volumeMounts": [
  81. {
  82. "name": "etc",
  83. "mountPath": "/mnt/etc",
  84. "readOnly": true
  85. }
  86. ],
  87. "artifacts": [
  88. {
  89. "uri": "https://ftp.gnu.org/gnu/glibc/glibc-2.25.tar.gz",
  90. "executable": false,
  91. "extract": true,
  92. "cache": true,
  93. "destPath": "glibc-2.25.tar.gz"
  94. }
  95. ],
  96. "labels": {
  97. "owner": "zeus",
  98. "note": "Away from olympus"
  99. },
  100. "lifecycle": {
  101. "killGracePeriodSeconds": 60
  102. }
  103. }
  104. ]
  105. }