AWSのコンテナウォークスルー

 AWSのコンテナウォークスルー

fun-tech meetup #11 コンテナ/クラウド シリーズ 第2回 ~クラウド編その1~

AWSのコンテナサービスに触れていない方を対象に、「ECS/ECR/EKS/Fargateって何?」から「使った気になりそう」なところまでをウォークスルー!

※Docker, Kubernetesの基礎には触れません

F5367e6dde42dda84768b5b145c12eef?s=128

Masataka Yoshida

June 28, 2019
Tweet

Transcript

  1. 4.

    はなすこと • AWSのコンテナサービスについて • ECS/Fargate/EKS の使い方 >4 はなさないこと • ECRの使い方

    • プロダクションレベルでECS/EKSをどう動かすか
 コンテナのデプロイ戦略など…
  2. 8.

    順番に説明…… >8 Amazon Elastic Container Registry Amazon Elastic Container Service

    Amazon Elastic Container Service for Kubernetes AWS Fargate
  3. 9.

    順番に説明…… >9 Amazon Elastic Container Registry Amazon Elastic Container Service

    Amazon Elastic Container Service for Kubernetes AWS Fargate
  4. 10.

    だいたいこうなっています >10 コントロールプレーン データプレーン Amazon EC2 AWS Fargate Amazon Elastic

    Container 
 Service Amazon Elastic Container 
 Service for Kubernetes Amazon Elastic Container 
 Registry
  5. 11.

    だいたいこうなっています >11 コントロールプレーン データプレーン Amazon EC2 Amazon Elastic Container 


    Service Amazon Elastic Container 
 Registry コンテナイメージを 保管する コンテナを管理する コンテナを動かす AWS Fargate Amazon Elastic Container 
 Service for Kubernetes
  6. 13.

    なぜEC2? ECSがコンテナを動かすCPUなどを貸してく れるわけではない! ECSなどのコントロールプレーンは
 コンテナの管理に注力 >13 Amazon EC2 Amazon Elastic

    Container 
 Service そのため、コンテナを動かす場所が必要
 EC2かFargateが使われる このEC2インスタンスにコンテナを置いてもらおう… ECSに頼まれたコンテナ動かしたるでー!
  7. 14.

    EC2 V.S. Fargate >14 Amazon EC2 AWS Fargate 構築 EC2インスタンスを作って

    ECSに登録してから コンテナの環境を
 決めるだけ コンテナ内に 入れるか ✔ ✘ 料金 安め 高め (2019年1月に値下げ!) nginxのコンテナ 2 vCPU RAMは4GiB nginxのコンテナ 2 vCPU RAMは4GiB c5.xlargeを5台
 ECSクラスターに登録 × 10 × 10
  8. 15.

    EC2 V.S. Fargate >15 Amazon EC2 AWS Fargate データプレーン の管理

    必要
 (例えばEC2インスタンスに 脆弱性が出たら自分で対処する) 不要 データプレーン の種類 豊富なEC2インスタンス
 から選択可 0.25-4 vCPU 0.5-30GB RAM 余剰リソース 出ちゃうかも… 出ない GPU/Windows コンテナ ✔ ✘
  9. 16.

    EKSでFargateは使えない Q: Amazon EKS は AWS Fargate と連携していますか?
 A: いいえ。現在は

    Amazon EKS と AWS Fargate の間にはネ イティブな AWS 統合はありません。 https://aws.amazon.com/jp/eks/faqs/ >16
  10. 17.

    コンテナ動かし方のまとめ >17 コントロールプレーン データプレーン Amazon EC2 Amazon Elastic Container 


    Service Amazon Elastic Container 
 Registry コンテナイメージを 保管する コンテナを管理する コンテナを動かす AWS Fargate Amazon Elastic Container 
 Service for Kubernetes
  11. 20.

    ECS with EC2の構成要素 >20 タスク定義 どのコンテナを動かすかを決める サービス タスク定義を選択して、コンテナーを どこのECSクラスターに置くか・何個置 くのかを決める

    ECSクラスタ− EC2インスタンスを登録して
 コンテナを動かす場所を作る nginxのタスクを c5.xlargeのクラスターに 10個置きたい もちろんロードバランサー付きで nginxのコンテナ 2 vCPU RAMは4GiB
  12. 57.

    ECSサービスの削除 >57 Delete the service discovery service created with this

    service.に チェックを入れ “delete me” と入力して削除ボタンをクリック
  13. 67.

    ECS with Fargateの構成要素 >67 タスク定義 どのコンテナを動かすかを決める サービス タスク定義を選択して、コンテナーを どこのECSクラスターに置くか・何個置 くのかを決める

    ECSクラスタ− 「ネットワーキングのみ」で VPCだけ作る nginxのタスクを クラスターに 10個置きたい もちろんロードバランサー付きで nginxのコンテナ 2 vCPU RAMは4GiB
  14. 100.

    AWS CLIを導入する >100 pip3 install awscli --upgrade --user [default] aws_access_key_id=

    aws_secret_access_key= Pythonが使える環境で awscli をインストールする ~/.aws/credentialsを編集する [default] region=us-east-1 output=json ~/.aws/configを編集する
  15. 101.

    kubectl を導入する >101 curl -o kubectl https://amazon-eks.s3-us- west-2.amazonaws.com/1.12.7/2019-03-27/bin/darwin/amd64/ kubectl chmod

    +x ./kubectl mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH AWS用のkubectlをインストールする Docker for Macなどで既にkubectlが導入されている場合は、 $PATH の最初にAWSのkubectlが読み込まれるようにする
  16. 122.

    ワーカーノードのパラメーター w Stack name: <cluster-name>-worker-nodes w ClusterName: 作成したクラスターの名前 w ClusterControlPlaneSecurityGroup:

    CloudFormationで作成したセキュリティグループ w NodeGroupName: <cluster-name>-worker-nodes w NodeAutoScalingGroupMinSize: スケーリンググループの最小数。デフォルトの1を設定 w NodeAutoScalingGroupMaxSize: スケーリンググループの最大数。デフォルトの3を設定 w NodeInstanceType: t2.small w NodeImageId: EKSワーカーノードで利用するAMIIDの指定 w US West (Oregon) (us-west-2):ami-73a6e20b w US East (N. Virginia) (us-east-1):ami-dea4d5a1 w KeyName: EC2アクセス用のキーペア名 w 作成したものを入力する w 省略するとエラーで中断するため必ず作成する w VpcId: CloudFormationで作成したVPCのID w Subnets: CloudFormationで作成したSubnet >122 【まずは触って体験】リリース直後のAmazon EKSでサンプルアプリケーションを動かしてみ た | DevelopersIO: https://dev.classmethod.jp/cloud/aws/eks-getting-started/
  17. 124.

    ワーカーノードの設定 >124 curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/ 1.10.3/2018-06-05/aws-auth-cm.yaml あらかじめ用意された設定ファイルを取得する apiVersion: v1 kind:

    ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes 設定ファイル内の rolearn を先程出力されたARNに置き換える
  18. 125.

    設定ファイルの適用 >125 kubectl apply -f aws-auth-cm.yaml 設定ファイルをワーカーノードに適用する $ kubectl get

    nodes --watch NAME STATUS ROLES AGE VERSION ip-192-168-115-223.ec2.internal NotReady <none> 0s v1.10.3 ip-192-168-211-91.ec2.internal NotReady <none> 1s v1.10.3 ip-192-168-173-105.ec2.internal NotReady <none> 0s v1.10.3 ip-192-168-211-91.ec2.internal Ready <none> 89s v1.10.3 ip-192-168-115-223.ec2.internal Ready <none> 89s v1.10.3 ip-192-168-173-105.ec2.internal Ready <none> 89s v1.10.3 設定が適用されたか確認する(Ctrl+Cで終了)
  19. 127.

    アプリケーションの起動 >127 kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-master-controller.json kubectl apply -f

    https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-master-service.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-slave-controller.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-slave-service.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/guestbook-controller.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/guestbook-service.json サンプルアプリケーションを登録する(6つ)
  20. 132.
  21. 135.

    アプリケーションの削除 >135 kubectl delete rc/redis-master rc/redis-slave rc/ guestbook svc/redis-master svc/redis-slave

    svc/guestbook 設定ファイルをワーカーノードに適用する $ kubectl get services -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 68m <none> $ kubectl get svc --all-namespaces NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 68m kube-system kube-dns ClusterIP 10.100.0.10 <none> 53/UDP,53/TCP 68m $ kubectl delete svc kubernetes service "kubernetes" deleted 同じCLUSTER-IPのサービスを削除する
  22. 140.

    まとめ AWSのコンテナサービスは次の2つ(+1つ)を組み合わせる • コンテナを管理するコントロールプレーン(ECS, EKS) • コンテナを動かすデータプレーン(EC2, Fargate) • コンテナイメージを保管するECR

    >140 ECSはタスク定義、クラスター、サービスの順で組み立てる EKSはクラスター、ワーカーノード、アプリケーションの順で
 組み立てる
  23. 141.

    参考 • 「それコンテナにする意味あんの?」迷える子羊に捧げるコンテナ環境徹底比較 #cmdevio2019 | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/cmdevio2019-container/ • Amazon

    ECS入門 〜公式のDockerイメージを使って10分で構築してみる〜 | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/amazon-ecs-entrance-1/ • 【まずは触って体験】リリース直後のAmazon EKSでサンプルアプリケーションを動かしてみ た | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/eks-getting-started/ • [アップデート]EKSを使う際にaws-iam-authenticatorが不要になりました! | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/eks-update-get-token-cmd/ >141