aws-workshop-for-kubernetes(201-cluster-monitoring)
前回の続きから 201-cluster-monitoring
Kubernetes Cluster Monitoring
Introduction
今回、以下を使用してKubernetesクラスタを監視していきます。
- Kubernetesダッシュボード
- Heapster、InfluxDB、Grafana
- Prometheus, Node exporter、Grafana
Prometheusは、オープンソースのシステム監視とアラートツールキットです。Prometheusは、これらのターゲット上のHTTPエンドポイントからメトリックを抽出することで、監視対象からのメトリックを収集します。
HeapsterはKuberenetesコンテナメトリクスに限定されていますが、一般的な使用ではありません。HeapsterはPrometheusスクレイプターゲットとして使用できます。
前提条件
ここで説明する3つのマスターノードと5つのワーカーノードを持つクラスタを使用します。
Multi-Master Clusterで作成しておきます。。
ここでの設定ファイルはすべてcluster-monitoring
ディレクトリにあります。
コマンドを実行する前に、そのディレクトリに移動してください。
Kubernetes Dashboard
Kubernetes DashboardはKubernetesクラスタ用の汎用WebベースのUIです。
ダッシュボードでは、Kubernetes v1.8でBetaではなくGAに昇格されたRBAC APIを使用しているため、 実行中のKubernetesのバージョンに応じて異なるバージョンのダッシュボードを使用します。 次のコマンドを使用してあなたのKubernetesのバージョンを確認してください。 - Server Versionの値を確認してください。
$ kubectl version Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"81753b10df112992bf51bbc2c2f85208aad78335", GitTreeState:"clean", BuildDate:"2018-04-27T09:22:21Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.3", GitCommit:"d2835416544f298c919e2ead3be3d0864b52323b", GitTreeState:"clean", BuildDate:"2018-02-07T11:55:20Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"} ec2-user:~/environment $
v1.8以上を使用している場合は、次のコマンドを使用してDashboardをデプロイします。
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml secret "kubernetes-dashboard-certs" created serviceaccount "kubernetes-dashboard" created role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created deployment.apps "kubernetes-dashboard" created service "kubernetes-dashboard" created
ダッシュボードは、次のコマンドを使用して表示できます。
kubectl proxy --address 0.0.0.0 --accept-hosts '.*' --port 8080
さて、ダッシュボードには、Preview
, Preview Running Application
を介してアクセス可能
https://ENVIRONMENT_ID.vfs.cloud9.REGION_ID.amazonaws.com/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
ENVIRONMENT_ID
は Cloud9 IDE環境ID(内蔵ブラウザのアドレスバーを一度クリックすると表示されます)と REGION_ID
はAWS region(us-east-1など)
Kubernetes 1.7以降、Dashboardは認証をサポートしています。 詳細については、https://github.com/kubernetes/dashboard/wiki/Access-control#introduction を参照してください。認証にはbearerトークンを使用します。
kube-system
ネームスペースの既存のsecretsをチェック
kubectl -n kube-system get secret
出力は次のように表示されます。
NAME TYPE DATA AGE attachdetach-controller-token-dhkcr kubernetes.io/service-account-token 3 3h certificate-controller-token-p131b kubernetes.io/service-account-token 3 3h daemon-set-controller-token-r4mmp kubernetes.io/service-account-token 3 3h default-token-7vh0x kubernetes.io/service-account-token 3 3h deployment-controller-token-jlzkj kubernetes.io/service-account-token 3 3h disruption-controller-token-qrx2v kubernetes.io/service-account-token 3 3h dns-controller-token-v49b6 kubernetes.io/service-account-token 3 3h endpoint-controller-token-hgkbm kubernetes.io/service-account-token 3 3h generic-garbage-collector-token-34fvc kubernetes.io/service-account-token 3 3h horizontal-pod-autoscaler-token-lhbkf kubernetes.io/service-account-token 3 3h job-controller-token-c2s8j kubernetes.io/service-account-token 3 3h kube-dns-autoscaler-token-s3svx kubernetes.io/service-account-token 3 3h kube-dns-token-92xzb kubernetes.io/service-account-token 3 3h kube-proxy-token-0ww14 kubernetes.io/service-account-token 3 3h kubernetes-dashboard-certs Opaque 2 9m kubernetes-dashboard-key-holder Opaque 2 9m kubernetes-dashboard-token-vt0fd kubernetes.io/service-account-token 3 10m namespace-controller-token-423gh kubernetes.io/service-account-token 3 3h node-controller-token-r6lsr kubernetes.io/service-account-token 3 3h persistent-volume-binder-token-xv30g kubernetes.io/service-account-token 3 3h pod-garbage-collector-token-fwmv4 kubernetes.io/service-account-token 3 3h replicaset-controller-token-0cg8r kubernetes.io/service-account-token 3 3h replication-controller-token-3fwxd kubernetes.io/service-account-token 3 3h resourcequota-controller-token-6rl9f kubernetes.io/service-account-token 3 3h route-controller-token-9brzb kubernetes.io/service-account-token 3 3h service-account-controller-token-bqlsk kubernetes.io/service-account-token 3 3h service-controller-token-1qlg6 kubernetes.io/service-account-token 3 3h statefulset-controller-token-kmgzg kubernetes.io/service-account-token 3 3h ttl-controller-token-vbnhf kubernetes.io/service-account-token 3 3h
「kubernetes.io/namespace-controller-token」タイプのシークレットを使用してログインできます。
ここでは、シークレットのトークン namespace-controller-token-423gh
を使用してログインします。
このシークレットのトークンを取得するには、次のコマンドを使用します。
kubectl -n kube-system describe secret namespace-controller-token-423gh
出力リストから namespace-controller-token に置き換える必要があることに注意してください。
Name: namespace-controller-token-423gh Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name=default kubernetes.io/service-account.uid=3a3fea86-b3a1-11e7-9d90-06b1e747c654 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1046 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLTd2aDB4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzYTNmZWE4Ni1iM2ExLTExZTctOWQ5MC0wNmIxZTc0N2M2NTQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.GHW-7rJcxmvujkClrN6heOi_RYlRivzwb4ScZZgGyaCR9tu2V0Z8PE5UR6E_3Vi9iBCjuO6L6MLP641bKoHB635T0BZymJpSeMPQ7t1F02BsnXAbyDFfal9NUSV7HoPAhlgURZWQrnWojNlVIFLqhAPO-5T493SYT56OwNPBhApWwSBBGdeF8EvAHGtDFBW1EMRWRt25dSffeyaBBes5PoJ4SPq4BprSCLXPdt-StPIB-FyMx1M-zarfqkKf7EJKetL478uWRGyGNNhSfRC-1p6qrRpbgCdf3geCLzDtbDT2SBmLv1KRjwMbW3EF4jlmkM4ZWyacKIUljEnG0oltjA
この出力からトークンの値をコピーし、ダッシュボードのログインウィンドウで Token
を選択し、テキストを貼り付けます。
SIGN IN
をクリックすると、デフォルトのダッシュボードビューが表示されます。
ダッシュボード上でを Nodes
をクリックすると、クラスタ内で実行されているノードに関するテキスト表現が表示されます。
Deploying applications using Kubernetes Helm chartsの説明に従って、
Javaアプリケーションをインストールします。
Pods
を再度クリックすると、クラスタ内で実行中のポッドについてのテキスト表現が表示されます。
これは、Heapster、InfluxDB、Grafanaがインストールされた後に変更されます。
Deploying applications using Kubernetes Helm charts
Helm は Kubernetesチャート を管理するためのツールです。 チャートは、関連するKubernetesリソースのセットを記述するファイルの集まりです。 チャートの紹介 で詳細を読む。
前提条件
この章では、ここで説明する3つのマスターノードと5つのワーカーノードを持つクラスタを使用します。
設定ファイルはすべて helm
ディレクトリにあります。コマンドを実行する前に、そのディレクトリに移動してください。
Helmをインストールする
Helmには2つの部分があります。Helm client(helm)とHelm server(tiller)です。 TillerはあなたのKubernetesクラスタの内部で動作し、あなたのチャートのリリース(インストール)を管理します。 ヘルムは、ラップトップ、CI/CD、またはどこでも実行するために実行されます。 このセクションでは、クライアントとサーバーの両方をインストールする方法を示します。
Helm clientをインストールする
Mac OSXにインストール
brew install kubernetes-helm
Heapster、InfluxDB、Grafana
Heapsterはmetrics aggregatorとプロセッサーです。クラスタ全体のポッドとしてインストールされます。 Kubeletと対話することにより、各ノードのすべてのコンテナの監視データとイベントデータを収集します。 Kubelet自体がcAdvisor からこのデータを取得します。 このデータは、ストレージ用の時系列データベースInfluxDBに保存されます。 Grafanaダッシュボードを使用してデータを可視化するか、Kubernetes Dashboardで表示することができます。
Heapsterは、コンピューティングリソースの使用状況、ライフサイクルイベントなどのさまざまな信号を収集して解釈し、RESTエンドポイントを介してクラスタメトリックをエクスポートします。
Heapster、InfluxDB、Grafanaは Kubernetesアドオン です。
インストール
Heapster、InfluxDB、Grafanaをインストールするには、次のコマンドを実行します。
$ kubectl apply -f templates/heapster/ deployment "monitoring-grafana" created service "monitoring-grafana" created clusterrolebinding "heapster" created serviceaccount "heapster" created deployment "heapster" created service "heapster" created deployment "monitoring-influxdb" created service "monitoring-influxdb" created
Heapsterは、各ノードで実行されているcAdvisorインスタンスからメトリックを集計しています。 このデータは、クラスタ内で実行されているInfluxDBインスタンスに格納されます。 Grafanaダッシュボードは、https://ENVIRONMENT_ID.vfs.cloud9.REGION_ID.amazonaws.com/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy/?orgId=1 でアクセスし、クラスタについて今の情報を表示します。
注意
Kubernetesプロキシが動作していない場合、Grafanaダッシュボードは利用できません。
プロキシが実行されていない場合は、コマンドを使用してプロキシを開始できます
kubectl proxy --address 0.0.0.0 --accept-hosts '.*' --port 8080
Graphanaダッシュボード
クラスタとワークロードを監視するためのダッシュボードが組み込まれています。それらは、画面の左上隅をクリックすることで利用できます。
「クラスタ」ダッシュボードには、すべてのワーカーノードとそのCPUおよびメモリメトリックが表示されます。選択した期間中に収集したメトリックを表示するには、ノード名を入力します。
「Pods」ダッシュボードでは、クラスタ内のすべてのポッドのリソース使用率を確認できます。ノードと同様に、上部のフィルタボックスに名前を入力してポッドを選択できます。
Heapsterの展開後、Kubernetes Dashboardは、ポッドやノード、その他のワークロードのCPUやメモリ使用率などの追加グラフを表示するようになりました。 Kubernetes Dashboardのクラスタの更新ビューは次のようになります。 ポッドの更新されたビューは次のようになります。
Clean
インストールされているすべてのコンポーネントを削除します。
kubectl delete -f templates/heapster/
プロメテウス、ノードエクスポータ、グラファナ
プロメテウスは、オープンソースのシステム監視とアラートツールキットです。 Prometheusは、これらのターゲット上のHTTPエンドポイントからメトリックをスクレイプすることにより、監視対象からのメトリックを収集します。
プロメテウスはKubernetesOperator によって管理されます。 この演算子はカスタムリソースを使用しています。 KubernetesのAPIを拡張し、Prometheus、ServiceMonitorとAlertmanagerのようなカスタムリソースを追加する。
プロメテウスは、ServiceMonitorを追加することによって、動的に新しいターゲットをスクレイプすることができます。 kube-controller-manager、kube-scheduler、kube-state-metrics、kubeletとnode-exporterをスクレイプするためにそれらのいくつかを含まれている。
Node exporter は、* NIXカーネルによって公開されるハードウェアおよびOSメトリクスのPrometheus exporterです。 kube-state-metrics は、Kubernetes APIサーバーをリッスンし、オブジェクトの状態に関するメトリックを生成する単純なサービスです。
インストール
まず、新しいカスタムリソースを聞くPrometheus Operatorを導入する必要があります。
$ kubectl apply -f templates/prometheus/prometheus-bundle.yaml namespace "monitoring" created clusterrolebinding "prometheus-operator" created clusterrole "prometheus-operator" created serviceaccount "prometheus-operator" created deployment "prometheus-operator" created
次にPrometheus Operatorが起動するまで待つ必要があります。
$ kubectl rollout status deployment/prometheus-operator -n monitoring ... deployment "prometheus-operator" successfully rolled out
最後のステップとして、プロメテウスのカスタムリソース、サービスモニタ、クラスタロールとバインディング(RBAC)を導入する必要があります。
$ kubectl apply -f templates/prometheus/prometheus.yaml serviceaccount "kube-state-metrics" created clusterrole "kube-state-metrics" created clusterrolebinding "kube-state-metrics" created service "kube-scheduler-prometheus-discovery" created service "kube-controller-manager-prometheus-discovery" created daemonset "node-exporter" created service "node-exporter" created deployment "kube-state-metrics" created service "kube-state-metrics" created prometheus "prometheus" created servicemonitor "prometheus-operator" created servicemonitor "kube-apiserver" created servicemonitor "kubelet" created servicemonitor "kube-controller-manager" created servicemonitor "kube-scheduler" created servicemonitor "kube-state-metrics" created servicemonitor "node-exporter" created alertmanager "main" created secret "alertmanager-main" created
プロメテウスが現れるのを待つ
$ kubectl get po -l prometheus=prometheus -n monitoring NAME READY STATUS RESTARTS AGE prometheus-prometheus-0 2/2 Running 0 1m prometheus-prometheus-1 2/2 Running 0 1m
Prometheus Dashboard
プロメテウスはさまざまなスクレイピングターゲットからメトリックを削り取り、ダッシュボードを次の方法で転送します。
$ kubectl port-forward $(kubectl get po -l prometheus=prometheus -n monitoring -o jsonpath={.items[0].metadata.name}) 9090 -n monitoring Forwarding from 127.0.0.1:9090 -> 9090
ブラウザで http://localhost:9090/targets を開き、すべてのターゲットを次のように表示する必要がありますUP(データコレクタが初めて起動して実行されるまで数分かかる場合があります)。ブラウザは次のように出力を表示します。
Grafana Installation
次のコマンドでインストールできます
$ kubectl apply -f templates/prometheus/grafana-bundle.yaml secret "grafana-credentials" created service "grafana" created configmap "grafana-dashboards-0" created deployment "grafana" created
起動をまちます
$ kubectl rollout status deployment/grafana -n monitoring ... deployment "grafana" successfully rolled out
Grafana Dashboard
grafanaダッシュボードをローカルポートに転送します。
$ kubectl port-forward $(kubectl get pod -l app=grafana -o jsonpath={.items[0].metadata.name} -n monitoring) 3000 -n monitoring Forwarding from 127.0.0.1:3000 -> 3000
Grafanaダッシュボードは、http://localhost:3000/ にアクセスできるようになりました。トップにある検索ボタンを使用して、ダッシュボードの完全なリストを利用できます。
これらのダッシュボードを使用して、さまざまな指標にアクセスできます。
その他の便利なリンク
http://localhost:3000/dashboard/db/deployment&orgId=1 http://localhost:3000/dashboard/db/kubernetes-cluster-health?refresh=10s&orgId=1 http://localhost:3000/dashboard/db/kubernetes-resource-requests?orgId=1 http://localhost:3000/dashboard/db/pods?orgId=1
掃除
インストールされているすべてのコンポーネントを削除します。
kubectl delete -f templates/prometheus/prometheus-bundle.yaml