コンテナ運用に関する7つのベストプラクティス
Google Cloud Blogに、Kubernetes上でコンテナを運用に関するベストプラクティスを紹介する記事がポストされました。運用を容易にするためにアプリケーションの設計をどうすべきかが、わかりやすく書いてある良い記事でしたので簡単に紹介します。英語が得意でない方も、短い記事ですのでぜひ元記事をご参照ください*1。
Google Kubernetes Engine上でコンテナを運用することを前提にしてある記述もありますが、Amazon EKSといった別サービスや、オンプレに自ら構築して運用する際にも参考になると思います。
1. Use the native logging mechanisms of containers
コンテナ化されたアプリケーションのログの収集については見解が分かれるところであり、DockerやKubernetes導入時に悩むポイントの一つでもあります。この記事では、
Write your logs to stdout and stderr and they will be shipped, stored and indexed automatically for you.
アプリケーションログを標準出力に吐いて、Stackdriver Loggingなどの、Kubernetesに統合されたロギングメカニズムを利用することを推奨しています。
2. Ensure that your containers are stateless and immutable
コンテナ化することを前提にアプリケーションを設計する際に、statelessかつimmutableにすることを推奨しています。途中でアプリケーションコンテナが落ちて、別のノードで起動しても問題なく動くよう設計する必要があります。
初心者が陥りがちな問題の一つに、実際に動くノードを意識したコンテナのイメージを作ってしまい、結果的にノードごとに異なるイメージを用意することになることがあります。そういった問題を解くためには、SecretsやConfigMapなどを利用して設定情報の管理は外部に任せましょう。
3. Avoid privileged containers
コンテナに特権を与えない。コンテナ化することで限定的とはいえisorationされているのですから、それを自ら壊すような真似はやめましょう。
4. Avoid running as root
コンテナ内で実行するアプリケーションをrootとして実行することは避けましょう。アプリケーションが未知の脆弱性を突いてコンテナから抜け、ホストのrootとして実行される可能性があります。
5. Make your application easy to monitor
ロギングと同様にアプリケーション監視もシステム運用をする上で欠かせない要素の一つです。Kubernetesクラスタの監視でよく利用されるものの一つにPrometheusがあります。アプリケーションを独自ロジックで監視するためには、Prometheusにmetricsを渡すためのエンドポイントが必要になるので、予め監視も意識した設計をしましょう。
6. Expose the health of your application
Kubernetesには、アプリケーションが正常に動作しているか確認するために、Liveness and Readiness probesという方法があります。
これらを利用するためには、監視同様エンドポイントが必要になります。
7. Carefully choose the image version
コンテナイメージのタグは慎重に選択しましょう。もしlatestを選択してしまうと、pullするたびに異なるイメージを利用するという問題にあたる可能性があります。
*1:本ブログでは、元記事の翻訳ではなく、筆者独自の見解が追加されているため、鵜呑みにせず原文にあたることをおすすめします。