Timers Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

未経験の方にもおすすめ! KubernetesとAWS EKS のワークショップを受けてみた #aws #reinvent #reinvent19

サーバーサイドエンジニアのiwamuです。
先日はAWS re:Invent2019に行ってきました! Keynoteやre:Playなどの盛大なイベントはもちろん、現地でしか受けられないワークショップやハッカソンにも参加でき、とても充実した1週間でした!
弊社は今年3人で参加しており、いくつか記事が公開されているので、そちらも読んでみてください。

techblog.timers-inc.com

techblog.timers-inc.com

今回は、re:Inventで受けたAWS EKSのワークショップのレポートをまとめたので掲載します!

なぜ受けたのか

個人や仕事でKubernetesについて触れていなかったことと、KubernetesAmazon EKSへの注目度の高いことの2点から、個人的に興味があったからです。

弊社のサービスは、インフラのコンテナ化が進んでおり、AWSのコンテナサービスであるECS + Fargateを用いて稼働させています。
ECSも主要なコンテナ管理サービスではありますが、KubernetesAmazon EKSに関しても注目度は高いですし、re:InventではEKS on Fargateが利用可能になり、さらに盛り上がりを見せています。

そこで今年のre:Inventを機にEKSのワークショップを受けてみました。

ワークショップの概要

今回のワークショップは、KubernetesAWS EKSの概要説明があり、そのあとは各セクションごとでそれぞれの機能やツールを試してみる流れになっています。 そのため気になるところだけ試してみることも可能です。

eksworkshop.com
ワークショップの内容は公開されていて、レベルとしては、未経験の方でもやり切れる200番台(300番台や400番台もあり、数値が高いほど難しい)となっています。
KubernetesAmazon EKSをこれから初めてみたい方、もしくは英語を学びたい方はぜひやってみてください。

ワークショップの構成とレポート

● Introduction

まずはKubernetes、EKSの紹介がありました。

f:id:kohei_iwamura:20191223210318p:plain
Kubernetesの全体構成図
https://eksworkshop.com/010_introduction/architecture/architecture_control_and_data_overview/

このセクションは、KubernetesやEKSの説明は概念的に書かれており、詳細ページへのリンクが提示されています。
なのでより詳しく知りたい方はリンク先や公式ページなどを読むといいと思います。

今回の記事ではKubernetesやEKS全体の説明は省きますが、ワークショップで頻出する単語など、知っておいたほうがいいことを4つ紹介します。

マスターコンポーネント

ノードコンポーネント

  • 実際にコンテナを稼働させるコンポーネントです。
  • AWS EKS ではもともとEC2を利用していましたが、2019年のre:Inventの発表でFargateを利用することが可能になりました。
  • ワークショップで示されるNodeは、ノードコンポーネントのことを指しています。

Pod

  • 1つ以上のコンテナと共有リソースなどをまとめたグループであり、Kubernetesにデプロイできる最小単位です。
  • 1つのPodで複数のコンテナがIPアドレスやストレージを共有することができます。
  • ノードコンポーネント上にデプロイされます。

kubectl

● Start the workshop

ワークショップはほとんどCloud9上で行なっていきます。 そしてこのセクションのゴールは、Cloud9をセットアップし、次回から実際にkubectlを使用できるようにすることです。

作業内容

  • IAMユーザーがなければ設定する(ルートアカウントではなくてユーザーを作成しログインし直すことが勧められています。)
  • Cloud9を立ち上げる
  • Cloud9のインスタンスに、kubectlをはじめとしたツールを諸々インストールする
  • Cloud9を利用するEC2にIAMロールを設定してアタッチする
  • Cloud9側の認証情報を消して、作成したIAMロールの認証情報を取得し適応させる
  • ワークショップで利用するリポジトリをクローンする
  • sshキーを作成する

Cloud9も初めて使ってみたのですが、リソース分(EC2、EBS)以外の追加料金なしで開発環境がすぐにセットアップできたり、AWSサービスを用いた開発やデバッグなどの機能が豊富にありとても便利です。 Cloud9の長所をまとめた記事も公開されているので、そちらも参考にしてみてください。 techblog.timers-inc.com

● Launch using eksctl

このセクションでは、eksctl(コマンドラインからEKSクラスタが簡単に構築できるツール)を使って実際にEKSクラスターやNodeのセットアップを行います。

作業内容

  • eksctlのセットアップ
  • EKSクラスタとNodeの作成
eksctl create cluster \
--name=eksworkshop-eksctl \
--nodes=3 \
--managed \
--alb-ingress-access \
--region=${AWS_REGION}

このコマンドだけでVPC、サブネット、セキュリティグループ、EC2インスタンスまでセットアップしてくれるのでとても便利です。 ネットワーク周辺は簡略していますが、以下の構成が出来上がります。

