Amazon EKS のチュートリアルで Kubernetes を理解する #02 アプリのデプロイ

# はじめに
本記事は、以下の内容の続きになります。

- [Amazon EKS のチュートリアルで Kubernetes を理解する #01 クラスタ作成](https://qiita.com/takanorig/items/6068aff9b52c71610609)

前回、k8sクラスタを作成したので、そこにアプリケーションをデプロイしてみます。

## 前提条件
- k8sのクラスタが作成されており、ワーカーノードが稼働していること。

# チュートリアル：Guestbook

Kubernetesのサンプルアプリケーションである **Guestbook** を利用します。
フロントエンドの画面と、Redis（マスター／スレーブ構成）からなるアプリケーションです。

Guestbook の詳細については、以下のページを参照してください。

- https://github.com/kubernetes/examples/blob/master/guestbook-go/README.md

## Pod／Serviceの登録

PodやServiceの定義ファイルは、すでに上記GitHubに登録されているので、それを利用してデプロイしていきます。

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-master-controller.json
replicationcontroller/redis-master created

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-master-service.json
service/redis-master created

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-controller.json
replicationcontroller/redis-slave created

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/redis-slave-service.json
service/redis-slave created

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-controller.json
replicationcontroller/guestbook created

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-service.json
service/guestbook created
```

登録されたサービスの状態を確認すると、以下のようになっています。

```
$ kubectl get services -o wide
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)          AGE   SELECTOR
guestbook      LoadBalancer   10.100.197.132   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx.us-west-2.elb.amazonaws.com   3000:31789/TCP   10s   app=guestbook
kubernetes     ClusterIP      10.100.0.1       <none>                                                                    443/TCP          63m   <none>
redis-master   ClusterIP      10.100.21.24     <none>                                                                    6379/TCP         43s   app=redis,role=master
redis-slave    ClusterIP      10.100.203.61    <none>                                                                    6379/TCP         26s   app=redis,role=slave
```

登録したサービスが一通り確認できますが、 ```guestbook``` のサービスのみ外部に公開される設定になっています。

また、```kubectl get``` コマンドにより、PoｄやNodeの情報を確認することができます。
Guestbook のアプリケーションをクラスタにデプロイした結果、Guestbookのコンテナは3つ動作しており（レプリカ:3）、Redisは、マスタのコンテナが1つ（レプリカ:1）、スレーブのコンテナが2つ（レプリカ:2）、動作していることが分かります。


```
$ kubectl get pod,node
NAME                     READY   STATUS    RESTARTS   AGE
pod/guestbook-4gp4c      1/1     Running   0          13m
pod/guestbook-8d7k2      1/1     Running   0          13m
pod/guestbook-xfvck      1/1     Running   0          13m
pod/redis-master-q8568   1/1     Running   0          25m
pod/redis-slave-4g8c8    1/1     Running   0          14m
pod/redis-slave-xwjtn    1/1     Running   0          14m

NAME                                                STATUS   ROLES    AGE   VERSION
node/ip-192-168-0-148.us-west-2.compute.internal    Ready    <none>   73m   v1.14.7-eks-1861c5
node/ip-192-168-61-197.us-west-2.compute.internal   Ready    <none>   73m   v1.14.7-eks-1861c5
node/ip-192-168-88-66.us-west-2.compute.internal    Ready    <none>   73m   v1.14.7-eks-1861c5
```

さらに ```kubectl describe``` を使うことで、Podの構成や稼働状態などの詳細情報を確認できます。

```
$ kubectl describe pod guestbook
```

## Web画面の表示
先の ```kubectl get services -o wide``` コマンドで確認した内容で、```guestbook``` の ```EXTERNAL-IP``` の部分をコピーしておきます。
また、```PORT（S）``` の部分を見ると、このアプリケーションが、3000番ポートで公開されていることが分かります。

そのため、ブラウザを開き、以下のURLでアクセスすると、Guestbookの画面が表示されます。
これで、k8s上にデプロイしたアプリケーションが動作していることを確認できました。

```
http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx.us-west-2.elb.amazonaws.com:3000
```

|![amazon-eks-guestbook01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/044c3021-c41c-3af0-382c-d7692675057d.jpeg)|
|---|


# まとめ

今回は、k8sクラスタにアプリケーションをデプロイしてみました。
k8sが生成するLoadBalancerを介して、冗長化構成で動作しているアプリケーションにアクセスすることができました。

PodやServiceの定義ファイルの内容は、ここでは説明しませんが、実際にデプロイした内容と定義の内容を、合わせて確認すると、定義されている内容も理解しやすいかと思います。

次は、k8sクラスタのモニタリングを行ってみます。

- [Amazon EKS のチュートリアルで Kubernetes を理解する #03 メトリクス＆ダッシュボード](https://qiita.com/takanorig/items/124c28ce7f3d2052e8c5)