1概要

このチュートリアルでは、Kubernetesについて理論的に簡単に紹介します。特に、次のトピックについて説明します。

  • コンテナオーケストレーションツールの必要性

  • Kubernetesの特徴

  • Kubernetesのアーキテクチャ

  • Kubernetes API

より深く理解するために、https://kubernetes.io/docs/home/?path=users&persona=app-developer&level=foundational[official documentation]もご覧ください。


2コンテナオーケストレーション

このリンクでは、/dockerizing-spring-boot-application[前の記事]で、Dockerの基本とカスタムアプリケーションのパッケージ化およびデプロイ方法について既に説明しました。

一言で言えば、Dockerはコンテナーランタイムです。これは、コンテナーとも呼ばれる標準化された方法で、アプリケーションの単一インスタンスのパッケージ化、出荷、および実行を行うための機能を提供します。

しかし、複雑さが増すにつれて、新しいニーズが現​​れます。自動展開、コンテナのオーケストレーション、アプリのスケジュール設定、高可用性の付与、複数のアプリインスタンスのクラスタ管理など。

市販されているツールはかなりたくさんあります。しかし、Kubernetesは、実質的な競争相手としてますます自分自身を確立しています。


3 Kubernetesの特徴

Kubernetesは、簡単に言えば、ネットワークやストレージインフラストラクチャを含む、ノードのクラスタ全体でコンテナ化されたアプリケーションをオーケストレーションするためのシステムです。最も重要な機能のいくつかは以下のとおりです。

  • リソーススケジューリング:

    Pods

    が最適に分配されることを保証します

利用可能なすべてのノードで
** オートスケーリング:負荷が増加すると、クラスタは動的に

追加のノードを割り当て、それらに新しい

Pods

をデプロイする
自己修復:クラスタはコンテナを監視し、コンテナを再起動します。

定義済みのポリシーに基づいて必須
** Service-discovery:

Pods



Services

が登録され公開されています

DNS経由
** ローリングアップデート/ロールバック:に基づくローリングアップデートをサポート

ポッドとコンテナーの順次再デプロイ
** シークレット/構成管理:機密の安全な取り扱いをサポート

パスワードやAPIキーなどのデータ
** ストレージオーケストレーション:いくつかのサードパーティ製ストレージソリューションがあります

データを保持するための外部ボリュームとして使用可能


4 Kubernetesを理解する


__

Master



はクラスタの望ましい状態を維持します。私たちが自分のクラスターと対話するとき、 g。

kubectl__コマンドラインインターフェイスを使用することで、常にクラスタのマスターと通信しています。

クラスタ内の


ノード


は、アプリケーションを実行するマシン(VM、物理サーバーなど)です。マスターは各ノードを制御します。

ノードには


コンテナランタイム


が必要です。 DockerはKubernetesで使用される最も一般的なランタイムです。



Minikube


はKubernetesディストリビューションで、開発とテストのためにワークステーション上のVM内でシングルノードクラスタを実行できます。



Kubernetes API


は、それらをオブジェクトにラップすることによって、Kubernetesの概念を抽象化したものです(次のセクションで説明します)。


__

kubectl


__はコマンドラインツールです。これらのAPIオブジェクトを作成、更新、削除、および検査するために使用できます。


5 Kubernetes APIオブジェクト

  • APIオブジェクトは「意図の記録」です – オブジェクトを作成すると、クラスタシステムはそのオブジェクトが存在することを確認するために継続的に機能します。

  • すべてのオブジェクトは、オブジェクト仕様とオブジェクトステータスという2つの部分から構成されます。仕様はオブジェクトの望ましい状態を記述します。ステータスはオブジェクトの実際の状態を表し、クラスタによって提供および更新されます。

次のセクションでは、最も重要なオブジェクトについて説明します。

その後、例、スペックとステータスが実際にどのように見えるかを見ていきます。

** 5.1. 基本オブジェクト


  • Pod

    ** は、Kubernetesが扱う基本単位です。 1つ以上の密接に関連したコンテナー、ストレージリソース、固有のネットワークIP、およびコンテナーの実行方法に関する構成をカプセル化して、アプリケーションの単一インスタンスを表します。



  • Service


    ** は、Podの論理コレクションをまとめてそれらにアクセスする方法を定義する抽象概念です。サービスはコンテナのグループへのインタフェースであるため、消費者は単一のアクセス場所以外に何も心配する必要はありません。



Volumes


を使用すると、コンテナは外部ストレージリソースにアクセスでき(ファイルシステムは一時的であるため)、ファイルを読み込んだり永続的に保存したりできます。ボリュームはコンテナ間のファイルの共有もサポートします。

https://kubernetes.io/docs/concepts/storage/volumes/#types-of

-volumes[ボリュームタイプ]の長いリストがサポートされています。



名前空間


を使用すると、Kubernetesは1つの物理クラスタ上で複数の仮想クラスタを実行する可能性を提供します。ネームスペースは、リソースの名前の範囲を提供します。リソースの名前は、ネームスペース内で一意である必要があります。


