MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

初心者のためのコンテナオーケストレーションツールKubernetes入門


しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

目次

はじめに

Dockerなどのコンテナシステムを管理するシステムとして、

myenigma.hatenablog.com

コンテナオーケストレーションシステムがあります。

 

このコンテナオーケストレーションツールの中で、

ほぼデファクトスタンダードなのが、Kubernetesです。

kubernetes.io

ja.wikipedia.org

  

今回の記事では、こちらの書籍を元に

自分が、k8sについて学んだ内容をまとめておきたいと思います。


しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

 

Kubernetesとは?

Kubernetesは、Dockerなどの複数のコンテナアプリケーション

で構成されるアプリケーションを、安定して運用するための

コンテナ管理(コンテナオーケストレーション)システムです

 

開発の当初はGoogleによって開発されていましたが、

現在はOSSとして、Cloud Native Computing Foundationが開発しています。

www.cncf.io

 

Kubernetesは名前が長いので、k8sと表記されることも多いようです。

 

Kubernetesによる専門用語

Kubernetestsにはいくつか専門的な用語があります。

Pod

Podはいくつかのコンテナを複数ひとまとめにしたものです。

基本的にk8sでは、Pod単位で起動や停止を実施します。

Podには下記のようなルールがあります。

  • 必ず一つ以上のコンテナが含まる

  • Podの中のコンテナは必ず同じNodeに配置される

  • アプリケーションをスケールアウトするときはPod単位で実施される

  • Pod内のコンテナーはネットワークとストレージを共有する

 

Node

複数のPodを管理する、物理サーバやVMのことです。

負荷分散の場合に、Podだけでなく、

このNodeそのものも自動的に生成されたり、削除されたりします。

 

Cluster

一つのk8sシステムが管理する、

複数のNodeをまとめた全体のシステムのことを、

k8s クラスタと呼びます。

 

大規模なシステムでは、

複数のk8sクラスタを強調させて、

一つのサービスを運営する場合もあるようです。

 

Kubernetesの基本機能

kubernetesの主な機能は次のとおりです。

 

複数の物理サーバやVMでのコンテナ管理

どのサーバにどのコンテナが起動しているのかを管理してくれます。

 

また、Podの様々なメトリクスをAPI経由で、

3rd partyのシステムに提供することもできます。

 

コンテナのデプロイ

コンテナをどのノード(VM)のデプロイするかは、

ユーザが決めるのではなく、k8sが自動的に決めてくれます。

 

例えば、k8sでは、

あらかじめPodに含まれるコンテナーアプリケーションが

どのくらいのCPUやメモリを使うアプリケーションなのかを、

クラスターに宣言することができます。

これをResource Requestsと呼びます。

kubernetes.io

 

このResource Requestsの値を使って、

k8sは、PodをNodeにスケジューリングします。

例えば、あるPodのCPUやメモリを

マニフェストというファイルに定義すると、

クラスターがPodをスケジューリングするときに、

指定したリソースが確保できるNodeを探してデプロイしてくれます。

 

リリース以外にも、様々な優先度を設定することで、

ある程度意図したようにコンテナをデプロイすることが可能です。

 

コンテナ間のネットワーク管理

コンテナ間の通信も、サービスディスカバリーが

どのノードにどのサービスが動いているかを管理し、

それぞれのノードはその情報を元に互いに通信します。

したがって、ネットワークに関しても、

k8sが自動的に管理してくれます。

 

コンテナの負荷分散

あるサービスの負荷が高い時に、

同じサービスを提供する

別のコンテナに処理を自動的に分散してくれます。

 

また、既存のコンテナで処理が追いつかないと判断された場合は、

自動的に新しいコンテナを作成したり、

逆に負荷が下がった場合は、不要なコンテナを削除してくれます。

 

具体的には、HorizontalPodAutoscalerを使うことができます。

kubernetes.io

 

コンテナの監視と自動復旧

k8sは、自動的にコンテナを監視し、

問題がある場合はコンテナを自動復旧することができます。

 

まず、Kubernetesでは、

Liveness Probeという機能で、Pod内のコンテナの死活監視をしています。

kubernetes.io

 

このLiveness Probeは「アプリケーションが応答するかどうか」をチェックする機能です。

LivenessProbeはPodのマニフェストファイルに条件を追加することで、利用できます。

LivenessProbeでは、次の3種類の方法でPodの監視を実施します。

    1. HTTPリクエストの戻り値をチェックする
    1. TCPSocketで接続できるかチェックする
    1. コマンドの実行結果をチェックする

 

k8sでは、このLiveness Probeが、

Podの問題を検知すると、自動的にPodを再起動させることができます。

これはReplica Setという機能を使うことができます。

kubernetes.io

ReplicaSetはPodの数を自動的に固定し、

個数が少ない場合は、増やし、多い場合は削除します。

 

また、この機能はPodの再起動が一度で成功しない場合は、

何度も再起動させようとしますが、

一定間隔で再起動を繰り返すのではなく、

Exponential Backoffというアルゴリズムに基づいて再起動をします。

これは、指数関数的に処理のリトライ間隔を増大させるアルゴリズムです。

 

コンテナのアップデート

k8sでは、様々な方法でコンテナのアップデートを実行する機能があります。

 

ソフトウェアのアップデートの方法としては下記があります。

  1. 再構成アップデート: 一旦すべての古いアプリをとめて、あたらしいアプリを起動する方法。シンプルだがダウンタイムが発生する

  2. ローリングアップデート: 複数のコンテナを、少しずつアップデートする方法

  3. ブルー・グリーンデプロイメント: 古いアプリ(ブルー)と新しいアプリ(グリーン)を、別々のVM上で同時に動かし、ネットワークを切り替えることで、アプリを同時に変更する方法。グリーンになにか問題があったときでも、すぐに古いアプリに戻ることができるのが特徴

  4. カナリヤリリース: 一部の利用者のみに新機能を提供し、問題ないことを確認してから、全ユーザにリリースする方法

k8sでは設定により、上記のそれぞれの方法で、

アップデートを実施することが可能です。

 

加えて、

アップデート時の、Podの起動数の最低保証から、

アップデート時の計算リソースの最大増加量まで制御できます。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com


しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com