からちゃん日記

日々勉強しているIT技術、英会話で学んだ英語に関するまとめ、趣味のトライアスロンやその他の日常に関して書いていきます。

初心者からのKubernetes入門と基本機能の動作例

1.コンテナとオーケストレーションツール

  • コンテナはそれ単体では単なるプロセスであり、実際にコンテナとしてアプリケーションを動かすには複数のコンテナを協調させて動かす必要がある(WebサーバーコンテナやDBサーバーコンテナなど)。
  • 特に大規模や企業の商用サーバー用途では以下の考慮点が必要。
    – 分散環境での複数のコンテナのデプロイ・管理
    – 資源配置の最適化(各サーバーのCPUやメモリ等のリソース状況を考慮してどのサーバーにコンテナをデプロイするかなど)
    – 負荷分散、冗⻑化、負荷増加時のスケール
    – コンテナの監視
    – アップデート(コンテナのバージョンアップなど)
  • それらを引き受け、コンテナ化されたアプリケーションのデプロイや管理を自動化するのがオーケストレーションツール。

f:id:kojikara:20180527193716p:plain

 

2.Kubernetesとは

3.Kubernetesのアーキテクチャ

3-1.Kubernetesクラスタ
  • 多数のマシンで構成されるスケールアウト型のアーキテクチャを前提としており、各ノード(物理サーバーやVMの上で動く仮想サーバーなど)の集合を「クラスタ」という単位でグループ化する。
  • ノードは以下の種別に分類される。
    -Master node: クラスタ全体の管理を担う
    -Worker node: Masterから指示を受けてアプリケーションのコンテナを実行

f:id:kojikara:20180527200538p:plain

3-2.Master nodeとWorker nodeの構成要素
  • 以下がMaster nodeとWorker node上の主要な構成要素。
  • Worker node上のPodに関しては以降で別途説明。

f:id:kojikara:20180527200737p:plain

Master nodeとWorker nodeの構成要素
 
Master nodeとWorker nodeの構成要素(コンポーネント)一覧

f:id:kojikara:20180527200748p:plain

3-3.Pod
  • Kubernetesでは、1個以上のコンテナを包含する「Pod」という単位でデプロイを行います。
  • Podには以下の特徴があります。
    –1つ以上のコンテナを包含する
    –Pod内の全コンテナが同一のNodeにデプロイされることが保証される
    –仮想IPを共有する
    localhostでコンテナ間が通信できる
    –ボリュームを共有できる
    –スケールアウトはPod単位で行われる(個々のコンテナ単位ではない)
  • どういう場合に複数コンテナを1つのPodに集約するのか
    –コンテナ同士が密接に連携する
    –同時にスケールさせたい
    -例)
     ・Webサーバーコンテナとそれを監視するコンテナなど。
     ・スケールのさせ方が違うWebサーバー(スケールウト)とDBサーバー(スケールアップ)を集約させるのはアンチパターン

f:id:kojikara:20180528003022p:plain

4.クラスタへのデプロイの流れ

  • Kubernetesクラスタへのアプリケーションデプロイ手順は以下のようになります。

