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:resourceLimits (必需)对象CPU 和内存限制的容器规格。
containers.resourceLimits.cpus数字或字符串CPU 资源限制(默认:resources.cpus 值),可以指定为“无限”。
containers.resourceLimits.mem数字或字符串以 MiB 计算的内存资源(默认:resources.mem 值),可以指定为“无限”。
containers.image对象如果省略 image,就使用 Mesos 容器。
containers.image.kind字符串容器镜像格式(DOCKERAPPC).
containers.image.id字符串容器镜像标签。
containers.image.forcePull布尔值设置为 true 以始终拉取镜像(默认值:false)。
containers.volumeMounts阵列接受以下参数:namemountPath.
containers.volumeMounts.name字符串共享卷的名称(必须是在 pod 层定义的有效卷)。
containers.volumeMounts.mountPath字符串挂载卷的容器路径。
containers.endpoints阵列对象阵列。
containers.endpoints.name字符串端口的唯一名称。
containers.endpoints.containerPort数字容器任务正在侦听的容器点。如果网络模式为 ,则必填。
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. "resourceLimits":{
  24. "cpus": "unlimited",
  25. "mem": 1024
  26. },
  27. "endpoints":[
  28. {
  29. "name":"httpendpoint",
  30. "containerPort":8080,
  31. "hostPort":0,
  32. "protocol":[
  33. "tcp"
  34. ],
  35. "labels":{
  36. "ep1_label":"ep1"
  37. }
  38. }
  39. ],
  40. "image":{
  41. "kind":"DOCKER",
  42. "id":"python:3.5.2-alpine"
  43. },
  44. "environment":{
  45. "C1_ENV":"c1"
  46. },
  47. "healthCheck":{
  48. "http":{
  49. "endpoint":"httpendpoint",
  50. "path":"/ping",
  51. "scheme":"HTTP"
  52. },
  53. "gracePeriodSeconds":30,
  54. "intervalSeconds":5,
  55. "maxConsecutiveFailures":3,
  56. "timeoutSeconds":3,
  57. "delaySeconds":2
  58. },
  59. "volumeMounts":[
  60. {
  61. "name":"sharedvolume",
  62. "mountPath":"mount1"
  63. }
  64. ],
  65. "artifacts":[
  66. {
  67. "uri":"https://s3-us-west-2.amazonaws.com/mesos-soak-cluster/read-write-server.py",
  68. "extract":false,
  69. "executable":true,
  70. "cache":true,
  71. "destPath":"read-write-server.py"
  72. }
  73. ],
  74. "labels":{
  75. "c1_label":"c1"
  76. }
  77. },
  78. {
  79. "name":"healthtask2",
  80. "exec":{
  81. "command":{
  82. "shell":"./read-write-server.py 8081 mount2/test-file.txt"
  83. }
  84. },
  85. "resources":{
  86. "cpus":0.1,
  87. "mem":32,
  88. "disk":32,
  89. "gpus":0
  90. },
  91. "endpoints":[
  92. {
  93. "name":"httpendpoint2",
  94. "containerPort":8081,
  95. "hostPort":0,
  96. "protocol":[
  97. "tcp"
  98. ],
  99. "labels":{
  100. "ep2_label":"ep2"
  101. }
  102. }
  103. ],
  104. "image":{
  105. "kind":"DOCKER",
  106. "id":"python:3.5.2-alpine"
  107. },
  108. "environment":{
  109. "C2_ENV":"c2"
  110. },
  111. "healthCheck":{
  112. "http":{
  113. "endpoint":"httpendpoint2",
  114. "path":"/ping",
  115. "scheme":"HTTP"
  116. },
  117. "gracePeriodSeconds":30,
  118. "intervalSeconds":5,
  119. "maxConsecutiveFailures":3,
  120. "timeoutSeconds":3,
  121. "delaySeconds":2
  122. },
  123. "volumeMounts":[
  124. {
  125. "name":"sharedvolume",
  126. "mountPath":"mount2"
  127. }
  128. ],
  129. "artifacts":[
  130. {
  131. "uri":"https://s3-us-west-2.amazonaws.com/mesos-soak-cluster/read-write-server.py",
  132. "extract":false,
  133. "executable":true,
  134. "cache":true,
  135. "destPath":"read-write-server.py"
  136. }
  137. ],
  138. "labels":{
  139. "c2_label":"c2"
  140. }
  141. },
  142. {
  143. "name":"clienttask",
  144. "exec":{
  145. "command":{
  146. "shell":"while true; do sleep 5 && curl -X GET localhost:8080/write && curl -X GET localhost:8081/read; done"
  147. }
  148. },
  149. "resources":{
  150. "cpus":0.1,
  151. "mem":32,
  152. "disk":32,
  153. "gpus":0
  154. },
  155. "endpoints":[
  156. ],
  157. "environment":{
  158. "C3_ENV":"c3"
  159. },
  160. "volumeMounts":[
  161. ],
  162. "artifacts":[
  163. ],
  164. "labels":{
  165. "c3_label":"c3"
  166. }
  167. }
  168. ],
  169. "secrets":{
  170. },
  171. "volumes":[
  172. {
  173. "name":"sharedvolume"
  174. }
  175. ],
  176. "networks":[
  177. {
  178. "name":"dcos",
  179. "mode":"container",
  180. "labels":{
  181. "net_label":"net"
  182. }
  183. }
  184. ],
  185. "scaling":{
  186. "kind":"fixed",
  187. "instances":1,
  188. "maxInstances":null
  189. },
  190. "scheduling":{
  191. "backoff":{
  192. "backoff":1,
  193. "backoffFactor":1.15,
  194. "maxLaunchDelaySeconds":300
  195. },
  196. "upgrade":{
  197. "minimumHealthCapacity":1,
  198. "maximumOverCapacity":1
  199. },
  200. "placement":{
  201. "constraints":[
  202. ],
  203. "acceptedResourceRoles":[
  204. ]
  205. },
  206. "killSelection":"YOUNGEST_FIRST",
  207. "unreachableStrategy":{
  208. "inactiveAfterSeconds":900,
  209. "expungeAfterSeconds":604800
  210. }
  211. },
  212. "executorResources":{
  213. "cpus":0.1,
  214. "mem":32,
  215. "disk":10
  216. }
  217. }

