Amazon EKS のチュートリアルで Kubernetes を理解する #03 メトリクス＆ダッシュボード


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

- [Amazon EKS のチュートリアルで Kubernetes を理解する #02 アプリのデプロイ](https://qiita.com/takanorig/items/6b2eced40b309b557d70)

前回、k8sクラスタにアプリケーションをデプロしてみたので、
今回は、クラスタやアプリケーションのモニタリングを行ってみます。

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

# Kubernetes Metrics Server の構築

Kubernetesには、メトリクスサーバー（metrics-server）というモノがあり、
これを利用することで、クラスタに登録された各種リソースの情報を簡単に取得できるようになります。

## Kubernetes Metrics Server のデプロイ

ここでは、最新版をダウンロードして、クラスタに登録を行います。

```
$ cd /Users/$USERNAME/MyWork/amazon-eks

$ DOWNLOAD_URL=$(curl -Ls "https://api.github.com/repos/kubernetes-sigs/metrics-server/releases/latest" | jq -r .tarball_url)

$ DOWNLOAD_VERSION=$(grep -o '[^/v]*$' <<< $DOWNLOAD_URL)

$ curl -Ls $DOWNLOAD_URL -o metrics-server-$DOWNLOAD_VERSION.tar.gz

$ mkdir metrics-server-$DOWNLOAD_VERSION

$ tar -xzf metrics-server-$DOWNLOAD_VERSION.tar.gz --directory metrics-server-$DOWNLOAD_VERSION --strip-components 1

$ kubectl apply -f metrics-server-$DOWNLOAD_VERSION/deploy/1.8+/
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
```

## 動作確認

以下で、metrics-serverのDeploymentで、必要な数のポッドが実行されていることが確認できます。

```
$ kubectl get deployment metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server   1/1     1            1           2m55s
```

# Kubernetes Dashboard の構築

metrics-server単体では、メトリクスの可視化はされません。
メトリクスの可視化を行うために、Kubernetes ダッシュボード を構築します。

## Kubernetes Dashboard のデプロイ

まずは、Kubernetes のGitHubリポジトリで公開されているダッシュボードの定義を取得し、クラスタにデプロイします。

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
```

## サービスアカウント／クラスターロールバインディングの作成

デフォルトでは、Kubernetes ダッシュボードへのアクセスは制限されています。
そのため、管理者レベルのアクセス権限を使用してダッシュボードに安全に接続するために使用できるようにします。

「eks-admin-service-account.yaml」というファイルを作成します。

```
$ touch eks-admin-service-account.yaml
```

そのファイルに、以下の内容を定義します。
ここでは、サービスアカウントと、eks-admin と呼ばれるクラスターロールバインディングを定義しています。

```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: eks-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: eks-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: eks-admin
  namespace: kube-system
```

上記内容を、クラスタにデプロイします。

```
$ kubectl apply -f eks-admin-service-account.yaml
serviceaccount/eks-admin created
clusterrolebinding.rbac.authorization.k8s.io/eks-admin created
```

## ダッシュボードへの接続

先の手順で、クラスタの状態を表示可能な管理者サービスアカウントを作成したため、このサービスアカウントを使用してダッシュボードに接続します。

まず、サービスアカウントの認証トークンを取得します。

```
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
```

以下のような内容が出力されるので、そこから ```<authentication_token>``` の値をコピーしておきます。
このトークンを使用してダッシュボードに接続します。

```
Name:         eks-admin-token-jnn96
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: eks-admin
              kubernetes.io/service-account.uid: e9201e83-3454-11ea-bc0a-0e7ed5a45fb2

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      <authentication_token>
```

ローカル環境から、ダッシュボードへアクセスできるよう、 ```kubectl proxy``` を開始します。
以下のコマンドを実行したら、そのまま実行中の状態になるため、ダッシュボードへの接続確認ができるまで、
コンソールはそのままにしておきます。

```
kubectl proxy
```

ブラウザで以下のリンクを開いて、ダッシュボードのエンドポイントにアクセスします。

```
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#!/login
```

![amazon-eks-dev04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/7a674e8b-6295-4766-5567-1449d2127ef0.jpeg)


さらに、[トークン] を選択して、先の手順でコピーしておいた ```<authentication_token>``` の内容を [トークン] フィールドに貼り付け、[サインイン] を押下します。
接続に成功すると、以下のようなダッシュボード画面が表示されます。

![amazon-eks-dev05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/876ebada-7820-6c75-500c-a979b5608748.jpeg)

このダッシュボード画面から、ノードの状態や、PodやReplicaSetなどのワークロードの情報など、
各種のクラスタの情報を確認することができます。


# まとめ

Kubernetes Metrics Server／Kubernetes Dashboard を利用することで、
クラスタの構成や各種リソースの状況などを簡単に確認できるようになるので、
まずはクラスタ構成や動作を理解するには、このダッシュボードの画面を確認しながら操作してみると、
効率的に内容を把握できるかと思います。