Amazon EKS Starter: Docker on AWS EKS with Kubernetes 受けてみた④

##はじめに
本記事では、Udemy にて Stephane Maarek 氏 が提供している「[Amazon EKS Starter: Docker on AWS EKS with Kubernetes](https://www.udemy.com/amazon-eks-starter-kubernetes-on-aws/)」 について紹介していきます。

前回は、Kubernetes Dashboard のデプロイ方法について学んでいきました。今回は、stateless app の作成を行ってまいります。
過去の記事のリンクは以下を参照ください

[Amazon EKS Starter: Docker on AWS EKS with Kubernetes 受けてみた①](https://qiita.com/Yoshiyuki03/items/ec17a6960e202c61a07c)
[Amazon EKS Starter: Docker on AWS EKS with Kubernetes 受けてみた②](https://qiita.com/Yoshiyuki03/items/a2f5aa01906df1e996c6)
[Amazon EKS Starter: Docker on AWS EKS with Kubernetes 受けてみた③](https://qiita.com/Yoshiyuki03/items/fc4153777c2a5c96c2ac)


##Deploy & inspect a stateless app
本記事で作成する stateless app の構成は、図の様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/0ac892a1-ec7a-428f-e383-22b63a766dc2.png)

- フロントエンド：PHP App
 - AWS ELB（パブリック ELB）
 - 複数の Slave DB で読み込みの冗長化
 - シングル Master DB に書き込みリクエスト

- バックエンド：Redis
 - シングル Master Pod（書き込み）
 - マルチ Slave Pods（読み込み）
 - Master と継続的に同期する複数の Slave を用意


###Backend Deployment
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/6718a490-d33f-a137-ede2-48187736405d.png)
Stateless app の構築にあたり、先ずはバックエンドを作成します。作成内容は以下です。

- Redis Master pod
- Redis Master service
- Redis Slave pods
- Redis Slave service

それでは、「redis-master.yaml」ファイルを使用して、Redis Master の作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/aceaa224-1501-2874-1b57-76083397d3a8.png)
「kubectl apply -f redis-master.yaml」と入力し、「redis-master.yaml」ファイルをデプロイします。
「kubectl get pods」、「kubectl get service redis-master」と入力することで、Redis Master pod、Redis Master service がそれぞれ YAML ファイルの内容通りに作成されていることを確認できます。

同じように、「redis-slaves.yaml」ファイルを使用して、Redis Slave の作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/08e34095-dd88-1827-fa88-0e68fb7392a5.png)
「kubectl apply -f redis-slaves.yaml」と入力し、「redis-slaves.yaml」ファイルをデプロイします。
「kubectl get pods」、「kubectl get service」と入力することで、Redis Slave pod、Redis Slave service がそれぞれ YAML ファイルの内容通りに作成されていることを確認できます。

次に、作成した pods の IP や worker node について確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/d69a89d8-dcf9-25e3-5ab1-b450685edd92.png)
「kubectl get pods -o wide」と入力すると、作成した pods の情報が表示されます。例えば、1番上に表示されている　redis-master の worker node は、ip-192-168-208-206.ec2.internal であることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c656a241-1b1b-3d5f-28da-1a9368766f5c.png)
worekr node の情報は、「kubectl describe node [NODE]」と入力することで、取得することができます。例えば、「kubectl describe node ip-192-168-208-206.ec2.internal」と入力すれば、redis master の worker node の名前やラベルなどといった情報を取得できます。

###Frontend Deployment
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/bbf45d3b-50b4-f75a-b82a-d5c43c2c2e07.png)

フロントエンドを作成します。
使用する YAML ファイル名は、「frontend.yaml」ファイルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a74eb6d7-434d-45dd-b9ac-6c0dec7aa024.png)
「kubectl apply -f frontend.yaml」と入力し、デプロイが完了したら、「kubectl get pods -o wide」を入力します。これで、フロントエンド側で作成した pods の情報を見ることができます。
また、「kubectl get service frontend」と入力することで、

- サービス名：frontend
- タイプ　　：LoadBalancer

と、フロントエンドサービスの情報を確認することができます。

これよりさらに、細かい情報を取得することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/6c7a150f-c0f0-ada5-63aa-e1ac314aa63b.png)
より詳しい情報を取得したい場合は、「kubectl describe service frontend」と入力します。
AWS のコンソール画面から、今回作成したサービスを確認することができるので、無事に作成できているか確認しましょう。


##Scaling our pods up and down
それでは、次は pod のスケーリングアップ・ダウンを行ってみましょう。

###Scaling Up
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/686a1ede-e0be-3125-f162-96e262816188.png)
「kubectl scale --replicas 5 deployment frontend」とコマンド入力することで、pod を5つスケールアップします。

###Scaling Down
今度は逆に、pod を5→4にスケールダウンさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/dd4f03ef-6a6e-de17-d060-aa110b2d5035.png)
「kubectl scale --replicas 4 deployment frontend」と入力することで、pod を4つに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a8c83a64-61be-44eb-f1f8-d12ccf426412.png)
「kubectl get pods」と入力し、現在の pod の数を確認すると pod の数が減っているのが確認できます。

yaml ファイルを直接書き換えることでも、pod の数を変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/db846162-b3cf-1f66-9222-158684f0bd39.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/055c9d75-a4ca-a3e0-c954-713b5cb20196.png)
「frontend.yaml」ファイルの「replicas」を 3→10に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/51514d8e-e4b1-b768-4995-d9a8c19cee0e.png)
「kubectl apply -f frontend.yaml」と入力し、「kubectl get deployment fronted」と入力すると、pod の数が10にスケールアップしていることが確認できます。

スケーリングを行う際の注目点としては、レプリカセットが作成されていることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/67d5634c-436e-382f-0c3e-971b5cd90d84.png)
「frontend-5c548f4769」が、レプリカセットです。そして、注意することは、このレプリカセットの数字を直接変えようとしてはいけません。
「kubectl scale --replicas 4 rs frontend-5c548f4769」と入力しても、レプリカセットの数字は変わりませんし、ポッドの数も変わりません。

##Self-Healing Mecahnism of K8s
最後に、K8s の自動修復について軽く紹介したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/daa3285a-3d77-0108-ed6a-28318a34ce20.png)
図のように3つの pod が存在している状態で、その中の1つの pod を削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/0e9617e1-cfb7-924b-8668-3ad12b228fcd.png)
[frontend-5c548f4769-bdlv2] を削除しても、代わりの[frontend-5c548f4769-thb9h] が作成されるので、pod の数は減ることはありません。

K8s の自動修復は、pod だけでなく redis-master node にも適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/b3fb7110-ff27-797a-b480-8ebeeb792d38.png)
試しに、[redis-master-55db5f7567-l8jqq] を削除します。すると、削除した redis-master node に代わって [redis-master-55db5f7567-2dwpf] が新たに生成されました。
このように、K8s は pod だけでなく redis-master node も自動修復することができます。

##おわりに
stateless app については以上となります。今回は、stateless app を作成するために、backend とfrontend の環境をそれぞれ作成しました。次回は、Amazon EFS を使った app の構築などについて紹介したいと思います。