サーバーサイドエンジニアのiwamuです。
先日はAWS re:Invent2019に行ってきました!
Keynoteやre:Playなどの盛大なイベントはもちろん、現地でしか受けられないワークショップやハッカソンにも参加でき、とても充実した1週間でした!
弊社は今年3人で参加しており、いくつか記事が公開されているので、そちらも読んでみてください。
今回は、re:Inventで受けたAWS EKSのワークショップのレポートをまとめたので掲載します!
なぜ受けたのか
個人や仕事でKubernetesについて触れていなかったことと、KubernetesやAmazon EKSへの注目度の高いことの2点から、個人的に興味があったからです。
弊社のサービスは、インフラのコンテナ化が進んでおり、AWSのコンテナサービスであるECS + Fargateを用いて稼働させています。
ECSも主要なコンテナ管理サービスではありますが、KubernetesやAmazon EKSに関しても注目度は高いですし、re:InventではEKS on Fargateが利用可能になり、さらに盛り上がりを見せています。
そこで今年のre:Inventを機にEKSのワークショップを受けてみました。
ワークショップの概要
今回のワークショップは、KubernetesとAWS EKSの概要説明があり、そのあとは各セクションごとでそれぞれの機能やツールを試してみる流れになっています。 そのため気になるところだけ試してみることも可能です。
eksworkshop.com
ワークショップの内容は公開されていて、レベルとしては、未経験の方でもやり切れる200番台(300番台や400番台もあり、数値が高いほど難しい)となっています。
KubernetesやAmazon EKSをこれから初めてみたい方、もしくは英語を学びたい方はぜひやってみてください。
ワークショップの構成とレポート
● Introduction
まずはKubernetes、EKSの紹介がありました。
https://eksworkshop.com/010_introduction/architecture/architecture_control_and_data_overview/
このセクションは、KubernetesやEKSの説明は概念的に書かれており、詳細ページへのリンクが提示されています。
なのでより詳しく知りたい方はリンク先や公式ページなどを読むといいと思います。
今回の記事ではKubernetesやEKS全体の説明は省きますが、ワークショップで頻出する単語など、知っておいたほうがいいことを4つ紹介します。
マスターコンポーネント
- Kubernetesクラスタ全体の管理を行うコンポーネントです。
- APIを提供したり、SchedulerによってNodeにPodを割り当てる役目を果たします。
- EKSではマスターコンポーネントをマネージドサービスとして提供しています。
ノードコンポーネント
- 実際にコンテナを稼働させるコンポーネントです。
- AWS EKS ではもともとEC2を利用していましたが、2019年のre:Inventの発表でFargateを利用することが可能になりました。
- ワークショップで示されるNodeは、ノードコンポーネントのことを指しています。
Pod
- 1つ以上のコンテナと共有リソースなどをまとめたグループであり、Kubernetesにデプロイできる最小単位です。
- 1つのPodで複数のコンテナがIPアドレスやストレージを共有することができます。
- ノードコンポーネント上にデプロイされます。
kubectl
- Kubernetes APIを実行するコマンドラインツールです。ワークショップでは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インスタンスまでセットアップしてくれるのでとても便利です。 ネットワーク周辺は簡略していますが、以下の構成が出来上がります。
● Deploy the Kubernetes Dashboard
このセクションでは、 Kubernetes Dashboardを作成します。 Kubernetes Dashboardとは、KubernetesクラスタやNodeをGUIから状態管理・更新できるツールです。
作業内容
- kubectlをつかってKubernetes Dashboardの設定ファイルを元にオブジェクトを生成する
- ブラウザで確認するために、プロキシ経由でKubernetes Dashboardにアクセスする
Kubernetesの構成はとても複雑なので、それをGUIで確認できてとても便利です。
● 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にアクセスすると以下のような画面が出ます。 連続でリクエストを送っていて、矢印が表しているのがリクエストのトラフィックです。
スケールすると負荷分散されリクエストごとにトラフィックが変わるようになっていて、作業の成果が分かりやすくなっています。
● 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が起動し、ブラウザで表示できるようになっています。
● 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アドレスを意識せずとも単一のエンドポイントでアクセスすることを可能としてくれます。
作業内容
- 複数の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