5.2. コントローラー

さらに、コントローラーと呼ばれる、より高度な抽象化がいくつかあります。コントローラは基本オブジェクトを基にして追加の機能を提供します。



Deployment


コントローラは、PodとReplicaSetの宣言型の更新を提供します。 Deploymentオブジェクトに目的の状態を記述し、Deploymentコントローラーが実際の状態を目的の状態に変更します。



ReplicaSet


は、指定した数のPodレプリカが常に実行されていることを確認します。



StatefulSet

を使用すると、

ステートフルアプリケーションを実行できます。Deploymentとは異なり、Podは一意の永続的なIDを持ちます。 StatefulSetを使用すると、一意のネットワーク識別子または永続的な記憶域を使用してアプリケーションを実装でき、順序付けられた適切な展開、拡張、削除、および終了、ならびに順序付きおよび自動のローリング更新を保証できます。

__

DaemonSet

を使用すると、クラスタ内のすべてのノードまたは特定のノードセットで特定のPodのコピーを1つ実行できます。これは、各ノードでデーモンを実行する必要がある場合に役立ちます。 g。アプリケーションの監視、またはログの収集



GarbageCollection


は確実に特定のオブジェクトが削除されたことを確認します。これにより、不要になったオブジェクトを削除してリソースを節約できます。



  • Job


    ** は1つ以上のPodを作成し、それらのうちの特定の数が正常に終了することを確認し、正常に完了したことを追跡します。ジョブは、電子メールの送信、フレームのレンダリング、ファイルのトランスコードなど、一連の独立しているが関連している作業項目の並列処理に役立ちます。


5.3. オブジェクトメタデータ

メタデータは属性であり、オブジェクトに関する追加情報を提供します。

必須属性は次のとおりです。

  • 各オブジェクトは


    名前空間


    を持っていなければなりません。

前)。明示的に指定されていない場合、オブジェクトは

default

ネームスペースに属します。

  • A


    Name


    は、そのネームスペース内のオブジェクトに対する一意の識別子です。

  • A


    Uid


    は、時空間で一意の値です。それは区別するのに役立ちます

削除および再作成されたオブジェクト間

オプションのメタデータ属性もあります。最も重要なものは次のとおりです。


  • ラベル

    はキーと値のペアで、オブジェクトに添付することができます。

それらを分類してください。特定の条件を満たすオブジェクトのコレクションを識別するのに役立ちます。それらは、疎結合の方法で組織構造をオブジェクトにマッピングするのに役立ちます。


  • ラベルセレクタ

    は、それらによってオブジェクトのセットを識別するのに役立ちます。

ラベル


  • 注釈

    もキーと値のペアです。ラベルとは対照的に、

オブジェクトの識別には使用されません。代わりに、ビルド、リリース、イメージ情報など、それぞれのオブジェクトに関する情報を保持できます。


5.4. 例

Kubernetes APIを理論的に説明した後、例を見てみましょう。

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オブジェクトを含みます。


  • replicas:3

    は、複製係数3の

    ReplicationSet

    を指定します。

(つまり、

配置のインスタンスが3つあります)
**

template:

は1つの

Pod__を指定します

  • この

    Pod内で、

    spec:container:__を使用して1つを割り当てることができ

このケースでは、私たちは1つのコンテナを呼ばれています

demo-backend

、これはイメージとも呼ばれるインスタンスから生成されます。

demo-backend

、バージョン

latest

、そしてそれはポート8080をリッスンします
** 私たちのポッドにも

labels

を付けます:

app:demo-backend

そして__tier:

backend

**

selector:matchLabels:

を使って、

Pod



Deployment__にリンク

コントローラ(ラベル

app:demo-backend

および

tier: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>

ご覧のとおり、デプロイメントは稼働しているように見え、仕様からほとんどの要素を認識できます。

image

demo-backend:latest

からインスタンス化された、1つのポッドが1つのコンテナを含む、複製係数3のDeploymentがあります。

レスポンスに含まれていても仕様で定義されていないすべての属性はデフォルト値です。


6. Kubernetesを始めよう

ラップトップからクラウドプロバイダのVM、ベアメタルサーバーのラックまで、さまざまなプラットフォームでKubernetesを実行できます。

  • 始めるためには、https://kubernetes.io/docs/getting-started-guides/minikube/[Minikube]が最も簡単な選択かもしれません:それは開発とテストのためにローカルワークステーションでシングルノードクラスタを実行することを可能にします。**

その他のローカルマシンソリューション、ホステッドソリューション、IaaSクラウド上で実行されるディストリビューションなどについては、https://kubernetes.io/docs/setup/pick-right-solution/[公式ドキュメント]を参照してください。


7. 結論

この記事では、Kubernetesの基本について簡単に説明しました。

簡単に言えば、次の点について説明しました。

  • コンテナオーケストレーションツールが必要な理由

  • Kubernetesの最も重要な機能のいくつか

  • Kubernetesアーキテクチャとその最も重要な構成要素

  • Kubernetes APIとそれを使って希望の状態を指定する

私たちのクラスター