其他 Pod 字段

字段类型
labels对象Pod 元数据作为键/值对。
environment对象pod 级别的环境变量。所有 pod 容器都将继承这些环境变量。必须为大写形式。
secrets对象存储库中的密钥的完全限定路径。
scheduling对象定义故障应用程序的指数退避行为以防止沙盒填满。
scheduling.backoff数字启动实例失败时应用的初始退避(秒)(默认值:1)。
scheduling.backoffFactor数字应用于当前退避的因数以确定新的退避(默认值:1.15)。
scheduling.maxLaunchDelaySeconds数字检测到后续失败时应用的最大退避(秒)(默认值:300)。
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 任务的布局策略。选项:UNIQUE, CLUSTER, GROUP_BY, LIKE, UNLIKE, MAX_PER
placement.acceptedResourceRoles字符串[]资源角色列表。Marathon 组件只会考虑在此列表中列出角色,为此 Pod 的任务提供的资源邀约。
killSelection字符串定义应用程序处于过度调配状态时首先被关闭的实例。选项:YOUNGEST_FIRST, OLDEST_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协议类型。选项:http, tcp, exec
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":300
  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": 300
  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 将根据 执行 HTTP 请求。<container_ip>:80. 如果 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": 300
  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. "resourceLimits": {
  51. "cpus": "unlimited",
  52. "mem": 1024
  53. },
  54. "endpoints": [
  55. {
  56. "name": "http-endpoint",
  57. "containerPort": 80,
  58. "hostPort": 0,
  59. "protocol": [ "HTTP" ],
  60. "labels": {}
  61. }
  62. ],
  63. "image": {
  64. "id": "nginx:latest",
  65. "kind": "DOCKER",
  66. "forcePull": false
  67. },
  68. "environment": {
  69. "XPS1": "Test"
  70. },
  71. "user": "root",
  72. "healthCheck": {
  73. "gracePeriodSeconds": 30,
  74. "intervalSeconds": 5,
  75. "maxConsecutiveFailures": 3,
  76. "timeoutSeconds": 4,
  77. "delaySeconds": 2,
  78. "http": {
  79. "path": "/",
  80. "scheme": "HTTP",
  81. "endpoint": "http-endpoint"
  82. }
  83. },
  84. "volumeMounts": [
  85. {
  86. "name": "etc",
  87. "mountPath": "/mnt/etc",
  88. "readOnly": true
  89. }
  90. ],
  91. "artifacts": [
  92. {
  93. "uri": "https://ftp.gnu.org/gnu/glibc/glibc-2.25.tar.gz",
  94. "executable": false,
  95. "extract": true,
  96. "cache": true,
  97. "destPath": "glibc-2.25.tar.gz"
  98. }
  99. ],
  100. "labels": {
  101. "owner": "zeus",
  102. "note": "Away from olympus"
  103. },
  104. "lifecycle": {
  105. "killGracePeriodSeconds": 60
  106. }
  107. }
  108. ]
  109. }