[AWS][容器][ECS] 容器动手实验201

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AWS][容器][ECS] 容器动手实验201相关的知识,希望对你有一定的参考价值。

实验之前,还是先了解一下本次实验整体ECS的架构:

技术图片

实验包括:

1. 创建和定义ECS的任务(Task)

2. 创建ECS Cluster

3. 部署应用到ECS Service中

4. 通过Task Definition更新应用

5. 容器的扩展

实验前准备:

  1. AWS账号
  2. 熟悉IAM role、EC2、Docker等知识

Amazon ECS 的一些关键组件:

  1. Container Instance:EC2实例,包含ECS agent 并且注册到ECS集群中。
  2. ECS Fargate:不需要管理和配置EC2实例,全Managed的容器编排服务(本实验不涉及)
  3. Cluster:多个Container Instance组成的集群。在集群中你可以定义每一个Task如何置放。
  4. Task Definition:任务定义,定义ECS中Docker容器。比如容器中Docker的镜像、每个任务中的每个容器CPU和内存数量(Fargate只需要定义Container的内存即可),Docker联网模式、IAM role等等。
  5. Task:ECS最小的管理单元,可以理解为kubernets中的Pod。包含一个或多个Container。
  6. Scheduler:service scheduler 定义运行task的数量和定义服务计划策略:
    REPLICA——副本计划策略:默认情况下再多个可用区之间分布task。可以指定置放策略。
    DAEMON——守护程序计划策略:无需指定task数量、置放策略。一个Container instance上只部署一个task。
  7. Service:这个跟kubernets中的Service定义类似,可以理解为是多个task组成的,可以定义一组task 运行在哪儿台Container Instance中。可以通过ELB对外访问。

Task0:创建Cluster

技术图片

技术图片

Task1:配置Task Definition中的ecs sample image镜像

技术图片

技术图片

拉倒最下边,通过JSON配置TASK(通常通过控制台的参数选择):

技术图片

一下内容是JSON定义的TASK,这里注意一点是containerPath 我写的是本地Instance的,通常我们替换为docker hub或ECR的路径。

{
  "family": "yourApp-demo",
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "command": null,
      "environment": [],
      "essential": true,
      "entryPoint": null,
      "links": [],
      "mountPoints": [
        {
          "containerPath": "/usr/local/apache2/htdocs",
          "sourceVolume": "my-vol",
          "readOnly": null
        }
      ],
      "memory": 300,
      "name": "simple-app",
      "cpu": 10,
      "image": "httpd:2.4"
    },
    {
      "volumesFrom": [
        {
          "readOnly": null,
          "sourceContainer": "simple-app"
        }
      ],
      "portMappings": [],
      "command": [
        "/bin/sh -c "while true; do echo ‘<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>‘ > top; /bin/date > date ; echo ‘</div></body></html>‘ > bottom; cat top date bottom > /usr/local/apache2/htdocs/index.html ; sleep 1; done""
      ],
      "environment": [],
      "essential": false,
      "entryPoint": [
        "sh",
        "-c"
      ],
      "links": [],
      "mountPoints": [],
      "memory": 200,
      "name": "busybox",
      "cpu": 10,
      "image": "busybox"
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": null
      },
      "name": "my-vol"
    }
  ]
}

技术图片

返回,看到大部分参数都被定义好了,

技术图片

Task2:创建一个Service

技术图片

配置服务:

技术图片

配置网络:

技术图片

技术图片

技术图片

Set Auto Scaling:

技术图片

技术图片

测试容器服务:

技术图片

技术图片

技术图片

技术图片

Task3:发布一个新的应用

技术图片

复制下面的JSON,到Configure via JSON中,

{
  "family": "yourApp-demo",
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "command": null,
      "environment": [],
      "essential": true,
      "entryPoint": null,
      "links": [],
      "mountPoints": [
        {
          "containerPath": "/usr/local/apache2/htdocs",
          "sourceVolume": "my-vol",
          "readOnly": null
        }
      ],
      "memory": 300,
      "name": "simple-app",
      "cpu": 10,
      "image": "httpd:2.4"
    },
    {
      "volumesFrom": [
        {
          "readOnly": null,
          "sourceContainer": "simple-app"
        }
      ],
      "portMappings": [],
      "command": [
        "/bin/sh -c "while true; do echo ‘<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Thank You!</h2> <p>Your application is now running on a container in Amazon ECS.</p>‘ > top; /bin/date > date ; echo ‘</div></body></html>‘ > bottom; cat top date bottom > /usr/local/apache2/htdocs/index.html ; sleep 1; done""
      ],
      "environment": [],
      "essential": false,
      "entryPoint": [
        "sh",
        "-c"
      ],
      "links": [],
      "mountPoints": [],
      "memory": 200,
      "name": "busybox",
      "cpu": 10,
      "image": "busybox"
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": null
      },
      "name": "my-vol"
    }
  ]
}

技术图片

选择更新的版本5,其他保持默认即可。

技术图片

Task4:容器扩展

技术图片

增加tasks的数量:

技术图片

有关AWS云计算详细视频参考:https://edu.51cto.com/course/22206.html

以上是关于[AWS][容器][ECS] 容器动手实验201的主要内容,如果未能解决你的问题,请参考以下文章

ECS 任务。如何在容器中使用 AWS CLI

AWS ECS Fargate 容器运行状况检查命令

将多个 docker 容器部署到 AWS ECS

指定 aws ECS/Fargate 容器依赖项无法部署

使用 AWS ECS 容器计算成本

我们可以在 AWS ECS docker 容器上挂载 EFS 吗?