SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

KubernetesによるスケーラブルなWebアプリ環境の構築

Google StackdriverでKubernetesのモニタリングに挑戦してみよう

KubernetesによるスケーラブルなWebアプリ環境の構築 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

カスタム指標でKubernetesの指標を収集する

 それでは、実際にカスタム指標を使ってKubernetes API Serverの指標をStackdriverで収集してみましょう。構成は下図の通りです。

構成図
構成図

 kube-metricsはKubernetes API Serverの指標を収集して、Stackdriverに送信するPodになります。このPodには以下のコンテナが含まれています。

  • kube-state-metrics
  • prometheus-to-sd

 kube-state-metricsはKubernetes API serverの指標を生成するコンテナで、prometheus-to-sdはkube-state-metricsで生成した指標をStackdriverに送信するコンテナです。

kube-state-metrics

 Kubernetes API Serviceをリッスンして、Kubernetesのオブジェクトの状態の指標を生成するシンプルなサービスです。今回は既にDockerコンテナイメージ化されたものがあるのでそれを使います。

 kube-state-metricsのGitHubのレポジトリはこちらです。

prometheus-to-sd

 さまざまなコンポーネントから取得したprometheusのテキストフォーマットの指標をStackdriverに送るコンポーネントです。今回はkube-state-metricsから指標を取得して、Stackdriverに流すのに使います。

 prometheus-to-sdのGitHubのレポジトリはこちらです。

kube-metricsのPodのデプロイ

 それでは、この構成でPodをデプロイするためのDeploymentを作成していきましょう。

リスト1 kube-metrics.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-metrics

spec:
  replicas: 1 # (1)
  template:
    metadata:
      labels:
        app: kube-metrics
    spec:
      hostNetwork: true
      containers:
      - name: kube-state-metrics # (2)
        image: gcr.io/google_containers/kube-state-metrics:v1.1.0
        ports:
          - name: http-metrics
            containerPort: 8080 #(2-1)
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5 #(2-2)
          timeoutSeconds: 5
        resources:
          requests:
            memory: 200Mi
            cpu: 100m
          limits:
            memory: 300Mi
            cpu: 200m
      - name: prometheus-to-sd #(3)
        image: gcr.io/google-containers/prometheus-to-sd:v0.2.3
        ports:
          - name: profiler
            containerPort: 6060
        command:
          - /monitor
          - --stackdriver-prefix=custom.googleapis.com
          - --source=kube-state-metrics:http://localhost:8080 #(3-1)
          - --pod-id=$(POD_NAME)
          - --namespace-id=$(POD_NAMESPACE)
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace

 このYAMLはGitHubの「GoogleCloudPlatform/k8s-stackdriverのkubernetes/prometheus-to-sd-kube-state-metrics.yaml」を参考にしています。

 YAMLの定義を上から説明します。まずレプリカ数は1を指定(1)します。このPodはひとつ以上動作していれば十分なのでこの値にしています。

 次にkube-state-metrics(2)のコンテナについてですが、Google公式のgcr.io/google-containers/kube-state-metricsというイメージのv1.1.0のタグを指定しています。このバージョンは現在指定できる一番新しいバージョンです。ちなみにどのバージョンが使えるかを知りたい方は、以下のGoogle Containersのコンテナレジストリを参照してください。

 このコンテナの動作Portは8080(2-1)で、このポートに対して後述するprometheus-to-sdが指標を取得するためにアクセスするようになっています。そのため、prometheus-to-sdのコンテナのcommandオプションの--source=kube-state-metricsで指定するPortと一致する必要があります。

 readinessProbe(2-2)のオプションですが、これはコンテナがトラフィックを受けられるかどうかを指定するオプションで、今回はコンテナが起動してから5秒間はkubeletのプローブを待つように設定しています。プローブとはコンテナにリクエストを投げてヘルスチェックすることを指します。

 prometheus-to-sd(3)のコンテナについてですが、こちらもGoogle公式のgcr.io/google-containers/prometheus-to-sdというイメージのタグがv.0.2.3を指定しています。こちらも現状使える最新のバージョンを指定しています。

 command(3-1)のオプションでは、配下の--stackdriver-prefix=custom.googleapis.comでカスタム指標名の指定やどの指標をソースにするかを指定しています。今回はkube-state-metricsが生成した指標をソースにしたいので、kube-state-metricsが動作しているlocalhost:8080を指定しています。

 それでは、実際にデプロイしてみましょう。

