aws blackbelt 2015シリーズ amazon ec2 container service (amazon ecs)
Post on 31-Jul-2015
6.559 Views
Preview:
TRANSCRIPT
1
Amazon EC2 Container Service
AWS Black Belt Tech Webinar 2015アマゾン データ サービス ジャパン株式会社ソリューションアーキテクト 岩永 亮介
2015/6/24
2
Agenda
• コンテナとは?
• Amazon EC2 Container Service - Basic
• Amazon EC2 Container Service - Advanced
• まとめ
4
ProcessProcess
コンテナとは?
• OS仮想化
• プロセス隔離
• イメージ
• 自動化
Server
Bins/Libs Bins/Libs
OS
App1 App2
Dockerfile
OS: Ubuntu
Apache, PHP
Dockerfile
OS: CentOS
Nginx, Ruby
Images
Build
Run Run
5
コンテナの利点
• 可搬性– 不変なイメージ
• 柔軟性– 削除、再生成が容易
• 速度– OSは既に起動済
• 効率– オーバーヘッド少ない
ProcessProcess
Server
Bins/Libs Bins/Libs
OS
App1 App2
Dockerfile
OS: Ubuntu
Apache, PHP
Dockerfile
OS: CentOS
Nginx, Ruby
Images
Build
Run Run
7
Dockerでコンテナ起動時にできること
• リソース制限– CPU, memory使用量をコンテナごとに制限できる
• ポートマッピング– コンテナがListenしているポートに、Hostのポートからフォワードできる
• リンク– 同一Hostのコンテナに名前でアクセスできるようにする
• ボリュームマウント– Hostのファイルシステムをコンテナにマウントできる
• エントリーポイント/コマンド指定– コンテナ起動時に実行されるコマンドを指定できる
9
Amazon EC2 Container Serviceとは?
• Amazon ECS
• Dockerコンテナ群をAmazon EC2のクラスタ上で管理できるサービス
• 高いスケーラビリティ
• AWSの他の機能・サービスとの連携
12
コンテナ管理にはリソースマネージャが必要
• 計算機群のリソースを抽象化して管理
• 使う側は必要なリソース量のみを指定– 実際にどのマシンで動く
かを気にしない
• リソースの要求に対して適切にマシンをアサインする– スケジューラ
CPU: 500
Mem: 300
CPU: 10
Mem: 30 CPU: 2000
Mem: 1000
CPU: 10
Mem: 30CPU: 10
Mem: 30
Resource Manager
13
コンテナ管理のユースケース
• Service & Application– シンプルなモデル Docker imageをbuild, test, deploy
– Microservices
– Blue-Greenデプロイ
• Batch Jobs– リソースを共有することで、バーストにも対応しやすい
– Auto Scaling/RI/Spotを使って、よりコストを下げる
14
Amazon EC2 Container Serviceの利点
クラスタ管理はお任せ状態管理、操作、監視スケーラブル
簡単に、どんなスケールのクラスタも管理できる
柔軟なコンテナの配置
他のAWSサービスとの連携がデザインされている
拡張性の高さアプリケーションバッチジョブ複数のスケジューラ
Elastic Load Balancing, Amazon EBS, Amazon VPC, AWS IAM, AWS CloudTrail
包括的なAPIオープンソースエージェントカスタムスケジューラ
16
Cluster
Container Instance
Amazon ECSにおけるコンテナ管理の概要図
• クラスタ管理– Cluster, Container
Instance, Agent
• グループ化– Task Definition, Task,
Container
• スケジューラ– Run Task, Service
Agent
Task
Container
Container
Task
Service
Task Definition
Agent
Task
Task Definition
Run Task
19
Cluster
Container Instance
Amazon ECSチュートリアル
• Task Definitionを定義する
Agent Agent
Task DefinitionTask Definition
20
Cluster
Container Instance
Amazon ECSチュートリアル
• Run TaskでBatch Taskを開始
Agent Agent
Task DefinitionTask Definition
Run Task
21
Cluster
Container Instance
Amazon ECSチュートリアル
• 自動でContainer InstanceにTaskが割り振られる
Agent Agent
Task Definition
Task
Task Definition
Run Task
22
Cluster
Container Instance
Amazon ECSチュートリアル
• Task内のContainerが起動する
Agent Agent
Task Definition
Task
Task Definition
Run Task
23
Cluster
Container Instance
Amazon ECSチュートリアル
• ServiceでWeb Taskを開始する
Agent Agent
Task
Task Definition
Run Task Service
Task Definition
24
Cluster
Container Instance
Amazon ECSチュートリアル
• 自動でContainer InstanceにTaskが割り振られる
Agent Agent
Task
Task Definition
Run Task
Task
Service
Task Definition
Task
25
Cluster
Container Instance
Amazon ECSチュートリアル
• Task内のContainerが起動する
• もし設定していれば、Elastic Load Balancingに登録
Agent Agent
Task
Task Definition
Run Task
Task
Container
Container
Service
Task Definition
Task
27
Run Task
Amazon ECS: クラスタ管理
• クラスタ管理– Cluster, Container
Instance, Agent
• グループ化– Task Definition, Task,
Container
• スケジューラ– Run Task, Service
Service
Task DefinitionTask Definition
Cluster
Container Instance
Task
Container
Container
Task
Agent
Task
Agent
29
Amazon ECS: Container Instance
• コンテナのホストとなるAmazon EC2
• VPC内の任意のインスタンスを利用可能
– Docker+ECS Agentが動いていることが必要
– Amazon ECS-optimized AMI
31
Run Task
Amazon ECS: グループ化
• クラスタ管理– Cluster, Container
Instance, Agent
• グループ化– Task Definition, Task,
Container
• スケジューラ– Run Task, Service
Service
Cluster
Container Instance
Agent Agent
Task
Container
Container
Task Task
Task DefinitionTask Definition
32
Amazon ECS: Task Definition
• コンテナの集合を定義– 必ず同じインスタンスで
稼働
– 要求するリソースを指定• CPU, memory, (Port)
• ボリュームも定義可能– インスタンスのファイル
システムを利用できる
• バージョニングが可能
33
Task Definition: Overview
Volume definitions
Container definitions
Container Instanceのファイルシステムをマウントする場合、定義する
稼働させるContainerの情報を定義する
35
Task Definition: Overview
Container
Instance
Schedule
Shared data volume
PHP AppTime of day
App
Task Definition Task
36
Task Definition: Container Definition{"name": "simple-demo","image": "foo/my-demo","cpu": 10,"memory": 500,"portMappings": [{"containerPort": 80,"hostPort": 80
}],"mountPoints": [{"sourceVolume": "my-vol","containerPath": "/var/www/my-vol"
}],"entryPoint": ["/usr/sbin/apache2","-D","FOREGROUND"
],"essential": true
},
{
"name": "busybox",
"image": "busybox",
"cpu": 10,
"memory": 500,
"volumesFrom": [
{
"sourceContainer": "simple-demo"
}
],
"entryPoint": [
"sh",
"-c"
],
"command": [
"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done"
],
"essential": false
}
37
{"name": "simple-demo","image": "foo/my-demo","cpu": 10,"memory": 500,"portMappings": [{"containerPort": 80,"hostPort": 80
}],"mountPoints": [{"sourceVolume": "my-vol","containerPath": "/var/www/my-vol"
}],"entryPoint": ["/usr/sbin/apache2","-D","FOREGROUND"
],"essential": true
},
[
{
"image": "mysql",
"name": "db",
"cpu": 10,
"memory": 500,
"essential": true,
"entryPoint": [
"/entrypoint.sh"
],
"environment": [
{
"name": "MYSQL_ROOT_PASSWORD",
"value": "pass"
}
],
"portMappings": []
}
]Essential to our Task
Mount volumes
Expose port 80 in container
to port 80 on host
10 CPU Units (1024 is full CPU),
500 Megabytes of Memory
Task Definition: Container Definition
38
{
"name": "busybox",
"image": "busybox",
"cpu": 10,
"memory": 500,
"volumesFrom": [
{
"sourceContainer": "simple-demo"
}
],
"entryPoint": [
"sh",
"-c"
],
"command": [
"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done"
],
"essential": false
}
[
{
"image": "tutum/wordpress-stackable",
"name": "wordpress",
"cpu": 10,
"memory": 500,
"essential": true,
"links": [
"db"
],
"entryPoint": [
"/bin/sh",
"-c"
],
"environment": [
…
],
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
]
},
]
From Docker Hub
Mount volume from other container
Command to exec
Task Definition: Container Definition
39
Amazon ECS: Task
• Task Definitionが実体化されたもの
– 1つのTask Definitionから複数のTaskが生成
• リソースに余裕のあるContainer Instanceで実行される
40
Amazon ECS: Container
• Taskの実体であるDockerのコンテナ
– 1つのTaskに複数のContainerが含まれる
• Container Instance上で実行される
41
Amazon ECS: スケジューラ
• クラスタ管理– Cluster, Container
Instance, Agent
• グループ化– Task Definition,
Task, Container
• スケジューラ– Run Task, Service
Cluster
Container Instance
Agent Agent
Task
Container
Container
Task Task
Task DefinitionTask Definition
ServiceRun Task
42
Amazon ECS: Run Task
• Batchジョブの様なワークロードに最適
• Task Definitionから指定した数のTaskを実行する
– Container Instanceは自動的に選ばれる
43
Amazon ECS: Service
• Web/APIの様に長期稼働するワークロードに最適
• Taskを必要数保ってくれるスケジューラ– 自動復旧にも対応
• 新しいTask Definitionをデプロイしつつ切替
• Elastic Load Balancingとの連携も可能
45
Amazon ECS: ServiceのUpdate
• Serviceが使うTask DefinitionをUpdateすると、新しいTaskをデプロイできる
• 空いているリソースで新しいTaskを起動しながら、徐々に古いTaskを止めていく– 中間では、新旧のTaskが混在するため、完全なBlue-Green
Deploymentではないので注意が必要
47
Cluster
Amazon ECS: ServiceのUpdate
Service
Task Definition:1 Task Definition:2
Task:1Task:1 Task:1
48
Cluster
Amazon ECS: ServiceのUpdate
Service
Task Definition:1 Task Definition:2
Task:1Task:1 Task:1Task:2 Task:2
49
Cluster
Amazon ECS: ServiceのUpdate
Service
Task Definition:1 Task Definition:2
Task:1Task:2 Task:2
50
Cluster
Amazon ECS: ServiceのUpdate
Service
Task Definition:1 Task Definition:2
Task:1Task:2 Task:2Task:2
51
Cluster
Amazon ECS: ServiceのUpdate
Service
Task Definition:1 Task Definition:2
Task:2 Task:2Task:2
52
Amazon ECS: 利用料金
• Amazon ECS自体の利用料は不要
• Container Instanceとして使用するAmazon EC2の料金– On-demand/RI/Spotの料金、Amazon EBSの料金
– Spotを利用する場合はTerminateされる可能性を考慮する
• Elastic Load Balancingを利用する場合はElastic Load Balancingの料金
54
Amazon ECS Advanced Topics
• Volumes
• CPU/Memory
• Dynamic Port Mapping
• IAM Role
• Auto Scaling
• Agent Update
• Task Override
• Per Instance Limitation
• AWS Elastic Beanstalk
• Docker registry
• Logging
• Service Discovery
• Docker Compose
55
Amazon ECS: Volumes
• HostのfilesystemをContainerでmountできる仕組み※
– Container間の共有storageとして
– 永続storageとして
• Task Definitionでvolumesを定義する
Host
Container 1
Container 2
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html
56
Amazon ECS: Volumesの永続化/非永続化
• Hostに永続化する時– volumesでHostのパス
をhost.sourcePathで定義する
• Hostに永続化しない時– 上記を指定しないと、
Task起動時に空のvolumeが作成される
– 使っているContainerが無くなったらDockerに回収される
←永続化する
←永続化しない
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html
57
Amazon ECS: Volumesのmount方法
• mountPointsで指定
– volumesをContainerのどこにmountするか
– readOnlyにもできる
• volumesFromで指定
– sourceContainerと同じ様にmountさせる指定方法
←何をどこにmountするか定義
←webと同じ様にmountする定義
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html
58
Amazon ECS: CPU/Memory
• CPUの単位は「1024 unit = 1 core」※
– unitを指定すると、最低それだけは使えることが保証される
– もし指定量以上を使おうとした時は、CPUに空きがあれば使える
– CPUに空きがなくなると、unitを元にキャップがかかる
• Memoryの単位は「MiB」※
– もし指定量以上を確保しようとすると、Containerは殺される
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
59
Amazon ECS: Dynamic Port Mapping
• Task起動時にHost上の空きポートが自動的にマッピングされる– OSのephemeral port
• Task DefinitionでhostPortを0または指定しないと利用可能※ Container Instance
Task
Container
Task
Container
49200
Task Definition
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
80
49201 80
60
Amazon ECS: Dynamic Port Mapping制約
• Elastic Load Balancing連携では、現状利用できない– Elastic Load Balancing側
の仕様でDynamic Portに対応していないため
• この場合、hostPortを固定する必要がある– 同一Taskは、1つの
Container Instance上に1つまで
49200
49201
49202✘
インスタンス毎にポート変更できない1インスタンスの複数ポートを登録できない
8080
8080✔※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html
61
Amazon ECS: IAM Roles
• Instance Role– Container InstanceのProfileに指定
• AWS Managed Policy: AmazonEC2ContainerServiceforEC2Role
– Amazon ECSのAPIを実行できること
• Service Role– Serviceが利用するRoleを指定
• AWS Managed Policy: AmazonEC2ContainerServiceRole
– Amazon EC2, Elastic Load BalancingのAPIを実行できること
• いずれもGetting Startedで自動作成される
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html
62
Amazon ECS: Auto Scaling
• Container InstanceのAuto Scaling増減にServiceのDesired Tasksは追従しない– Container Instanceの数が増減したからといって、自動でTask
の数が増減するということはない
• 自動で増減させたければ、何かしらのAPI連携が必要– 例: Auto Scaling Groupの増減→Amazon SNS→AWS
Lambda→Amazon ECS ServiceのDesiredCountを増減※
※ http://dev.classmethod.jp/cloud/ecs-integrate-autoscaling-by-lambda/
63
Amazon ECS: Agent Update
• マネージメントコンソールやCLIから、Agentをアップデート可能※
• Amazon ECS-optimized AMIで利用可能
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html
64
Amazon ECS: Task Override
• Run TaskではTask Definitionの一部をOverride可能※
– Command
– Environment
• Serviceでは未対応
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_run_task.html
65
Amazon ECS: Per Instance Limitation
• 現時点ではContainer単位ではなくInstance単位となっているもの
• Security Group– 全てのContainerの最大公約数的な指定が必要– Elastic Load Balancingを通せば外部からの通信は絞れる
• IAM Roles– 全てのContainerの最大公約数的な指定が必要
• AWS CloudWatch metrics– Container毎のメトリクスは取得されない– 必要であれば、他のソリューションとの組み合わせ
66
Amazon ECS: AWS Elastic Beanstalk
• Multicontainer DockerEnvironment※
– 実は裏側でAmazon ECSを使っている
– Cluster, Container Instance, Task Definition, Taskが自動生成される
※ http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_ecs.html
67
Amazon ECS: AWS Elastic Beanstalk
• Dockerrun.aws.jsonの記述は、Task Definitionとほぼ同じ※
– AWSEBDockerrunVersionに"2"を指定
– Single container Docker Environment(Version 1)とは違う形式
• Auto Scalingで増えたInstanceにもTaskが自動で配置される– Service/Run Taskスケジューラは使用していない
– startTask APIでContainer Instanceを指定してTaskを実行
※ http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_v2config.html
68
Cluster
Amazon ECS: Docker Registry
• Docker Hub等のprivate image利用可能※
– AgentにECS_ENGINE_AUTH_* 環境変数で認証情報を渡す
• Amazon ECS上に、Private Registryを立てることも可能
※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html
Service
Task Definition
registry:2
Service
Task Definition
docker.local/foo
docker.local
69
Amazon ECS: Logging
• Containerのログを集める必要がある– Containerが終了すると
ファイルは消えてしまう
• 例: Task DefinitionでLogger Containerを定義– rsyslogでログを受け取っ
て送る※
– 共有Volumeを使って書かれたログを送る
※ https://blogs.aws.amazon.com/application-management/post/TxFRDMTMILAA8X/Send-ECS-Container-Logs-to-CloudWatch-Logs-for-Centralized-Monitoring
例: Logger Containerはrsyslogでログを受け取り、CloudWatch Logs agentでログを転送する
70
Amazon ECS: Service Discovery
• Dynamic Port Mappingを活用したい時に必要– IPアドレス+hostPortのリス
トを動的に管理する
• 例: consul + registrator※
– registrator経由でconsulにHostのIPアドレスとhostPortが保存される
– DNSのSRVレコードでIPアドレスとPortが取り出せる
※ https://aws.amazon.com/blogs/compute/service-discovery-via-consul-with-amazon-ecs/
例: stock-priceとweatherはregistratorによってconsulにIPアドレスとportが登録されるので、portalはDNSのSRVレコードでdiscoveryできる
71
Amazon ECS: Docker Compose
• Docker Compose ≒ Task Definition– docker-compose.ymlとTask DefinitionのJSONを変換するツールを
作っている方もいます
• https://github.com/ambitioninc/container-transform
※参考:DockerCon 2015で、Amazon ECSとDocker Compose, DockerSwarmのインテグレーションの予定が発表されています。
https://twitter.com/docker/status/613033125900382209
74
参考資料(英語)
• Amazon EC2 Container Service Developer Guidehttp://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html
• Amazon EC2 Container Service FAQhttp://aws.amazon.com/ecs/faqs/
• AWS CLI – ecshttp://docs.aws.amazon.com/cli/latest/reference/ecs/index.html
75
Q&A
次回Webinarのお申し込みhttp://aws.amazon.com/jp/event_schedule/
76
Webinar資料の配置場所
• AWS クラウドサービス活用資料集– http://aws.amazon.com/jp/aws-jp-introduction/
77
公式Twitter/FacebookAWSの最新情報をお届けします
@awscloud_jp
検索
最新技術情報、イベント情報、お役立ち情報、お得なキャンペーン情報などを日々更新しています!
もしくはhttp://on.fb.me/1vR8yWm
top related