Kubernetesとは
Kubernetesは、K8sとして略されることが多く、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。コンテナは軽量で独立した実行可能なソフトウェアパッケージであり、アプリケーションを実行するために必要な全てのもの(コード、ランタイム、ライブラリ、システムツール)が含まれています。Kubernetesは、これらのコンテナをクラスター全体で効率的に管理するのに役立ちます。
現代のソフトウェア開発では、アプリケーションの迅速なデプロイ、スケーリング、管理が求められます。これにより、マイクロサービスというデザインパターンが台頭しました。マイクロサービスでは、アプリケーションが相互に通信する小さな独立したモジュールで構成されます。
コンテナはマイクロサービスに理想的であり、異なるサービスを実行するための独立した環境を提供します。しかし、大規模なコンテナの管理は複雑な作業です。ここでKubernetesが重要な役割を果たします。
Kubernetesは、複数のサーバー上で数千のコンテナを簡単に管理するプラットフォームを提供することで、現代のDevOpsにおいて不可欠なツールとなり、アプリケーションやサービスの提供において企業がより俊敏で柔軟、効率的になることを可能にしました。
Kubernetesの特徴
Kubernetesには、コンテナ化されたアプリケーションの管理、オーケストレーション、デプロイ、スケーリングを可能にする豊富な機能があります。
-
スケーラビリティ
Kubernetesの主な利点の一つは、アプリケーションの動的なスケーリングが可能であることです。Horizontal Pod Autoscalerを使用することで、観測されたCPU利用率やその他の選択したメトリクスに基づいて、デプロイメントやレプリカセット内のPodの数を自動的にスケールすることができます。 -
高可用性
Kubernetesは、アプリケーションが常に利用可能であり、ダウンタイムが発生しないようにします。Kubernetesは、常に必要な数のアプリケーションインスタンスが実行されていることを確認します。コンテナが停止した場合、Kubernetesは自動的に新しいコンテナを作成します。 -
ロードバランシング
Kubernetesは、実行中の全てのコンテナに対してトラフィックを分散します。これにより、負荷を均等に分散し、個々のコンテナがボトルネックになることを防ぎます。 -
ストレージオーケストレーション
Kubernetesでは、ローカルストレージ、パブリッククラウドプロバイダー、ネットワークストレージシステムなど、選択したストレージシステムを自動的にマウントすることができます。これは、データを保存する必要がある状態を持つアプリケーションにとって重要です。 -
自動デプロイとロールバック
Kubernetesは、デプロイされたコンテナの望ましい状態を記述し、実際の状態を望ましい状態に制御された速度で変更することができます。例えば、Kubernetesを自動化してデプロイのための新しいコンテナを作成したり、既存のコンテナを削除したり、新しいコンテナにリソースを移行したりすることができます。 -
シークレットと設定の管理
パスワード、OAuthトークン、SSHキーなどの機密情報の管理はデリケートなプロセスです。Kubernetesは、シークレットを使用して機密情報を保存および管理するメカニズムを提供します。また、ConfigMapを使用すると、環境固有の設定をコンテナイメージから分離することができます。これにより、アプリケーションの移植性が向上します。 -
自己修復
Kubernetesは、コンテナが期待どおりに応答しない場合に検出し、これらのコンテナを新しいノード上に自動的に置き換えて再スケジュールする能力を持っています。また、ユーザー定義のヘルスチェックに応答しないコンテナを終了することもできます。 -
サービスディスカバリ
コンテナが頻繁に作成および削除される動的な環境では、異なるサービスを追跡することが課題となります。Kubernetesには、コンテナ同士が互いを認識し、安全に通信するための組込みのサービスディスカバリ機能があります。
Dockerとの比較
一見すると、KubernetesとDockerは、どちらもコンテナのデプロイに関連しているため、類似しているように見えます。しかし、それぞれが異なる目的を持っています。
Dockerは、コンテナ化というオペレーティングシステムレベルの仮想化の自動化に重点を置いています。Dockerは、アプリケーションとその依存関係を1つの単位であるコンテナにまとめることに主眼を置いています。
一方、Kubernetesはコンテナのオーケストレーションプラットフォームです。Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理の自動化に使用されます。
Kubernetesの基本的な概念
Kubernetesはクライアント-サーバーアーキテクチャを採用しています。Kubernetes環境は、コントロールプレーン(またはマスター)、クラスターの状態を一貫させるための分散ストレージシステム(etcd)、およびノードまたはワーカーマシンのセットで構成されます。
Understanding Kubernetes Architecture
コントロールプレーン
コントロールプレーンは、クラスターの管理を担当します。全てのKubernetesオブジェクトの記録を維持し、クラスターの状態を定期的に確認し、さまざまなオブジェクトで定義された望ましい状態が実際の状態と一致するようにします。コントロールプレーンには次のコンポーネントが含まれます。
-
Kube-apiserver
このコンポーネントは、Kubernetes APIをJSON over HTTPで提供します。Kubernetesの内部および外部のインターフェースを提供します。 -
Etcd
クラスターデータを保存する高可用性のキーバリューストアであり、全てのクラスターデータのバックエンドストアとしてKubernetesで使用されます。 -
Kube-scheduler
このコンポーネントは、割り当てられていないノードで新しく作成されたPodを監視し、リソース要件、ハードウェア制約などのさまざまな要素に基づいて実行するノードを選択します。 -
Kube-controller-manager
このコンポーネントは、クラスターの状態の変化に応答するコントロールループを実行するコントローラーを実行します。 -
Cloud-controller-manager
このコンポーネントを使用すると、クラスターをクラウドプロバイダーのAPIにリンクすることができます。これにより、クラウドプラットフォームとの相互作用をクラスターと分離することができます。
ノード
ノードは、コンテナがデプロイされるワーカーマシンです。各ノードには、Podを実行するために必要なサービスが含まれており、マスターコンポーネントによって管理されます。ノード上のサービスには次のものがあります。
-
Kubelet
クラスター内の各ノードで実行されるエージェントであり、Pod内でコンテナが実行されていることを確認します。 -
Kube-proxy
これは、クラスター内の各ノードで実行されるネットワークプロキシであり、ネットワークルールを維持し、クラスター内外のネットワークセッションからのPodへの通信を可能にします。 -
コンテナランタイム
これはコンテナを実行するために使用されるソフトウェアであり、KubernetesはDocker、containerd、CRI-O、およびKubernetes CRI(Container Runtime Interface)の実装など、複数のランタイムをサポートしています。
Pod
Kubernetesでは、最小単位としてPodが使用されます。Podはクラスター内の実行中のプロセスの単一のインスタンスを表します。各Podは、ネットワークおよびストレージリソースを共有する独立したコンテナ環境です。
Podには単一のコンテナまたは複数のコンテナを含めることができます。同じPod内のコンテナは同じIPアドレスを共有し、localhost
を介して相互に通信することができます。また、データ共有や通信のためにボリュームを共有することもできます。
Service
Podは作成および削除される場合がありますが、Serviceはワークロードに接続するための安定したインタフェースです。KubernetesのServiceは、一連のPodで実行されるアプリケーションをネットワークサービスとして公開するための抽象化です。Kubernetesでは、アプリケーションを不慣れなサービスディスカバリメカニズムを使用するために変更する必要はありません。KubernetesはPodにIPアドレスと一つのDNS名を与え、それらに負荷分散を行うことができます。
Serviceのタイプには次のものがあります。
-
ClusterIP
クラスター内部のIP上でServiceを公開し、クラスター内からのみアクセスできるようにします。 -
NodePort
各ノードのIPでServiceを公開し、静的ポートでアクセスできるようにします。 -
LoadBalancer
クラウドプロバイダーのロードバランサーを使用してServiceを外部に公開します。 -
ExternalName
ServiceをexternalName
フィールドの内容(例:foo.bar.example.com
)にマップします。
ラベルとセレクター
ラベルは、PodやServiceなどのKubernetesオブジェクトに付けられるキー/値ペアであり、ユーザーが定義した属性に基づいてそれらを組織化するために使用されます。セレクターは、ラベルと組み合わせて、ラベルに基づいてオブジェクトのサブセットを選択するために使用されます。例えば、データベースを表すPodにapp=database
というラベルを付け、app=database
というセレクターを使用してServiceに対してこれらのPodをターゲットにすることができます。
レプリケーションコントローラとレプリカセット
レプリケーションコントローラとレプリカセットは、常に指定された数のPodのレプリカが実行されていることを確保します。これにより、高可用性を確保するだけでなく、実行中のPodの数を調整してアプリケーションのスケーリングを行うことができます。
デプロイメント
デプロイメントは、ReplicaSetを管理し、Podへの宣言的な更新を提供するなど、より高レベルの概念です。これにより、アプリケーションを逐次的に更新し、ダウンタイムなしで常に利用可能な状態を維持することができます。
ネームスペース
ネームスペースは、物理的なKubernetesクラスター内の仮想クラスターです。ネームスペースを使用すると、異なるプロジェクトやユーザーグループ間でリソースを分離することができます。例えば、同じ物理クラスターを使用しながら、異なるネームスペース内で作業する複数のチームを確保し、彼らが互いに干渉しないようにすることができます。
ConfigMapsとSecrets
ConfigMapsは、設定アーティファクトをイメージの内容から分離して、コンテナ化されたアプリケーションを移植可能にするために使用されます。ConfigMapsは、Podが消費できるキー/値ペアの形式で構成データを格納するために使用されます。
SecretsはConfigMapsと似ていますが、パスワード、OAuthトークン、SSHキーなどの機密情報を格納するために使用されます。Secretsを使用して機密情報を保存する方が、Podの定義やコンテナイメージに直接配置するよりもセキュリティ上のリスクを軽減できます。
ボリューム
Kubernetesでは、ボリュームはPod内のコンテナからアクセスできるディレクトリを表します。コンテナのファイルシステムとは異なり、ボリュームはコンテナの再起動に対して強力です。Kubernetesでは、次のようなさまざまなボリュームタイプをサポートしています:
-
emptyDir
永続的でないデータの保存に使用されるシンプルな空のディレクトリです。 -
hostPath
ホストノードのファイルシステムからディレクトリをマウントするために使用されます。 -
nfs
既存のNFS(Network File System)共有をPodにマウントするために使用されます。 -
persistentVolumeClaim
永続ボリュームをPodにマウントするために使用されます。
永続ボリュームと永続ボリュームクレーム
永続ボリューム(PV)は、Podのライフサイクルに依存しないストレージリソースの使用方法を提供します。これにより、データがPodの寿命を超えて永続化されます。永続ボリュームクレーム(PVC)は、ユーザーがストレージリソースを要求するためのリクエストです。PVCを使用することで、特定のサイズ、アクセスモード、およびその他のストレージリソースの属性を要求することができます。
Ingress
Ingressは、クラスター内のServiceに対してクラスター外部からのHTTPおよびHTTPSのルートを公開します。負荷分散、SSL終端、ホストベースまたはパスベースのルーティングなどの機能を提供することができます。Ingressオブジェクトを使用するためには、NginxやTraefikなどのIngressコントローラーが必要です。
リソースクォータとリミットレンジ
リソースクォータは、ネームスペースごとにリソースの消費量を制限する制約を提供します。ネームスペース内で作成できるオブジェクトの数を制限したり、そのネームスペース内のリソースが消費できる合計計算リソース量を制限したりするために使用できます。
リミットレンジは、単一のエンティティ(Pod、コンテナ、PVCなど)が消費できるリソース量の最小値と最大値を設定するために使用されます。
参考