$kubectl create -f kube-metrics.yaml

 デプロイしたら正常に動作しているかをkubectl get deployで確認してみましょう。

$kubectl get pod
NAME                                                 READY     STATUS    RESTARTS   AGE
kube-metrics-666bf4cd8d-xfh6x                        2/2       Running   0          38m

 正常に動作していればRunningになっているはずです。これでkube-metricsの指標がStackdriverに送られるようになりました。

kube-metricsの指標の確認

 最後に、StackdriverのDashboardで指標を可視化してみましょう。今回は試しにkube_deployment_spec_replicasというDeploymentのレプリカ数を可視化してみましょう。kube-state-metricsには、これ以外にもkubernetesの各リソースの指標が収集されています。そのため、今回はdeploymentの指標を可視化しますが、他にもDaemonSetやNodeの指標も可視化することができます。その他指標に関しては、以下の公式ドキュメントを参照してください。

 手順は以下の通りです。

  1. GCPのコンソールから「Stackdriver Monitoring」にアクセス
  2. [Dashboard]をクリックし、出てくるメニューから作成したダッシュボード名をクリック
  3. Dashboardの画面に遷移したら[Add Chart]をクリック
  4. 下図「Add Chart kube_deployment_spec_replicas」を参考に、Add Chartの「Resource Type」には「Custom Metrics」、「Metric Type」には「kube_deployment_spec_replicas」を指定(注:kube-metricsのPodをデプロイした直後では、「Custom Metrics」がメニューにない場合があります。その場合は少し時間をあけてから試してください)
  5. [Title]はCusttom Metricsでは分かりづらいので、kube_deployment_spec_replicasに変更
  6. [Save]をしてChartを保存
Add Chart kube_deployment_spec_replicas
Add Chart kube_deployment_spec_replicas

 以上で、Dashboardにkube_deployment_spec_replicasに指標がChartとして可視化されていることが確認できると思います。

kube_deployment_spec_replicas追加後のDashboard
kube_deployment_spec_replicas追加後のDashboard
kube_deployment_spec_replicasのChart
kube_deployment_spec_replicasのChart

 こちらのChartはDeploymentごとに、レプリカ数がグラフになっています。同じレプリカ数のDeploymentが重なってしまい少々見づらいので、リスト表示で確認するのがおすすめです。

 リストに表示されている名前に関しても非常に長くて見づらいのですが、「gke_container:kube-state-metrics/kube_deployment_spec_replicas:gke_container(」の横にある名前がDeploymentの名前になります。

gke_container:kube-state-metrics/kube_deployment_spec_replicas:gke_container(kube-dns, kube-system,

 この例であれば、kube-dnsがDeploymentの名前で、kube-systemはこのDeploymentがデプロイされているネームスペースになります。

最後に

 今回はモニタリングツールの導入してStackdriverの導入方法と、カスタム指標について解説しました。必要に応じてカスタム指標を追加するなど、お好みの指標の可視化に挑戦してみてください。

参考

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
KubernetesによるスケーラブルなWebアプリ環境の構築連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 吉海 将太(ヨシカイ ショウタ)

 株式会社カブクのサーバーサイドエンジニアです。APIの開発(Python,GO,AppEngine)とKubernetesによるインフラ環境の構築を担当しています。好きな獣はチベットスナギツネです。 Twitter: @yoshikai_ FacebookWINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10644 2018/02/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング