Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

Kubernetes の基礎

 

この章では、Kubernetes について、Kubernetes アーキテクチャにおいてよく知られている、基本的な terminologies、主要概念、ほとんどの一般に紹介されているコンポーネントについて説明します。この章では、Kubernetes のクラスター環境におけるいくつかの例を示し、基本 Kubernetes オブジェクトに関する主なアイデアを示します。

Kubernetes とは

Kubernetes の正式な定義はこちら (https://kubernetes.io/) でご覧いただけます。

“Kubernetes (K8s) は、コンテナ化されたアプリケーションの導入、拡張、管理を自動化するオープンソースシステムです。アプリケーションを論理ユニットに構成するコンテナをグループ化することで、管理と検出を容易に実行できるようになります。Kubernetes は、Google で実働ワークロードを実行する15年の経験をベースに構築されており、コミュニティーの優れたアイデアや実践と組み合わせています。”

Kubernetes に関する重要な事柄を以下に示します。

  • ’Google によって開始されたオープンソースプロジェクト

  • ’成熟した安定した製品

  • オーケストレーション’ツールとして

  • これ’は、上位レベルのコンテナを処理するプラットフォームです。

Kubernetes は、2014の Google のエンジニアのグループによって作成されており、Google’s 内部システム Borg によって設計および開発モデルが影響を受けます。Kubernetes は、システムリソース (CPU、メモリ、またはその他のカスタムメトリック) に基づいて、ノードの分散型アプリケーションを統合するメカニズムを総称的に提供する構築オブジェクトのセットを定義しています。Kubernetes は、必要な機能に REST Api を提供することで、コンテナのグループの管理の複雑さを解消します。

簡単に言えば、Docker などのコンテナ技術にはコンテナー内アプリケーションのパッケージ化と配信の機能がありますが、Kubernetes などのオーケストレーションシステムでは、コンテナーを比較的高いレベルで導入して管理できます。さらに簡単な方法ではありません。

Note

多くの Kubernetes ドキュメントは、技術を k8s (または K-8 文字) として省略しています。現在のメジャーリリース (この本書の執筆時点では) は v 1.14 です。

第1章では、Docker は、最も成熟したコンテナ技術であり、Kubernetes が必要なのはなぜでしょうか。技術的には、Kubernetes は Dockers よりも比較的高いレベルで動作するため、まさにそれは何を意味するのでしょうか。

Kubernetes を Docker と比較すると、Python と C 言語を比較するという、役に立つ例えと言えます。C は、多数の基本的な OS コンポーネントと Api を含むほぼすべてを構築するのに十分な性能を発揮しますが、実際には、作業負荷のタスクを自動化するスクリプトを作成することをお勧めします。つまり、C を使用するよりもはるかに Python を使用することを意味します。Python では、すでに必要な機能を提供している既存のモジュールを把握し、それをアプリケーションにインポートしてから、その機能を使用して必要なものを実現する方法に焦点を絞る必要があります。低レベルのシステム API 呼び出しとハードウェアの詳細について心配する必要はほとんどありません。

ネットワークの例えは、TCP/IP インターネットプロトコルです。FTP などのファイル転送ツールを開発する場合は、raw ソケットではなく TCP ソケットをベースにして作業を開始することをお勧めします。Tcp ソケットは TCP プロトコル上で実行されています。これにより、エラー検出、フロー、輻輳制御、再送信などの組み込みの信頼性機能をすべて備えた堅牢な基盤が実現します。検討すべきことは、一方のエンドからデータを配信し、それをもう一方のエンドユーザーに受信する方法です。Raw ソケットで IP プロトコルとさらに低いレイヤーを使用しているため、ツールのファイル転送機能を開始する前に、信頼性に関するすべての機能を検討して実装する必要があります。

そのため、Kubernetes に戻ります。複数のコンピューターで複数のコンテナを実行したいと考えている場合、Docker と直接対話するには、多くの作業が必要になります。以下のタスクは少なくとも、考慮すべき事項のリストにあります。

  • さまざまなマシンでのログオン、ネットワーク経由でのコンテナの生成

  • コンテナを追加または削除して需要を変更した場合のスケールアップ/ダウン

  • アプリケーションの複数のインスタンスによるストレージの一貫性を維持

  • 異なるノードで実行されているコンテナ間でロードを分散

  • さまざまなマシンで障害が発生した場合の新しいコンテナの起動

このような作業をすべて手動で実行すると、すべてが圧倒的なものになるということがすぐにわかります。高レベルの抽象化とそれらを Kubernetes API で表現することで、これらすべてのタスクが非常に容易になります。

Note

Kubernetes は、その種類の唯一のツールではありません。 Docker には、群れという独自のオーケストレーションツールがあります。’しかし、これは別のガイドの議論にすぎません。本書では、Kubernetes について説明しています。

Kubernetes のアーキテクチャとコンポーネント

Kubernetes クラスターには2種類のノードがあり、それぞれが適切に定義された一連のプロセスを実行しています。

  • ヘッドノード: マスター、またはマスターノードと呼ばれることもあります。これは、すべての考え方を行い、すべての決定を行うためのヘッドと頭脳です。インテリジェンスはすべてここに配置されています。

  • ワーカーノード: minion’と呼ばれるのは、「ノード」、つまり、従業員を担当する手と足のことです。

ノードはマスターによって制御され、ほとんどの場合、マスターとの通信のみが必要になります。

お客様とクラスター間の最も一般的なインターフェイスの1つは、kubectl のコマンドラインツールです。このアプリケーションは、同じマスターノードに、または PC と同様に、独立したマシンとして、クライアントとしてインストールされます。どこにいても、マスターによって公開されている REST API を使用して、マスターに話しかけることができます。

このガイドの後半では、kubectl を使用して Kubernetes オブジェクトを作成する例を示しています。しかし今のところは、kubectl コマンドを使用するたびに、クラスター’’のマスターと通信していることを覚えておいてください。

Note

ノードの意味があいまい–になる可能性があることは、このガイドのコンテキストで2つのことを意味している場合があります。通常、ノードとは、サーバーのようなクラスター内の論理ユニットを指します。これは物理または仮想のどちらでもかまいません。Kubernetes のクラスターのコンテキストでは、通常、ノードはワーカーノードを意味します。

Note

ほとんどの場合、マスターとノードの作業を迂回する必要はありませんが、ノードにログインし、すべての Docker コマンドを実行して、コンテナの実行ステータスを確認することができます。この例については、この章の後半で説明されています。

Kubernetes Master

Kubernetes のマスターノード (master) は脳です。クラスタマスターは、クラスターに関するすべてのグローバルな決定を行う制御プレーンを提供します。たとえば、クラスターでコンテナを生成する必要がある場合、マスターはタスクをディスパッチするノードを決定し、新しいコンテナを生成します。この手順はスケジューリングと呼ばれます。

マスターは、クラスターの望ましい状態を維持する役割を担います。この web サーバーを注文した場合は、2つのコンテナーが互いにバックアップしていることを確認してください。マスターは実行ステータスを監視し、どの障害が発生した場合でも2つの web サーバーコンテナが実行されていないときに新しいコンテナを作成します。

通常、クラスター内で1つのマスターノードのみが必要な場合でも、マスターを複製して、より高い可用性と冗長性を確保することができます。Master’s 機能は、マスターノードで実行されるプロセスのコレクションによって実装されています。

  • kube-apiserver: 制御プレーンのフロントエンドであり、REST Api を提供します。

  • kube-scheduler: スケジューリングを実行し、システムの再 quirements (CPU、メモリ、ストレージなど) およびその他のカスタムパラメーターまたは制約 (アフィニティ仕様など) に応じて、コンテナをどこに配置するかを決定します。

  • kube-controller-manager: さまざまなタイプのコントローラのほとんどを制御する単一のプロセスであり、システムの状態が正しいことを確認します。コントローラの例を以下に示します。

    • レプリケーションコントローラ

    • レプリケーション Aset

    • 導入

    • サービスコントローラ

  • etcd: システムの状態を格納するデータベース。

Note

簡潔にするために、一部のコンポーネントはリストされていません (例: クラウドコントローラマネージャー、DNS サーバー、kubelet)。これらのコンポーネントはわずかなものではありませんが、それをスキップして Kubernetes の基礎を超えることはできません。

Kubernetes Node

クラスター内の Kubernetes ノードは、ユーザーエンドアプリケーションを実行するマシンです。実稼働環境では、クラスターによって提供される内部で機能するように設計された規模に応じて、1つのクラスターに数十または数百のノードが存在することがあります。通常、すべてのコンテナとワークロードがノードで実行されています。ノードは以下のプロセスを実行します。

  • Kubelet: Master およびすべてのノード上で実行される Kubernetes エージェントプロセス。Kube は、マスターと連携し、ローカルホストのコンテナを管理します。

  • Kube: このプロセスは、ノードで Linux iptable を使用して Kubernetes サービス (第3章で導入) を実装しています。

  • コンテナ-ランタイム: または、今日–’の市場における多くの場合、ローカルコンテナは、実行中のすべての dockerized を保持しています。

Note

Kubernetes の初心者は、現在の Kubernetes アーキテクチャで’は実際にはプロキシではないため、プロキシという言葉が聞こえるかもしれません。Kube は、ノードで Linux IP テーブルを操作して、ポッドとノード間のトラフィックが正常に流れるようにするシステムです。

Kubernetes ワークフロー

ここまで’は、マスターとノード、およびそれぞれで実行されるメインプロセスについて説明してきました。それ’では、Figure 1に示すように、どのように連携するかを可視化してみましょう。

Figure 1: Kubernetes アーキテクチャ
Kubernetes アーキテクチャ

Figure 1の上部にあるので、 kubectlコマンドを使用して、右の2つのノードボックスを管理する Kubernetes master について説明します。Kubectl は、システム内のユーザーや他のプロセスに公開されている REST API を通じて、master プロセス kube-apiserver と連携しています。

で’は、kubectl コマンド–をいくつか送信してみましょう kubectl create x新しいコンテナーを生成します。実行中のビヘイビアーとともに生成されるコンテナの詳細を指定できます。これらのスペシフィケーションは、 kubectlコマンドラインパラメーター、または設定ファイルに定義されたオプションと値 (この例については後ほどご覧ください) ワークフローは以下のようになります。

  1. Kubectlクライアントはまず、CLI コマンドをもう1つの REST API 呼び出しに変換し、kube-apiserver に送信します。

  2. これらの REST API 呼び出しを検証した後、kube サーバーはタスクを認識し、kube scheduler プロセスを呼び出して、利用可能なノードからジョブの実行に1つの node を選択します。これがスケジューリング手順です。

  3. Kube は、ターゲットノードを返すと、kube-apiserver はタスクについての詳細情報をすべて取得し、タスクをディスパッチします。

  4. ターゲットノードの kubelet プロセスがタスクを受信し、コンテナエンジン (Figure 1の Docker エンジン) と通信して、指定されたすべてのパラメーターを持つコンテナを生成します。

  5. このジョブとその仕様は、中央データベースの etcd に記録されます。その役割は、クラスター内のすべてのデータを保存して、アクセスを提供することです。

Note

また、マスターはフル機能を備えたノードにすることもできます。そのため、ノードに存在する kubelet と kube のプロキシコンポーネントは、マスターに配置することもできます。Figure 1’では、マスターとノードの概念的な分離を簡素化するために、これらのコンポーネントをマスターに含めていませんでした。セットアップでは、コマンドを使用することができます。 kubectl get pods --all-namespaces -o wideすべてのポッドをその位置に表示します。マスターで生成されたポッドは、通常、kube システム名前空間–内で Kubernetes システム自体の一部として動作します。Kubernetes の名前空間については、第3章で説明されています。

もちろん、これは簡素化されたワークフローですが、基本的なアイデアが得られます。実際、Kubernetes のパワーを活用することで、コンテナを直接操作する必要はほとんどありません。低レベルの運用の詳細をほとんど隠すことができる上位レベルのオブジェクトを使用しています。

たとえば、Figure 1では、次のような方法ではなく、コンテナを生成するタスクを提供します。2つのコンテナを作成し、どちらかに障害が発生した場合に新しいコンテナーを生成することを確認します。実際には以下のようになっています。複製2を使用して、RC オブジェクト (複製コントローラ) を作成します。

2つの Docker コンテナが起動して実行されると、kubeapiserver は kube コントローラマネージャーと対話して、ジョブステータスを監視し、必要なすべてのアクションを実行して、それが定義された状態であるかどうかを確認します。たとえば、いずれかの Docker コンテナがダウンした場合、新しいコンテナが自動的に生成され、破断コンテナーが削除されます。

この例の RC は、Kubernetes kube コントローラマネージャープロセスによって提供されるオブジェクトの1つです。Kubernetes オブジェクトは、よりシンプルで簡潔な方法で、内部で同じ (多くの場合は) 作業を実行するための抽象化レイヤーを追加します。さらに、上位レベルで作業し、下位レベルの詳細を把握していないため、Kubernetes オブジェクトは、全体的な導入時間、脳の労力、トラブルシューティングの問題を大幅に削減します。検討’してみましょう。

Kubernetes オブジェクト

Kubernetes クラスターでのマスターおよびノードの役割を理解し、 Kubernetes Architectureでのワークフローモデルを理解したところで’、Kubernetes アーキテクチャのオブジェクトをさらに詳しく見てみましょう。

Kubernetes’s オブジェクトは以下を表します。

  • 配備されたコンテナアプリケーションとワークロード

  • 関連するネットワークおよびディスクリソース

  • クラスターが何をしているかについてのその他の情報。

最も頻繁に使用されるオブジェクトは以下のとおりです。

  • Pod

  • サービス

  • 大量

  • 名前空間

上位レベルのオブジェクト (コントローラ) は以下のとおりです。

  • レプリケーションコントローラ

  • レプリケーション Aset

  • 導入

  • StatefulSet

  • DaemonSet

  • 職歴

Note

上位レベルのオブジェクトは基本的なオブジェクトに基づいて構築されており、追加機能と便利機能を提供します。

フロントエンドでは、Kubernetes はオブジェクトのグループによって何かを取得するため、Kubernetes ではオブジェクトの設定ファイルでタスクを記述する方法についてのみ検討’する必要がありますが、それがコンテナレベルでどのように実装されるかについて心配する必要はありません。Kubernetes は、コンテナーエンジンと連携して、Kubelets 上でのコンテナのスケジューリングと実行を調整しています。コンテナエンジン自体は、実際のコンテナイメージ (たとえば、Docker build など) を実行する役割を担います。

第3章の各オブジェクトとマジックパワーについては、その他の例を示しています。まず、最も’基本的なオブジェクトを見てみましょう。pod.

Kubernetes ポッドの構築

Pod は最初に学習する Kubernetes オブジェクトです。Kubernetes の web サイトでは、pod を以下のように説明しています。

Pod (whales または .pea ポッドの pod など) は、1つ以上のコンテナ (Docker コンテナなど) のグループで、共有ストレージ/ネットワークを使用し、コンテナを実行する方法を指定します。

  • ポッドは本質的にはコンテナのグループです。

  • ポッド内のすべてのコンテナは、ストレージとネットワークリソースを共有します。

それで’は、個々のコンテナを扱う従来の方法と比べて、pod を使用するメリットは何でしょうか。シンプル’なユースケースを考えてみましょう。Docker を使用して web サービスを導入し、フロントエンドサービス (Apache サーバーなど) だけでなく、データベースサーバー、ログサーバー、監視サーバーなどのサービスをサポートする必要がある場合もあります。これらのサポートサービスは、それぞれ独自のコンテナで実行する必要があります。そのため、web サービスコンテナーが必要になったときに常にドッキンググループを使用していることがわかっています。実稼働環境では、同じシナリオが他のほとんどのサービスにも適用されます。最終的には次のことが求められるでしょう。上位レベルのユニットに Docker コンテナをまとめてグループ化する方法があるので、低レベルのコンテナ間の相互作用の詳細について心配する必要はありませんか。

Pod は、1つ以上のコンテナを1つのオブジェクトにラップすることで、必要に応じて、正確に高い抽象化を提供します。Web サービスが広く普及し、1つのポッドインスタンスに’負荷をかけることができない場合は、他のオブジェクト (RC、デプロイメント) を使用して、同じグループのコンテナの複製と拡張を非常に簡単に行うことができます (通常は数秒で完了します)。これにより、導入と保守の効率性が大幅に向上します。

さらに、同じ pod 内のコンテナは同じネットワークスペースを共有するため、同じマシン上にある場合と同じ pod 内の他のコンテナとの通信を容易にすると同時に、他のコンテナーから分離レベルを維持できます。これらのメリットの詳細については、このガイドの後半をご覧ください。

ここでは’、Kubernetes クラスターで構成ファイルを使用して pod を起動する方法をご紹介します。

Kubernetes の YAML ファイル

Kubernetes の設定に関するその他多くの方法と同様に、YAML は Kubernetes 構成ファイルで使用される標準フォーマットです。YAML は広く使用されているため、多くの場合、すでに精通していると考えられます。そうでないと’しても、yaml は非常に簡単に学習できる言語であるため、たいした問題ではありません。ポッドの YAML 設定の各行は詳細であり、pod 学習プロセスの副産物として YAML 形式について理解しておく必要があります。

YAML 形式の pod 構成ファイルは次のとおりです。

YAML は、次の3つの基本データタイプを使用します。

  1. スカラー (文字列/数値): atom データ項目、pod-1、ポート番号80のような文字列。

  2. マッピング (ハッシュ/ディクショナリ): キーと値のペアを入れ子にすることもできます。apiVersion: v1 はマッピングです。key apiVersion は v1 の値を持っています。

  3. シーケンス (アレイ/リスト): 順序付けられた値の収集。キーはありません。リストアイテムは、-標識で示されます。キーコンテナーの値は、2つのコンテナを含むリストです。

この例では、ネストした YAML データ構造も見られます。

  • マップのマッピング: spec はマップの鍵であり、pod’の仕様を定義します。この例では、pod で起動するコンテナの動作のみを定義しています。この値は、キーがコンテナに含まれるもう1つのマップです。

  • リストのマッピング。キーコンテナの値は、次の2つの項目のリストです。サーバーとクライアントのコンテナーです。各コンテナは、公開される名前、イメージ、ポートなどの属性を使用して、個々のコンテナを示すマッピングを示しています。

YAML に関して知っておく必要があるその他の特性は以下のとおりです。

  • 大文字と小文字が区別されます。

  • 同じレベルの要素は同じ左インデントを共有しますが、インデント幅は重要ではありません。

  • タブ文字をインデントとして使用することはできません。

  • 空白ラインは重要ではありません

  • # を使用してラインにコメントをする

  • 任意の文字の特殊な意味をエスケープするには、単一引用符を使用します。

YAML ファイルの詳細を確認する前に、次’のように pod の作成を完了させてみましょう。

そこ。最初の Kubernetes オブジェクト–は pod-1 という名前の pod として作成されています。では、コンテナはどこにあるのでしょうか。この出力は、次のような手掛かりを提供します。2つのコンテナ (準備完了/2) を含む pod ポッド-1 (名前) は、Kubernetes worker ノード cent333 で、IP アドレス10.47.255.237 を割り当てて起動されています。ポッド内の両方のコンテナが稼働しています (準備完了 2/)。再起動なしで、27s の実行ステータスになっています。ここ’で yaml 構成が何を実行しているかについて、簡単な説明を示します。

  • ライン 1: このコメント行は、# 進んだテキストを使用して、YAML ファイルに任意のコメントを付けることができます。(本書全体では、この最初の行を使用して YAML ファイルのファイル名を指定しています。このファイル名は、YAML ファイルからオブジェクトを作成するときにコマンドの後で使用されます。

  • 線2、3、4、8: 4 YAML のマッピングは、pod 定義の主なコンポーネントです。

    • ApiVersion: V2 など、さまざまなバージョンがあります。ここでは、特にバージョン1です。

    • 同種Kubernetes オブジェクトには別のタイプがあることに注意してください。この場合、Kubernetes が pod オブジェクトを作成する必要があります。その後、他のオブジェクトの例では、レプリケーションコントローラまたはサービスの種類が表示されます。

    • データ作成されたオブジェクトを識別します。作成するオブジェクトの名前に加えて、別の重要なメタデータはラベルです。これについては、第3章で詳しく説明します。

    • スペシフィケーションこれにより、pod 動作に関する仕様が得られます。

  • ライン 9-15: Pod 仕様では、2つのコンテナについて説明しています。システムは画像をダウンロードし、各コンテナを名前で起動して、指定されたポートを公開します。

’ここでは’、ポッド内で実行されていることを示します。

当然のことながら、pod-1 は、Kubernetes クラスターによって割り当てられた IP アドレスを使用して、YAML ファイル、サーバー、クライアントで宣言された2つのコンテナから成り、Figure 2に示すように、すべてのコンテナ間で共有しています。

Figure 2: ノード、ポッド、コンテナ
ノード、ポッド、コンテナ

コンテナの一時停止

Node cent333 にログインすると、次の’ような Docker コンテナが pod 内で実行されていることがわかります。

K8s.gcr.io/pause の3番目のコンテナは、Kubernetes システムによってポッドごとに作成された特別なコンテナです。Pause コンテナは、pod のネットワークリソースを管理するために作成されます。この pod のすべてのコンテナで共有されます。

Figure 3は、いくつかのユーザーコンテナと一時停止コンテナを含むポッドを示しています。

Figure 3: ポッド、ユーザーコンテナ、特殊な Pause コンテナ
ポッド、ユーザーコンテナ、特殊な Pause コンテナ

内部ポッド通信

Kubernetes マスターでは、次’のようにマスターからのコンテナへのログインを許可します。

Note

Docker でプレイしたことがあれば、これは非常にすばらしいものであることをすぐに実感してください。コンテナはいずれかのノードで起動されたので、Docker を使用する場合は、まず、適切なリモートノードにログインしてから、類似の Docker exec コマンドを使用して各コンテナーにログインする必要があります。Kubernetes は、このような詳細を隠します。これにより、1つのノード–からマスターのすべてを実行できます。

次に、コンテナで実行されているプロセスをチェックします。

サーバーコンテナ

クライアントコンテナ

この ps コマンド出力は、各コンテナーが独自のプロセスを実行していることを示しています。しかし、ss と ip のコマンド出力は、両方のコンテナが同一の正確なネットワーク環境を共有しているため、どちらもポートを相互に公開していることを示しています。そのため、localhost を使用するだけで、pod 内のコンテナ間の通信が発生する可能性があります。ここ’では、curl コマンドを使用して TCP 接続を開始することで、これをテストしてみましょう。

クライアントコンテナから、サーバーコンテナから web ページを取得したいとします。次のように localhost の IP アドレスを使用して curl を開始するだけです。

接続が確立し、web ページが正常にダウンロードされたことを確認できます。

では’、TCP 接続の状態を監視してみましょう。接続が正常に確立されました。

また、サーバーコンテナからも同じように正確に接続できます。

Kubectl ツール

ここまでは’、kubectl コマンドによって作成されたオブジェクトを見てきました。このコマンドは、Docker world の docker コマンドと同様に、Kubernetes world のインターフェイスが Kubernetes API 経由でクラスター、より正確に Kubernetes master と通信します。’Kubernetes に対処するために必要なあらゆる種類のタスクを実行するためのオプションを提供する汎用ツールです。

Kubectl のオートコンプリート機能を有効にした場合、現在の環境でサポートされるすべてのオプションを一覧表示するには、マスターと入力 kubectl にログインし、次に2つの tab キーを使用します。

Note

Kubectl コマンドのオートコンプリートを設定するには、[完了] オプションの指示に従ってください。

kubectl の完了-h

このガイドの残り’の部分では、これらのオプションのいくつかについて説明しています。