KubernetesとDocker

KubernetesとDockerの主な類似点と相違点、およびコンテナ化の利点について説明します。

KubernetesとDocker

コンテナー テクノロジーは、アプリケーションの開発と実行に関する私たちの考え方を変えています。 コンテナーは、アプリケーションの実行に必要なすべてを含むソフトウェアの軽量パッケージです。 これには、オペレーティング システムのコンポーネントだけでなく、ライブラリやその他の依存関係も含まれます。 Docker や Kubernetes などの新しいテクノロジーにより、組織は高品質のソフトウェアを迅速かつ簡単に提供できるようになります。

内容

コンテナ化とは何ですか?

コンテナ化は、アプリケーションをその依存関係とともにパッケージ化して、スタック全体をXNUMXつのユニットとして提供する方法です。 コンテナ化により、開発者は非互換性を心配することなく、任意の環境にコードをデプロイできます。 また、従来の方法を使用して数時間または数日かかる可能性のある共有ライブラリやパスの設定などの構成の問題に対処する必要もありません。 

コンテナは管理しやすい. それらは、開始、停止、あるマシンから別のマシンへの移動、およびスケールアップまたはスケールダウンをすべて、ほとんど手間をかけずに行うことができます。 コンテナーは、あるレベルの分離を提供することもできます。 専用のハードウェア リソースは必要ありません。 これにより、コンテナ間でリソースを共有できるようになり、パフォーマンスと効率が向上します。

コンテナテクノロジーは、アプリケーションの展開とスケーリングを簡素化するため、人気が高まっています。 以前は、開発者はソフトウェアを展開するためのスクリプトを作成する必要がありました。 コンテナーは、すべての依存関係を持つアプリケーションを標準ユニットにパッケージ化することにより、これをはるかに簡単にします。標準ユニットは、コンピューターシステムのどこにでも展開できます。 

さらに、コンテナはより軽量です。 仮想マシン. これは、従来のサーバー環境と比較して、使用するスペースが少なく、使用する処理能力が少ないことを意味します。 結論: コンテナーは、企業と開発者の両方に多くのメリットをもたらします。 企業 それらを利用して、IT システムのパフォーマンスを向上させることができます。 開発者は、コンテナーの移植性を利用して、開発をより簡単かつ迅速に行うことができます。

Dockerとは何ですか?

デッカー は、開発者がアプリケーションとそのすべての依存関係をソフトウェア開発用の標準化されたコンテナにパッケージ化できるオープンソース プラットフォームです。 Docker コンテナーは、軽量で、移植可能で、自己完結型になるように設計されています。 必要なものすべてを含むアプリケーションをパッケージ化できるため、実行中の環境に関係なく実行されます。

コンテナは新しいものではありません。 それらは、UNIXシステムではchroot、Windowsシステムでは仮想マシンの形で何十年も前から存在しています。 ただし、Dockerは、cp、tar、rmなどの標準のLinuxツールを使用してコンテナーを作成および管理する簡単な方法を提供することにより、コンテナーをよりアクセスしやすくしました。 Dockerは、パブリックまたはプライベートレジストリを介して他の人とコンテナを共有する簡単な方法も提供します。

コンテナは仮想マシン(VM)に似ていますが、別のオペレーティングシステム内ではなく、ホストオペレーティングシステム上で実行されます。 これは、独自のカーネルがないか、特別なドライバーをインストールする必要がないことを意味します。 これにより、VMよりもはるかに軽量になります。 また、基盤となるアーキテクチャに関係なく、任意のLinuxシステムで実行できる標準形式もあります。

Dockerはどのように機能しますか?

Dockerコンテナーは、Dockerイメージに基づいて作成されるランタイムです。 イメージは、アプリケーションの実行に必要なすべての情報を含むファイルです。 次に、イメージを使用してコンテナを作成します。

Dockerfileは、イメージを作成するための一連の命令です。 これらは、中間ベースイメージからコンテナを組み立てるために必要なすべてのステップを提供します。 Dockerfileは、慎重に選択された材料と詳細なステップバイステップの手順を備えたプロジェクトのレシピと考えることができます。 Dockerfileは、次のXNUMXつの部分で構成されています。

  1. コンテナ(イメージ)を構築するためにコマンドのリストが実行されます。 
  2. コンテナ(イメージ)の実行時に設定される環境変数のリスト。 
  3. コンテナにコピーされるファイルとディレクトリのリスト(イメージ)。

画像にはいくつかのレイヤーがあります。 最上位のレイヤーは、ファイルシステムを含むrootfsです。 次の層はカーネルであり、オペレーティングシステムのすべてのコアコンポーネントが含まれています。 XNUMX番目の層はアプリケーションであり、アプリケーションのすべてのコードと依存関係が含まれています。

Dockerイメージは不変です。一度作成すると、変更することはできません。 これは、既存の画像から新しい画像を作成でき、常に以前と同じ内容になることを意味します。 これにより、既存のイメージから新しいイメージを簡単に作成し、再構築せずに将来のプロジェクトで再利用できます。

Dockerアーキテクチャ

Docker Engineを使用すると、次のコンポーネントを使用してアプリケーションを開発、アセンブル、出荷、および実行できます。

Dockerデーモン

Dockerデーモンは、バックグラウンドで動作するプロセスです。 コンテナを管理し、イメージ管理を行い、XNUMXつのコマンドで新しいイメージを構築します。 コンテナの名前の競合は、異なるホストなどに配置することで処理されます。デーモンは、Docker Engineクラスタのライフサイクルの一部として実行されます。デーモンは、エンジンが起動したとき、またはノードが置き換えられたことを検出したときに起動します。

Dockerクライアント

DockerクライアントはDockerデーモンと対話します。 イメージを作成し、コンテナーと対話して管理します。

ドッカーの作成

Composeは、マルチコンテナーDockerアプリケーションを定義して実行します。 Composeでは、YAMLファイルを使用してアプリケーションのサービスを構成します。 次に、XNUMXつのコマンドを使用して、構成ファイルからすべてのサービスを作成して開始します。

作成は、同じYAML構成ファイルを読み取ることにより、異なるオペレーティングシステム(Linuxバージョンがサポートされています)間で機能します。 アプリケーション内のすべてのコンテナーがローカルホストまたは構成で指定された別のホスト/ポートを介して相互に通信できる限り、docker-composeは機能します。

Dockerマシン

Docker Machineツールを使用すると、オペレーティングシステムベンダー(Red Hat Enterprise Linuxなど)が提供するLinuxカーネル上で実行される仮想マシン(VM)を作成できます。 これにより、Windows ServerやUbuntuなどの他のオペレーティングシステムに基づくVMを、自分でインストールしたり、サードパーティのツールを使用したりすることなく作成できます。

Docker エンジン REST API

Docker Engine REST APIは、外部システムがコンテナーと対話するためのエンドポイントを提供します。 目標は、JSON over HTTPSなどの標準プロトコルを使用して、これらのシステムとコンテナー間の通信を容易にすることです。

Dockerコマンドラインインターフェース

Docker CLIは、Dockerを制御および管理するために使用できるコマンドラインインターフェイスです。 docker build、docker commit、またはその他のコマンドを使用して、アプリケーションをコンテナーとしてデプロイできます。

Dockerの利点

Dockerコンテナーの最も重要な利点のXNUMXつは、移植性が高いことです。 彼らはどんなコンピュータやサーバーでも走らせることができます。 これは、DockerコンテナがLinuxカーネルのプロセスとして実行されるためです。 これは、マシンごとに追加のインストールプロセスが必要ないことを意味します。 

コンテナは、さまざまなアプリに関連するコードをXNUMXつから分離することも保証します。 したがって、アプリケーションに脆弱性がある場合でも、同じサーバー上の他のアプリには影響しません。 最後に、Dockerには、強制アクセス制御(MAC)、seccompプロファイル、ユーザー名前空間などのセキュリティ機能が組み込まれています。

Kubernetesとは何ですか?

Kubernetes は、オープンソースのコンテナー オーケストレーション システムです。 コンテナー オーケストレーションは、システムがさまざまなコンテナー化されたアプリケーションとそれぞれのリソースを自動的に管理し、他の実行中のプロセスと競合したり重複したりしないようにするプロセスです。 

Kubernetesはどのように機能しますか?

Kubernetesは、各コンテナへのCPU割り当て、メモリ制限、ストレージスペース割り当てなどを実行します。 クラスター内のノード間でコンテナーをスケジュールし、それらを追跡し、コンテナーが正しく実行されていることを確認します。 また、他のクラスターやデータベースなどの外部システムと通信するためのメカニズムも提供します。

Kubernetesアーキテクチャ

Kubernetesには、マスターノードとワーカーノードのXNUMXつの主要コンポーネントが含まれています。 マスターノードの主なコンポーネントは次のとおりです。

etcdクラスター 

etcdクラスターは、構成データやその他の状態を格納するための信頼できる方法を提供する分散型Key-Valueストアです。 

クベレット 

Kubeletは、クラスター管理のプライマリノードエージェントです。 コンテナーを監視して、コンテナーが実行されていることを確認し、必要に応じてコンテナーを正常に再起動し、コンテナー化されたアプリケーションが必要に応じてシステムの他のコンポーネント(ストレージやそれ自体の別のインスタンスなど)に接続できるようにします。

Kubelet-プロキシ

Kubernetesプロキシは、クラスタ内の各ノードで実行されます。ポッド(コンテナ)、サービス、Docker Hubリポジトリなどの外部エンドポイント、またはクラスタ外のマイクロサービスアーキテクチャ間の接続を維持します。 これらの接続間でトラフィックの負荷を分散します。 すべてのサービスのヘルスチェックを提供します。

久部コントローラーマネージャー

kube-controller-managerは、クラスター内の各ノードでバックグラウンドプロセスとして実行されます。 他のコントローラーと通信して、システムから目的の状態を実現します。 また、サードパーティのアプリケーションやkubeletsなどの外部コンポーネントで使用できるAPIも提供します。

Kubelet-スケジューラー

スケジューラーは各ノードで実行され、ポッドを管理し、ノードで実行するポッドをスケジュールし、ポッドのステータスを監視します。

以下は、(ワーカー)ノードにある主なコンポーネントです。

キューブレット

ノード上のコンテナを処理するKubernetesコンテナランタイム。 ポッドとサービスの管理に必要なすべての機能を提供する責任があります。これには、イメージのプル、必要に応じてスケールアップまたはスケールダウンする必要がある場合のコンテナーの起動、アプリケーションの正常性の維持(クラッシュしたインスタンスの再起動など)が含まれます。 、DockerVolumesAPIやCattleVolumeDriverなどのプロビジョナーからストレージボリュームを接続し、サービスを介してIPアドレスを公開します(構成されている場合)

久部プロキシ 

Kube-proxyは、各マシンで実行され、Kubernetesサービスのインターフェースを提供するノードエージェントです。 Kube-proxyは、kubectlプロキシからの接続を受け入れ、クラスター、アップストリーム(DockerやOpenShiftなど)、およびクライアント間のTCPトラフィックのすべてのプロキシを処理します。

クベレット

Kubeletは、Kubernetesクラスターの各ノードで実行されるエージェントです。 システムのさまざまなコンポーネントと通信し、どのコンテナーがどこで実行されているかを追跡し、コンテナーのすべてのローカルセットアップを実行します。 kubeletは、作成時に新しいポッドまたはサービスにIPを割り当てます。

Kubernetesの利点

Kubernetesは、コンテナ管理の複雑さの多くを処理します。 これにより、メンテナンスが簡素化され、開発者はより付加価値の高いタスクに取り組むことができます。 その他の利点は次のとおりです。

パフォーマンスの向上:Kubernetesは水平方向にスケーリングされるため、クラスターに追加するノードが多いほど、優れています。 

標準化された構成管理:kubectlを使用して、ポートやボリュームなどのDockerfileオプションのコマンドとテンプレートを実行します。 一貫した構成で新しいクラスターを簡単にデプロイできます。 

より大きなリソースプールによるセキュリティと安定性の向上:ポッドごとのCPU /メモリのより大きなリソースプールにより、コンテナは、同じノード上の他のポッドからの競合や干渉なしに、使用可能なすべてのシステムリソースにアクセスできます。 これにより、単一ノードで複数のサービスが実行されている環境での公開ポイントが制限されるため、安定性とセキュリティの両方が向上します。 あるサービスが危険にさらされても、自動的に別のサービスが危険にさらされることはありません。

組織内のすべてのクラスターにわたってサービスとアプリケーションを管理するための単一クラスタードメインコントローラー:ユニバーサルコントロールプレーンにより、誰が管理しているのか、どのように管理しているのかに関係なく、インフラストラクチャ全体で何が起こっているのかを誰もが把握できます。 すべてが一元的にログに記録されるため、管理が簡単になります。

K8なしでDockerを使用できますか?

DockerはKubernetesなしで使用できます。 このシナリオでは、Dockerswarmがオーケストレーションを実行します。 SwarmはDockerのネイティブクラスタリングシステムです。 Docker Swarmは、Dockerエンジンのプールを単一の論理ユニットに変え、複数のホスト間でアプリケーションを簡単にスケーリングし、ノードの障害から自動的に回復します。

Docker swarmは、Dockerエンジンのクラスターを調整して、XNUMXつの大きな仮想単一ホストのように動作させることで機能します。 これらのエンジンは、SwarmKitを使用して相互に通信します。 リソースの可用性に応じて、スウォーム内の個々のノード間でタスクまたはワークロードを動的に割り当てることができるクラスターを作成します。

DockerSwarmのメリット

Dockerネイティブである以外に、Swarmには多くの利点があります。 追加の利点は次のとおりです。

その2:シャフトスピード(回転数): 軽量であるため、コンテナをより速くスピンアップできます 

サイズ: 群れのサイズはストレージ容量によってのみ制限されるため、可用性が高くなります 

拡張可能: Dockerスウォームモードを使用すると、シングルノードスウォームがサポートされるため、本番環境を損なうことなく新しいアイデアをテストしたい開発者や企業が簡単に利用できます。 

スケーリング: コンテナクラスターは、ノードが必要に応じて自動的にノードに追加またはノードから削除されると、自動的にスケーリングされます 

カスタマイズ可能: Swarmを使用すると、開発者/企業は、展開する場所を完全に制御できるため、展開パイプラインがスムーズになります。 

使いやすい: Docker swarmは、使いやすく、デプロイも簡単です。 これは、ラップトップまたはサーバーで実行できるシンプルなコマンドラインツールです。 

管理が簡単: DockerSwarmを使用してコンテナを簡単に管理できます。 ダウンタイムなしで群れを作成、参加、および残すことができます 

スケーリングが簡単: Docker swarmは、クラスター内のノードの数に基づいて自動的にスケーリングします。 これは、必要なリソースが多かれ少なかれ、クラスターのスケールアップまたはスケールダウンについて心配する必要がないことを意味します。 

保護が簡単: Docker Swarmには、クラスター内の各コンテナーのアクセスとアクセス許可を制御できるセキュリティ機能が組み込まれています。 

監視が簡単: docker statsコマンドを使用すると、コンテナーを簡単に監視できます。このコマンドは、CPU使用率、メモリ使用量、ネットワークトラフィックなど、クラスター内の各コンテナーに関する情報を提供します。

DockerなしでK8を実行できますか?

Kubernetesは、コンテナランタイムなしでは機能できません。 Dockerは、コンテナー化に使用されるさまざまなプラットフォームのXNUMXつですが、プラットフォームはそれだけではありません。 Dockerを排他的に使用する必要はありません。 他の互換性のあるオプションはすべて機能します。

DockerとK8sの両方を一緒に使用する利点

Kubernetesは、Dockerコンテナを管理するためのコンテナオーケストレーションシステムです。 Dockerは、コンテナーのライフサイクル全体にわたって制御と管理の追加レイヤーを提供するように設計されていますが、Kubernetesは、大規模なデプロイや高可用性要件を持つアプリケーションのスケールアウトにより適した方法でその機能を提供します。

KubernetesとDockerSwarm

Docker Swarmは、Dockerのネイティブクラスタリングソリューションです。 AWSCloudFormationテンプレートやGoogleGKE統合などの主要なクラウドプロバイダーからのサポートを含む統合管理レイヤーを通じて、組み込みの負荷分散と高可用性を提供します。 SwarmはPuppetとも統合されています。 Kubernetesは、単一のデータセンター内または地域全体の複数のデータセンター間で実行されるLinuxコンテナーのクラスターへのコンテナー化されたアプリケーションプログラミングインターフェイス(API)デプロイメントの制御を自動化する完全なシステムです。

KubernetesとDockerは、アプリケーションのデプロイを簡素化する堅牢なテクノロジーです。 アプリケーションを「コンテナ」にパッケージ化すると、より安全でスケーラブルで復元力のあるシステムが実現します。 それらを一緒に使用することで、チームはメンテナンスのオーバーヘッドが少ないアプリケーションを提供できるようになり、より重要なタスクに集中できるようになります。