株式会社ユーザベースの技術チームブログです。kubernetesTweetこんにちは、SPEEDAのSREチームの阿南です。前回から少し時間が経ってしまいましたが、今回はKubernetesのメトリクス取得についてです。本番環境でkubernetesを運用する際、ポッドがどの程度リソースを消費しているのか、クラスター自体のリソースは大丈夫かなど常に把握しておく必要があります。Kubernetesってどう監視すればいいのって疑問ありますよね。PrometheusとかGrafanaとかよく出てきて概要は理解できるんだけど、実際どう構築すればいいの、とお悩みの方に役立つ記事にしたいと思います。ちなみに弊社ではRancher上にKubernetes環境を本番で利用していますが、大枠は今回紹介するような構成で運用しています。利用する環境はGKEです。Kubernetesクラスターの中にPrometheusを構築し、メトリクスを取得します。クラスター外部にfederation用のPrometheusを構築し、Grafanaでメトリクスを可視化します。概要をざっくりと箇条書きすると、下記のようになります。別途まとめていますのでこちらをご参照ください。Kubernetesの認証方式についてGKEのKubernetesバージョン1.8からはRBACがデフォルトで適用されているため、Prometheusで監視をする際に監視に必要な権限を与えてあげる必要があります。構築する際のポイントですが、まずは自分自身のアカウント(kubectlを実行するユーザ)にcluster-adminを付与します。--user=sample-owner@sample-project.iam.gserviceaccount.comcluster-adminを設定する理由は、kubectlを実行するユーザの権限より強い権限をroleとして設定することはできないためです。ちなみにbindingには、clusterrolebindingとrolebindingの2つがあり、それぞれ適用範囲をクラスター全体にするか、細かく設定するかを選択できるようになっています。この辺りの設計は利用するサービスや会社によって最適な設定が異なると思いますので、ぜひ事例があれば聞いてみたいですね。次にPrometheus用にサービスアカウントを作成します。monitoringこのサービスアカウントに対して、参照権限を付与します。そのリソースに対する操作を表します。nonResourceURLsはエンドポイントの権限設定なので、細かく設定する際は/api等のエンドポイントを指定します。今回はnonResourceURLsを*、verbsをgetとしてエンドポイントに対してGETリクエストを許可します。これでread_onlyな形で権限を作成することができました。Prometheusの監視について、secrets等は閲覧権限不要のため内容を修正しました。ご指摘いただいた方ありがとうございます!gist.github.comGKEの場合1.7まではデフォルトのサービスアカウントで全てのリソース、操作が許可されていました。v1.8からRBACがstableになっているのでGKE側でもこの辺りの変更が入っているようです。Prometheusにはたどり着いておりません。序盤からハマリどころ満載で、楽しくなってきました。ConfigMap設定ConfigMapにPrometheusのconfigファイルを設定します。最初のglobal設定で、メトリクスの取得間隔を指定しています。利用してメトリクスの取得先をdiscoveryできるようにしています。discoveryの設定を利用することにより、サーバが追加になったりした際にも自動的にそれを検知しメトリクスを取得できるようになります。Prometheusの強力な機能ですね。gist.github.comkubernetes_sd_configsの中身については正直いきなり理解するのは難しいと思いますので、とりあえず細かい説明は置いて次に進みます。Deployment設定PrometheusのDeploymentの設定ですが、ここで最初に作成しておいたサービスアカウントが登場します。prometheusの記載があります。これを指定することで、全てのリソースに対する参照all-readerができるようにしています。ちなみに、サービスアカウントを作成するとsecretにca.crt、tokenというデータが作成されます。配下にマウントされます。Serverの認証をパスできるようにしています。先ほどのConfigMapの設定でca_fileとbearer_token_fileによくわからないパスが出てきましたがシークレットがマウントされていたんですね。この辺りの仕様は公式ドキュメントに記載がありますので見てみるといいと思います。Deploymentにサービスアカウントを指定しなかった場合、defaultのサービスアカウントが適用されますので、認証が通らずメトリクスの収集ができなくなります。言って権限を全解放すると色々な事故が起こる可能性がありますし、後からこの認証を入れていくのはかなりしんどいと思います。最初から正しく仕事をする。gist.github.comService設定とポート解放Prometheusのサービスを公開します。今回はNodePortモードでノードの30001番ポートを解放しています。ポッドの9090番ポートに接続されるので、Prometheusにアクセスするためには30001番のポートをGCPのネットワーク設定で解放しておく必要があります。ファイアウォールルールからポートを解放してください。ちなみに、本記事では手間を省くためにNodePortモードを利用しておりますが、Production環境等ではInternalのLoadBalancerを利用した方がノードに依存することがなくなるため運用しやすいと思います。弊社の本番環境でもPrometheusを利用していますが、正直全てのメトリクスを把握できないほどの種類を取得しています。それだけ細かく取得できているのは素晴らしいのですが、どうやって可視化するのか迷いますよね。次回はそんな方にオススメのGrafana周りを紹介しますのでご興味のある方は楽しみにしていてください。SPEEDA」を掲げ、ユーザベースグループのミッションである「経済情報で、世界をかえる」の実現に向けて、日々業務に取り組んでいます。興味を持ってくださった方はこちらをご確認ください。Liveでも配信されますのでご興味ある方はぜひご覧ください。〜PrometheusにGrafanaを添えて〜Tweet関連記事2019-12-16ElixirライブラリのFlowを使ってAPIを優しく呼び出すこんにちは。SPEEDA開発チームの上村です。先日同僚が書いたEl...2019-10-15ペアプロと育休の取得しやすさの関係についてこんにちは。SPEEDA開発チームの鈴木です。deploymentを実現するこんにちは、SPEEDAのSREチームの阿南です。「SRE大全:ユーザベース編」で話をしてきました。»プロフィール『経済情報で、世界を変える』をミッションに、企業・業界情報プラットフォーム「SPEEDA」やソーシャル経済ニュース「NewsPicks」、ABMを強力にサポートする「FORCAS」、スタートアップの情報収集を圧倒的効率化「entrepedia」などを提供する株式会社ユーザベースの技術チームブログです。多国通貨」をハンズオンしたら快適で楽しかったGo言語でオブジェクト指向プログラミングの基本(型編)月別アーカイブ検索@Uzabase_Techさんのツイートスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。