f:id:kojikara:20180528003329p:plain

  1. Masterに対してデプロイすべきコンテナのイメージや個数などの情報を指示する(YAML, JSON
  2. Masterは指示された構成情報をetcdに永続化する
  3. Masterは情報に基づいて、コンテナをデプロイすべきNodeを決定する
  4. MasterはNodeに対してコンテナの実行を指示する
  5. Nodeは必要に応じて指定されたコンテナイメージをpullしたうえで実行する
  • デプロイ指示(YAML)例
    kubectl apply -f healthcheck.yml

f:id:kojikara:20180528003741p:plain

5.Kubernetsの主要機能

5-1-1.ReplicaSet
  • 冗長性や負荷分散を考慮し同じPodを複数デプロイしたい場合、1つ1つPodをデプロイすることも可能だが、ReplicaSetを使用することで複数のPodをまとめてデプロイすることが可能。
  • ReplicaSetは指定されたイメージ・個数のPodを自動で作成してくれる仕組み。
  • ReplicaSetは条件に従ってPodを検索し、稼働しているPodの数がreplicasと一致しているかどうかをチェック。
  • repilcasよりも少ない場合は新規にPod追加し、多いときは余剰分のPodを停止する。

f:id:kojikara:20180528003915p:plain

 

f:id:kojikara:20180528004000p:plain

  1. ReplicaSetを指定
  2. 作成したPod数を指定
  3. 作成するコンテナイメージを指定
5-1-2.ReplicaSetによるオートヒーリング時の動作例

f:id:kojikara:20180528004310p:plain

  1. YAMLからReplicaSetを作成(spec.replicas:2で作成)
  2. ReplicaSetのステータス
  3. ReplicaSet内のPodのステータス
  4. Podを1つ削除
  5. Podが1つ削除され、新たに別のPodが起動
    ※オートヒーリングによって起動されるPodは、障害などによって停止したPodの状態を引き継ぐわけではない。
    ※オートヒーリングによる回復はあくまで「指定されたコンテナイメージを利用してPodを再度起動する」機能。
5-2.Liveness ProbeによるPodのヘルスチェック
  • オートヒーリングではPodが稼働しているかどうかは、単純にPod内のコンテナのプロセスが稼働しているかどうかで判断。
  • Liveness ProbeではPodの定義に対して次のヘルスチェックを追加ですることで、サービスレベルのPodの監視が可能となる。
    –HTTP GET : 指定されたURLにHTTP GETを発行し、レスポンスが正常であることを確認
    TCP Socket : 指定されたポートに接続し、TCP接続が確立できることを確認
    –Exec : 指定されたコマンドをコンテナ内で実行し、ステータスコードが0であることを確認

f:id:kojikara:20180528004434p:plain

5-3-1.Service
  • Podは実際にデプロイされるまでIPアドレスはわからないし、オートヒーリング等で作り直された際はIPアドレスも変化するため、固定のアクセス先を決めることができない。
  • Serviceは複数のPodで構成されるサービスを代表し、外部からのアクセスを可能とする。
  • Serviceを作成することで、IPアドレスを意識することなく各Podにアクセス可能となる。
  • Serviceの要素は次の通り。
    –ClusterIP: スタティックなIPアドレスクラスタ内IP)
    –port : Pod側ポート番号
    –targetPort : 外部公開ポート
    –selector : サービスを構成するPodを特定するラベル

f:id:kojikara:20180528005230p:plain

5-3-2.Serviceによる外部からのアクセス例

f:id:kojikara:20180528005536p:plain

  1. worker nodeのIP
  2. Podと外部公開ポート
5-4.Readiness ProbeによるPodのヘルスチェック
  • Readiness Probeは、Podの定義に対して以下のヘルスチェックを追加することで、Podの初期化処理が完了しサービスに応答できる状態になるまではService経由でのPodの公開を抑制できる。
    –HTTP GET : 指定されたURLにHTTP GETを発行し、レスポンスが正常であることを確認
    TCP Socket : 指定されたポートに接続し、TCP接続が確立できることを確認
    –Exec : 指定されたコマンドをコンテナ内で実行し、ステータスコードが0であることを確認

f:id:kojikara:20180528005641p:plain

5-5-1.Deployment
  • Deploymentはアプリケーションの新しいバージョンのリリースを管理する仕組みで、アプリケーションのアップデートやロールバックを宣言的に行うことを可能とする。
  • Deploymentはその配下にReplicaSetをもち、ReplicaSet単位のバージョンを管理する。
  • アップデートやロールバックのさせ方(strategy)は以下の2種類を設定可能。

<RollingUpdate(デフォルト)>

f:id:kojikara:20180528005907p:plain

  • Podを順次停止しアップデートしていく。
  • Recreateよりも動作は遅いが、ユーザートラフィックを受けながらサービスのバージョンアップが可能。
  • maxSurge:
  • アップデート実行中に指定されたscaleよりも余分に起動して良いPod数を絶対値もしくは%で指定。
  • maxUnavailable :
  • アップデート実行中に指定されたscaleを割り込んでも良いPod数を絶対値もしくは%で指定。

<Recreate>

f:id:kojikara:20180528010001p:plain

  • アップデート前に旧バージョンのPodを全て停止してから新バージョンのPodを起動する。
  • バージョン混在は回避できるが、ユーザーからみるとサービス停止が発生する。

f:id:kojikara:20180528010051p:plain

  1. Deploymentを指定(ReplicaSetは指定不要。自動で作成される)
  2. Deploymentの種類を指定(ROllingUpdateがデフォルト)
  3. コンテナのテンプレートが変更になるとアップデートされる
5-5-2.Deploymentによるローリングアップデート時の動作例

f:id:kojikara:20180528010208p:plain

  1. YAMLからDeploymentを作成
  2. Deploymentのステータス
  3. ReplicaSetのステータス確認
  4. Deployment定義の対象コンテナイメージを変更
  5. ロールアウトのステータス確認
  6. Deploymentのステータス確認
  7. ReplicaSetのステータス確認

6.参考文献

・IBM Cloud Docs