f:id:kohei_iwamura:20191224125125p:plain

● Deploy the Kubernetes Dashboard

このセクションでは、 Kubernetes Dashboardを作成します。 Kubernetes Dashboardとは、KubernetesクラスタやNodeをGUIから状態管理・更新できるツールです。

作業内容

Kubernetesの構成はとても複雑なので、それをGUIで確認できてとても便利です。

f:id:kohei_iwamura:20191222125918p:plain

● Deploy the Example Microservices

このセクションでは、実際に3つのマイクロサービスをデプロイします。 「Start the workshop」でクローンした3つのリポジトリ(ecsdemo-frontend, ecsdemo-nodejs, ecsdemo-crystal)を、それぞれkubectlを使ってデプロイします。

作業内容

  • ecsdemo-nodejs, ecsdemo-crystal, ecsdemo-frontendのデプロイ
  • それぞれのマイクロサービスをスケールさせる

スケール時に行ったことは、「ReplicaSetの指定数を増やす」ことです。 ReplicaSetの指定数を3にすることで、Kubernetesは同じ機能のPodを3つ、自動的に起動させています。
そうすることで耐久性が上がることはもちろん、その数を維持しようとするので可用性が高くなります。

実際にデプロイが完了し、LoadBalancerにアクセスすると以下のような画面が出ます。 連続でリクエストを送っていて、矢印が表しているのがリクエストのトラフィックです。

f:id:kohei_iwamura:20191222183239g:plain

スケールすると負荷分散されリクエストごとにトラフィックが変わるようになっていて、作業の成果が分かりやすくなっています。 f:id:kohei_iwamura:20191222183033g:plain

● Helm

このセクションでは、HelmというKubernetesリソースのパッケージマネージャーを使って、Nginxを起動していきます。

作業内容

  • Helmのインストール/アップデート
  • NginxのChartsを検索
  • ChartsからNginxを起動
// Chartsを検索
$ helm search nginx
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION                                                 
bitnami/nginx                           1.1.2           1.14.1          Chart for the nginx server  
// Chartsをインストール(リソースの作成)
$ helm install --name mywebserver bitnami/nginx

設定ファイルを自分で用意し、kubectlを使って1からリソースを作成していくのもいいですが、有名なツールを利用したいときは、Chartsを探してインストールするだけですぐにリソースからアプリケーションまで起動してくれます。
インストール時に動的にパラメータを埋め込めるので、環境によってPodの数を調整したりすることも可能なところも便利ですね。

セクションをやり終わるとNginxが起動し、ブラウザで表示できるようになっています。 f:id:kohei_iwamura:20191222142546p:plain

● Exposing a Service

このセクションでは、Kubernetesの主要機能の1つであるServiceをデプロイしていきます。 Serviceとは、複数のPodのエンドポイントを1つにグループ化したもので、複数のPodに対してLoadBalancerの働きを行います。

Serviceは主にPod間の通信などネットワークの面で活躍します。
Pod同士で通信を行いたい場合、Kubernetesの仕様でPodごとにIPアドレスが割り振られるので、そのIPアドレスにアクセスする事で可能となります。しかし、Nodeが再生成された時など、Podに割り当てられているIPアドレスが変わることがあり、IPアドレスを管理し続けることはとても困難です。
Serviceは、複数のPodやネットワーク構成を抽象化して、IPアドレスを意識せずとも単一のエンドポイントでアクセスすることを可能としてくれます。

f:id:kohei_iwamura:20191223203609p:plain

作業内容

  • 複数のPodをデプロイする
  • Serviceを作成し、Podを紐付ける
  • Serviceへのアクセス方法の紹介
  • ServiceにLoadBalancerを紐付けてEIPを取得し、ブラウザからアクセスする
  • Ingressの仕組みの説明

● Assigning Pod to Nodes

このセクションでは、Nodeの指定方法を学び、特定のNodeのみにPodを実行していく方法を学びます。

作業内容

  • 1つのNodeにラベル付けを行い、nodeselectorを用いて指定のNodeのみにPodをデプロイする
  • Affinity と anti-affinity を利用してより複雑な設定を行う
  • 指定のPodが存在するNodeにPodをデプロイする

まとめ

セクションごとで様々なKubernetesの機能やツールを試すことができ、全体を通してKubernetesについて知るいい機会でした。
re:Inventでも、当日参加希望者の列が他のワークショップと比べても長く、本当に注目されている技術だと思います。自分も置いて行かれないように日々キャッチアップを頑張ります。

KubernetesやEKS以外のワークショップも公開されているものが多いので、年末年始に時間を見つけてやるのもいいかと思います!

それでは良いお年を。

積極採用中!!

子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中!
急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP: http://timers-inc.com/engineerings

www.wantedly.com

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる