Kubernetesの概要
1. 概要
このチュートリアルでは、Kubernetesの理論的な概要を簡単に説明します。 特に、次のトピックについて説明します。
- コンテナオーケストレーションツールの必要性
- Kubernetesの機能
- Kubernetesアーキテクチャ
- Kubernetes API
より深く理解するために、公式ドキュメントも参照できます。
2. コンテナオーケストレーション
この前の記事では、Dockerの基本事項と、カスタムアプリケーションをパッケージ化してデプロイする方法についてすでに説明しました。
一言で言えば、Dockerはコンテナーランタイムです。これは、コンテナーとも呼ばれる標準化された方法でアプリの単一インスタンスをパッケージ化、出荷、実行するための機能を提供します。
ただし、複雑さが増すにつれて、新しいニーズが発生します。 自動デプロイ、コンテナーのオーケストレーション、アプリのスケジューリング、高可用性の付与、複数のアプリインスタンスのクラスターの管理など。
市場にはかなりの数のツールがあります。 ただし、Kubernetesはますます実質的な競合他社のようになりつつあります。
3. Kubernetesの機能
要するに、Kubernetesは、ネットワーキングおよびストレージインフラストラクチャを含む、ノードのクラスター全体でコンテナー化されたアプリケーションをオーケストレーションするためのシステムです。 最も重要な機能のいくつかは次のとおりです。
- リソースのスケジューリング:ポッドが使用可能なすべてのノードに最適に分散されるようにします
- 自動スケーリング:負荷の増加に伴い、クラスターは追加のノードを動的に割り当て、それらに新しいポッドをデプロイできます
- 自己修復:クラスターはコンテナーを監視し、必要に応じて、定義されたポリシーに基づいてコンテナーを再起動します
- サービスディスカバリ:ポッドおよびサービスは、DNSを介して登録および公開されます
- ローリングアップデート/ロールバック:ポッドとコンテナの順次再デプロイに基づくローリングアップデートをサポートします
- シークレット/構成管理:パスワードやAPIキーなどの機密データの安全な処理をサポートします
- ストレージオーケストレーション:いくつかのサードパーティストレージソリューションがサポートされており、データを永続化するための外部ボリュームとして使用できます
4. Kubernetesを理解する
マスターは、クラスターの目的の状態を維持します。 クラスターと対話するとき、e。 g。 kubectl コマンドラインインターフェイスを使用することで、常にクラスターのマスターと通信しています。
クラスタ内のノードは、アプリケーションを実行するマシン(VM、物理サーバーなど)です。 マスターは各ノードを制御します。
ノードにはコンテナランタイムが必要です。 Dockerは、Kubernetesで使用される最も一般的なランタイムです。
Minikube はKubernetesディストリビューションであり、開発とテストのためにワークステーション上のVM内でシングルノードクラスターを実行できます。
Kubernetes API は、Kubernetesの概念をオブジェクトにラップすることで抽象化したものです(次のセクションで説明します)。
kubectl はコマンドラインツールであり、これらのAPIオブジェクトを作成、更新、削除、および検査するために使用できます。
5. KubernetesAPIオブジェクト
APIオブジェクトは「意図の記録」です–オブジェクトを作成すると、クラスターシステムは、オブジェクトが存在することを確認するために継続的に機能します。
すべてのオブジェクトは、オブジェクト仕様とオブジェクトステータスの2つの部分で構成されています。 仕様には、オブジェクトの望ましい状態が記述されています。 ステータスは、オブジェクトの実際の状態を表し、クラスターによって提供および更新されます。
次のセクションでは、最も重要なオブジェクトについて説明します。 その後、例を見て、スペックとステータスが実際にどのように見えるかを見ていきます。
5.1. 基本オブジェクト
ポッドは、Kubernetesが扱う基本ユニットです。 これは、1つ以上の密接に関連するコンテナー、ストレージリソース、一意のネットワークIP、およびコンテナーの実行方法に関する構成をカプセル化し、それによってアプリケーションの単一のインスタンスを表します。
サービスは、ポッドの論理コレクションをグループ化し、それらにアクセスする方法を定義する抽象化です。 サービスはコンテナのグループへのインターフェイスであるため、消費者は単一のアクセス場所以外のことについて心配する必要はありません。
Volumes を使用すると、コンテナーは外部ストレージリソースにアクセスでき(ファイルシステムは一時的なものであるため)、ファイルを読み取ったり、永続的に保存したりできます。 ボリュームは、コンテナ間のファイル共有もサポートしています。 ボリュームタイプの長いリストがサポートされています。
Namespaces を使用すると、Kubernetesは1つの物理クラスターで複数の仮想クラスターを実行する可能性を提供します。 名前空間は、名前空間内で一意である必要があるリソースの名前のスコープを提供します。
5.2. コントローラー
さらに、コントローラーと呼ばれるいくつかの高レベルの抽象化があります。 コントローラは基本的なオブジェクトに基づいて構築され、追加の機能を提供します。
Deployment コントローラーは、ポッドとレプリカセットの宣言型更新を提供します。 目的の状態をDeploymentオブジェクトに記述し、Deploymentコントローラーが実際の状態を目的の状態に変更します。
ReplicaSet は、指定された数のポッドレプリカが常に実行されていることを確認します。
StatefulSet、を使用すると、ステートフルアプリケーションを実行できます。デプロイメントとは異なり、ポッドは一意で永続的なIDを持ちます。 StatefulSetを使用すると、一意のネットワーク識別子または永続ストレージを使用してアプリケーションを実装でき、順序付けられた適切な展開、スケーリング、削除、終了、および順序付けされた自動ローリング更新を保証できます。
DaemonSet、を使用すると、クラスター内のすべてまたは特定のノードセットが特定のポッドの1つのコピーを実行するようにすることができます。 これは、各ノードでデーモンを実行する必要がある場合に役立つ可能性があります。 g。 アプリケーションの監視、またはログの収集に使用します。
GarbageCollection は、特定のオブジェクトが削除されていることを確認します。このオブジェクトには、かつては所有者がいましたが、現在は所有者がいません。 これは、不要になったオブジェクトを削除することでリソースを節約するのに役立ちます。
ジョブは、1つ以上のポッドを作成し、特定の数のポッドが正常に終了することを確認し、正常な完了を追跡します。 ジョブは、電子メールの送信、フレームのレンダリング、ファイルのトランスコードなど、独立しているが関連する一連の作業項目の並列処理に役立ちます。
5.3. オブジェクトメタデータ
メタデータは属性であり、オブジェクトに関する追加情報を提供します。
必須の属性は次のとおりです。
- 各オブジェクトには名前空間が必要です(これについては前に説明しました)。 明示的に指定されていない場合、オブジェクトはdefault名前空間に属します。
- Name は、名前空間内のオブジェクトの一意の識別子です。
- Uid は、時間と空間で一意の値です。 削除および再作成されたオブジェクトを区別するのに役立ちます。
オプションのメタデータ属性もあります。 最も重要なもののいくつかは次のとおりです。
- ラベルはキーと値のペアであり、オブジェクトにアタッチして分類することができます。 特定の条件を満たすオブジェクトのコレクションを識別するのに役立ちます。 それらは、緩く結合された方法でオブジェクトに組織構造をマッピングするのに役立ちます。
- ラベルセレクターは、オブジェクトのセットをラベルで識別するのに役立ちます。
- 注釈もキーと値のペアです。 ラベルとは対照的に、オブジェクトの識別には使用されません。 代わりに、ビルド、リリース、イメージ情報など、それぞれのオブジェクトに関する情報を保持できます。
5.4. 例
理論的にはKubernetesAPIについて説明した後、例を見ていきます。
APIオブジェクトは、JSONまたはYAMLファイルとして指定できます。 ただし、ドキュメントでは手動構成にYAMLを推奨しています。
以下では、ステートレスアプリケーションのデプロイの仕様部分を定義します。 その後、クラスターから返されるステータスがどのようになるかを確認します。
demo-backendというアプリケーションの仕様は次のようになります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-backend
spec:
selector:
matchLabels:
app: demo-backend
tier: backend
replicas: 3
template:
metadata:
labels:
app: demo-backend
tier: backend
spec:
containers:
- name: demo-backend
image: demo-backend:latest
ports:
- containerPort: 8080
ご覧のとおり、demo-backendと呼ばれるDeploymentオブジェクトを指定します。 以下のspec:の部分は実際にはネストされた構造であり、前のセクションで説明した次のAPIオブジェクトが含まれています。
- レプリカ:3 は、 ReplicationSet をレプリケーションファクター3(i。 e。 Deployment の3つのインスタンスがあります)
- template:は1つのPodを指定します
- このPod、内で、 spec:containers:を使用して、1つ以上のコンテナーを Podに割り当てることができます。この場合、というコンテナーが1つあります。 ] demo-backend は、 demo-backend 、バージョン latest とも呼ばれるイメージからインスタンス化され、ポート8080をリッスンします。
- また、ポッドにラベルを添付します: app:demo-backendおよびtier:backend
- selector:matchLabels:を使用して、PodをDeploymentコントローラーにリンクします(ラベル app:demo-backendおよびにマッピングします]層:バックエンド)
クラスタからDeploymentの状態を照会すると、応答は次のようになります。
Name: demo-backend
Namespace: default
CreationTimestamp: Thu, 22 Mar 2018 18:58:32 +0100
Labels: app=demo-backend
Annotations: deployment.kubernetes.io/revision=1
Selector: app=demo-backend
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=demo-backend
Containers:
demo-backend:
Image: demo-backend:latest
Port: 8080/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: demo-backend-54d955ccf (3/3 replicas created)
Events: <none>
ご覧のとおり、デプロイメントは稼働しているようであり、仕様からほとんどの要素を認識できます。
イメージdemo-backend:latest からインスタンス化された、レプリケーション係数3のデプロイメントがあります。1つのポッドには1つのコンテナーが含まれています。
応答には存在するが、仕様では定義されていないすべての属性は、デフォルト値です。
6. Kubernetes入門
ラップトップからクラウドプロバイダー上のVM、ベアメタルサーバーのラックまで、さまざまなプラットフォームでKubernetesを実行できます。
開始するには、 Minikube が最も簡単な選択かもしれません。これにより、開発とテストのためにローカルワークステーションでシングルノードクラスターを実行できます。
その他のローカルマシンソリューション、ホスト型ソリューション、IaaSクラウドで実行されるディストリビューションなどについては、公式ドキュメントをご覧ください。
7. 結論
この記事では、Kubernetesの基本について簡単に説明しました。
簡単に言えば、次の側面について説明しました。
- コンテナオーケストレーションツールが必要になる理由
- Kubernetesの最も重要な機能のいくつか
- Kubernetesアーキテクチャとその最も重要なコンポーネント
- Kubernetes APIと、それを使用してクラスターの目的の状態を指定する方法