Kubernetes とは何ですか?Kubernetes は、サーバー上のコンテナ化されたアプリケーションの管理を容易にするために設計された、Google のオープンソースの分散コンテナ管理プラットフォームです。 KubernetesはK8Sと略されます。なぜそう呼ばれるのでしょうか?KとSはKubernetesの最初と最後の文字であり、KとSの間には8つの文字があるため、K8Sと略されます。また、Kubernetesは少し複雑なため、K8Sという略称が一般的に使用されています。 Kubernetesは、コンテナオーケストレーションツールであると同時に、コンテナ技術を基盤とした全く新しい分散アーキテクチャソリューションです。Dockerをベースとし、アプリケーションの作成、アプリケーションのデプロイ、サービスのプロビジョニング、動的なスケーリング、アプリケーションのアップデートといった一連のサービスを提供することで、コンテナクラスタ管理の利便性を向上させます。 Kubernetesの出現の理由下の画像をご覧ください。MySQL、Redis、Tomcat、Nginxなどの設定情報が含まれています。ここにデータをインストールするには、それぞれ手動で一つずつインストールする必要があります。ただし、一つしかないので、それも可能のようです。少し面倒ですが、処理が遅くなることはありません。 しかし、技術の進歩とビジネスニーズの高まりにより、単一のサーバーではもはや日常的な要件を満たすことができなくなりました。ますます多くの企業がクラスター環境やマルチコンテナのデプロイメントを求めています。もし現状のまま、マシンを一つずつ個別にデプロイしていたら、運用チームはマシンのデプロイに一日中費やし、大変なことになります。場合によっては、あるステップでたった一つのエラーが発生するだけで最初からやり直さなければならなくなり、非常にフラストレーションがたまることになります…下の図をご覧ください。 次のマシンにデプロイする場合:
一つ一つデプロイしていくのは非常に面倒で、終わりのない作業になるでしょう。もしAlibabaのマシンが2万台あったら、その場でスタッフを辞めさせなければならないでしょうか?Kubernetesは、まさにこうした状況の解決に役立ちます。Kubernetesはコンテナ管理とアプリケーションのデプロイをより便利にし、反復作業を削減し、アプリケーションのデプロイの自動化と障害の自己修復を可能にします。 さらに、Kubernetes (K8S) がマイクロサービスに対して優れたサポートを提供し、システム負荷の変化に応じてマイクロサービスのレプリカを調整できる場合、K8S 固有の弾性スケーリング メカニズムにより、突然のトラフィックの急増にも効果的に対応できます。 コンテナオーケストレーションツールの比較Docker-Compose Docker-Composeはコンテナを管理するために使用され、コンテナマネージャーに似ています。起動する必要があるコンテナやアプリケーションが多数ある場合、手動で管理するのは非常に時間がかかります。Docker-Composeを使用すると、単一の設定ファイルですべてを処理できます。ただし、Docker-Composeは現在のホストマシン上のDockerコンテナのみを管理でき、他のサーバー上のサービスを管理することはできません。つまり、単一マシン環境です。 Dockerスウォーム Docker Inc. が開発した Docker Swarm は、クラスター上の Docker コンテナを管理するためのツールです。Docker-Compose のシングルノードアーキテクチャの限界を克服しています。Docker Swarm は、コンテナの起動、ステータスの監視、コンテナサービスがクラッシュした場合の新規コンテナの再起動を支援し、サービスの継続的な提供を保証します。また、サービス間の負荷分散もサポートしています。これらは Docker-Compose ではサポートされていない機能です。 Kubernetes KubernetesはDocker Swarmと同じ役割を果たしており、コンテナ分野において同様の役割を担っています。しかし、両者にはいくつかの違いもあります。KubernetesはGoogle独自の製品であり、豊富な実用経験とホストマシンでのテストを経て、非常に成熟しています。そのため、Kubernetesはコンテナオーケストレーション分野のリーダーになりつつあります。Kubernetesの設定柔軟性、信頼性、そして幅広いコミュニティサポートはDocker Swarmを凌駕しています。Googleのオープンソースプロジェクトとして、Google Cloud Platform全体と連携して動作します。 Kubernetesの責任
K8Sの基本概念下の図は、3台のホストマシンを含むKubernetes (K8S) クラスターを示しています。各四角形は物理仮想マシンを表しています。これら3台の物理マシンが完全なクラスターを構成しており、役割に基づいて2つのタイプに分類できます。
ポッド
もっと分かりやすい例えで言うと、ポッドを豆の鞘、コンテナをその中の豆と考えることができます。これは共生関係です。
ポッドの中には一体何が入っているのでしょうか?
Pod 内のコンテナの具体的な展開方法は、プロジェクトの特性とリソースの割り当てに基づいて適切な選択を行うことで決定されます。 一時停止コンテナ:Pauseコンテナ(インフラストラクチャコンテナとも呼ばれる)は、initポッドとして機能する基本コンテナです。他のポッドはPauseコンテナからフォークされ、どのポッドにも不可欠です。ポッド内のアプリケーションコンテナは同じリソースを共有します。
上の図では、pauseコンテナがない場合、NginxとGhost、そしてPod内のコンテナは、それぞれ独自のIPアドレスとポート番号を使用して通信する必要がありました。pauseコンテナを使用すると、Pod全体をひとまとまりのものとして見ることができるため、NginxとGhostはlocalhostを使用して直接相互にアクセスできます。両者の違いはポート番号のみです。これは一見単純なように見えますが、実際には多くの低レベルのネットワーク技術が使用されています。興味のある方は、ご自身で詳細をご確認ください。 サービスKubernetesでは、各Podに固有のIPアドレスが割り当てられますが、Pod同士が直接やり取りすることはできません。ネットワーク通信には、Serviceという別のコンポーネントが必要です。 サービスとはサービスを意味します。Kubernetesにおけるサービスの主な機能は、複数の異なるホスト上のポッドを接続し、それらが相互に通信できるようにすることです。 サービスはドメイン名と考えることができますが、同じサービスを持つPodのクラスターはそれぞれ異なるIPアドレスを持ちます。サービスはラベルセレクターを使用して定義されます。
NodePort を使用して外部アクセスを提供するには、各ノード上のホストの実際のポートを開くだけで済み、ノードのクライアントを介して内部サービスにアクセスできるようになります。 ラベルラベルは通常、キーと値のペアの形式で様々なオブジェクトに付与されます。ラベルは説明的なタグであり、非常に重要な役割を果たします。コンテナをデプロイする際には、ラベルに基づいて操作対象のPodを検索・絞り込む必要があります。ラベルは各Podのエイリアスと考えることができます。ラベルに名前を付けることでのみ、Kubernetesマスターノードは対応するPodを見つけて操作を実行できます。 レプリケーションコントローラ
K8S 全体アーキテクチャ
ユーザーがKubectl経由でReplicationControllerの作成リクエストを送信します。このリクエストはAPIサーバー経由でetcdに書き込まれます。APIサーバーをリッスンしているControllerManagerは作成リクエストを検出し、慎重な分析の結果、現在のクラスター内に対応するPodインスタンスが存在しないことを検出します。その後、ControllerManagerはReplicationControllerテンプレート定義に基づいてPodオブジェクトを迅速に作成し、APIサーバー経由でetcdに書き込みます。 スケジューラがこれを検出すると、すぐに複雑なスケジューリングプロセスを実行し、新しいポッドに適したノードを選択します。少なくとも、これでポッドにはアイデンティティが与えられました!これはかなり面倒です。そして、その結果をAPIサーバー経由でetcdに書き込みます。その後、ノード上で実行されているKubeletプロセスがAPIサーバー経由でこの生まれたばかりの赤ちゃん、つまり「ポッド」を検出し、その特性に応じて起動し、ポッドの寿命が尽きるまでその寿命を懸命に管理します。 次に、Kubectlを使用して、このPodにマッピングされた新しいService作成リクエストを送信します。ControllerManagerは、ラベルを介して関連付けられたPodインスタンスを照会し、Serviceのエンドポイント情報を生成して、APIサーバーを介してetcdに書き込みます。次に、すべてのノードで実行されているProxyプロセスは、APIサーバーを介してServiceオブジェクトと対応するエンドポイント情報を照会およびリッスンし、ServiceからバックエンドPodへのアクセスのためのトラフィック転送機能を実現するためのソフトウェアロードバランサーを構築します。 kube-proxy: マルチホスト通信の仲介役として機能するプロキシです。前述の通り、Serviceはホスト間およびコンテナ間のネットワーク通信を実装しており、技術的にはkube-proxyによって実現されます。ServiceはPodを論理的にグループ化し、その基盤となる通信はkube-proxyによって処理されます。 kubelet: Kubernetesコマンドの実行に使用され、Kubernetesのコアコマンドでもあります。Kubernetes関連の命令を実行し、現在のNode上のPodのライフサイクル管理(作成、変更、監視、削除など)を担います。また、Kubeletは現在のNodeのステータス情報を定期的にAPIサーバーに報告します。 etcd: クラスター内のすべてのリソースオブジェクトの永続的なストレージとして使用されます。APIサーバーは、etcdの操作をカプセル化するAPIを提供します。これらのAPIは、主にリソースオブジェクトの操作とリソースの変更の監視のためのインターフェースです。 APIサーバー:リソースオブジェクトを操作するためのエントリポイントを提供します。他のコンポーネントは、APIサーバーが提供するAPIを介してリソースデータを操作する必要があります。関連するリソースデータに対して「フルクエリ」と「変更監視」を実行することで、関連するビジネス機能をリアルタイムで完了できます。 スケジューラ: スケジューラは、クラスター ノード間でのポッドのスケジュールと割り当てを担当します。 コントローラーマネージャー:クラスターの内部管理および制御センターであり、Kubernetesクラスター内の障害検出と復旧の自動化を主に担います。例えば、ポッドの複製と削除、エンドポイントオブジェクトの作成と更新、ノードの検出、管理、ステータス監視はすべてコントローラーマネージャーによって処理されます。 要約Kubernetesの基礎的な説明はこれで終わりです。もし気に入っていただけたら、ぜひ「いいね!」とフォローをお願いします。Dockerと比べて、Kubernetesはより成熟した機能を備えています。Googleによる徹底的なテストを経て生まれたKubernetesは、比較的成熟した完成度の高いシステムです。 この記事はWeChat公式アカウント「Mu Xiaonong」から転載したものです。 |