プライマリ・コンテンツに移動
Oracle® TimesTen In-Memory Database Kubernetesオペレータ・ユーザーズ・ガイド
リリース18.1
F33742-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Oracle TimesTen Kubernetesオペレータの概要

この章では、コンテナおよびKubernetesの概要について説明します。また、TimesTenオペレータについても説明します。

コンテナおよびKubernetesの概要

コンテナは、Linuxオペレーティング・システムを実行する軽量の仮想マシンです。通常、コンテナはイメージから起動された1つのアプリケーションを実行します。作成および変更されたファイルは、通常、永続的ではありません。ただし、永続記憶域は使用可能です。コンテナは、クラウド・コンピューティング環境の重要なコンポーネントです。

Kubernetesは、コンテナ化されたワークロードおよびサービスを管理するための移植可能で拡張可能なオープン・ソースのプラットフォームであり、宣言的な構成と自動化の両方を容易にします。Kubernetesには、クラスタ内の複数のホスト(ノードと呼ばれる)のリソースを管理し、必要に応じてこれらのノード間でコンテナを実行する機能があります。コンテナを自動的に生成して、様々な障害に対応できます。Kubernetesは、コンテナ間および外部へのネットワークも管理します。Kubernetesは、多くのクラウド環境およびオンプレミス環境間で移植可能です。

Kubernetesの主要な概念は次のとおりです。

Kubernetesは、アプリケーションのデプロイに必要なポッドおよび他のKubernetesリソースをプロビジョニングするための機能を提供します。デプロイ後、オブジェクトを監視および管理する必要があります。

Kubernetesは、アプリケーションの監視と管理を行いますが、すべてではありません。ポッド・レベルの問題は、自動的に処理されます。たとえば、コンテナに障害が発生した場合、Kubernetesはそのコンテナを自動的に再起動します。ノード全体に障害が発生した場合、Kubernetesは他のノードの交換ポッドを開始します。ただし、Kubernetesにはコンテナ内の問題に関する情報はありません。これはステートレス・アプリケーションでは問題になりませんが、(ステートフルな)データベースの場合、Kubernetesはコンテナ内の内容を管理するための支援が必要です。

この支援は次の形式で提供されます。

カスタム・リソース定義

カスタム・リソース定義(一般的にCRDと呼ばれる)は、Kubernetesのオブジェクト・モデルを拡張します。ポッド、StatefulSetおよびネイティブにサポートするサービス・オブジェクト・タイプと同様の新しいオブジェクト・タイプをKubernetesクラスタに追加します。

Kubernetesオペレータ

Kubernetesオペレータ(オペレータとも呼ばれる)は、CRDの背後にある頭脳です。オペレータは、人間のコンピュータ・オペレータの機能を実行するアプリケーションです。他のアプリケーションを起動、停止、監視および管理します。

オペレータは1つ以上のポッド(1つはアクティブで、他はアイドル状態)で実行されます。アクティブなオペレータが作業を実行します。他のオペレータはアイドル状態で、アクティブなオペレータに障害が発生するまでアイドル状態のままです。アクティブなオペレータは、特定のタイプのオブジェクトをすべて管理し、CRDと組み合せることで、Kubernetesにカスタム機能を追加できます。

TimesTenオペレータの概要

TimesTen Classicデータベースは、ほとんどの場合、アクティブ・スタンバイ・ペアで実行されます。図1-1「TimesTenデータベースのアクティブ・スタンバイ・ペア」に、アクティブ・スタンバイ・ペアのレプリケーション・スキームを示します。2つのデータベースがあります。1つはアクティブ・データベースで、もう1つのデータベースはスタンバイです。アプリケーションによって、アクティブ・データベースが更新されます。スタンバイ・データベースは読取り専用で、アクティブ・データベースからレプリケートされた更新を受信します。2つのデータベースのうち、一度に1つのみがアクティブ・データベースとして機能します。アクティブ・データベースで障害が発生すると、スタンバイ・データベースがアクティブ・データベースに昇格します。障害が発生した(アクティブ)データベースは、リカバリ後、スタンバイ・データベースになります。アクティブ・スタンバイ・ペアのレプリケーション・スキームの詳細は、Oracle TimesTen In-Memory Databaseレプリケーション・ガイドのレプリケーション・スキームのタイプを参照してください。

図1-1 TimesTenデータベースのアクティブ・スタンバイ・ペア

図1-1の説明が続きます。
「図1-1 TimesTenデータベースのアクティブ・スタンバイ・ペア」の説明

アクティブ・スタンバイ・ペアのレプリケーション・スキームは、Kubernetesに適しています。具体的には、TimesTenデータベースのアクティブ・スタンバイ・ペアを実行する、それぞれが永続記憶域を持つポッドのペアを考えてみます。アクティブ・データベースが格納されているポッドに障害が発生すると、Kubernetesによって別のポッドが自動的に生成され、これに適切な記憶域がアタッチされます。

ただし、KubernetesはTimesTenについて何も認識していないため、存続しているポッド上のスタンバイ・データベースをアクティブ・データベースにするために必要な処理を自動的に実行しません。ここでTimesTenオペレータが役立ちます。

TimesTenは、TimesTenClassicオブジェクト・タイプをKubernetesに追加するCRDとともに、TimesTenデータベースを管理するオペレータを提供します。オペレータは、設定および初期構成を自動化し、データベースおよびレプリケーションを管理し、フェイルオーバーおよびリカバリを自動化します。

TimesTenClassicオブジェクトを定義する際、Kubernetes機能を使用してTimesTenデプロイメントの構成を指定できます。KubernetesクラスタでTimesTenClassicオブジェクトを作成すると、それぞれTimesTenを実行するポッドのペアが作成されます。各ポッドにはTimesTenインスタンスが含まれています。各インスタンスは、1つのTimesTenデータベースを提供します。アクティブ・スタンバイ・ペアを介したデータベース・レプリケーションは、自動的に構成されます。つまり、TimesTenデータベースの可用性の高いレプリケート・ペアをデプロイし、少数のコマンドを発行することで管理できます。

Kubernetesオペレータは、特定のタイプのオブジェクトを管理します。TimesTenには、TimesTenClassicタイプのKubernetesオブジェクトを管理するオペレータが用意されています。そうすることで、TimesTenは、管理者操作を必要とせずに、自動化された方法でデプロイ、監視、管理および制御が可能になります。

次の各項では、TimesTenClassicオブジェクト・タイプとオペレータについて説明します。

TimesTenClassicオブジェクト・タイプ

TimesTenオペレータは、KubernetesクラスタにインストールするTimesTenClassic CRDの実装を提供します。インストール後、Kubernetesはポッド、シークレットおよびサービスを理解するのと同様に、TimesTenClassicオブジェクト・タイプを理解します。

クラスタ内にTimesTenデータベースのアクティブ・スタンバイ・ペアを作成するには、kubectl createコマンドを使用して、タイプがTimesTenClassicのオブジェクトを作成します。TimesTen構成およびTimesTenデータベースの必要な属性を、このTimesTenClassicオブジェクトの属性として定義します。

Kubernetesオブジェクト: 名前付きおよびタイプ付き

Kubernetesのオブジェクトは名前とタイプが付けられるため、sampleという名前のTimesTenClassicオブジェクトとsample2という名前の別のTimesTenClassicオブジェクトを定義できます。クラスタには、このようなKubernetesオブジェクトを多数の含めることができますが、このようなオブジェクトはKubernetesクラスタ内の使用可能なリソースによってのみ制限されます。

異なるタイプのオブジェクトには異なる意味があります。xというタイプaのオブジェクトと、xというタイプbのオブジェクトが同時に存在できます。たとえば、sampleというTimesTenClassicタイプのオブジェクトと、sampleというConfigMapタイプのオブジェクトを同時に定義できます。これら2つのオブジェクト間に関係はありません。

Kubernetesはネームスペースをサポートしています。ネームスペースは、クラスタを複数の独立したネームスペースに分割します。各ネームスペースには、完全に独立した名前のセットがあります。namespace1にはxというタイプaのオブジェクト、namespace2にはxというタイプaの別のオブジェクトが存在できます。たとえば、namespace1ネームスペースにsampleというタイプTimesTenClassicのオブジェクトを定義し、namespace2ネームスペースにsampleというタイプTimesTenClassicの別のオブジェクトを定義できます。


ノート:

CRDは、ネームスペース・スコープ指定ではなく、クラスタ・スコープ指定です。各ネームスペースに異なるオペレータが存在できますが、クラスタ全体で1つのCRD定義のみが存在できます。

Kubernetesオブジェクト定義は、JSONまたはYAMLで表されます。このマニュアルの例ではYAMLを使用しています。

オペレータ

オペレータはポッドを自動的にプロビジョニングおよび構成し、それらにTimesTenを構成して、データベースのペアを作成および構成します。オペレータは、ポッド、TimesTenインスタンスおよびTimesTenデータベースを監視し、それらを実行し続けます。たとえば、アクティブ・スタンバイ・ペア構成で、アクティブ・データベースを含むポッドに障害が発生した場合、スタンバイ・ポッドのデータベースはオペレータによってアクティブに自動的に昇格されます。

この演算子はデプロイメントを介して構成されます。デプロイメントのreplicas属性では、必要なオペレータのreplicasの数を指定します。デプロイメントを作成すると、Kubernetesは(replicasの数に応じて) 1つ以上のポッドを作成し、それぞれがオペレータを実行します。

  • オペレータのデプロイメントでreplicas: 1を指定し、オペレータで障害が発生した場合、Kubernetesは自動的に別のオペレータを生成します。その新しいオペレータが起動すると、デプロイメントのネームスペース内のTimesTenClassicオブジェクトを引き続き管理します。

  • オペレータのデプロイメントで複数のレプリカを指定した場合、複数のポッドでオペレータが実行されます。これらの1つはアクティブなオペレータで、ネームスペース内のTimesTenClassicオブジェクトを管理します。残りのポッドは、アクティブなオペレータの状態を監視します。このアクティブなオペレータで障害が発生すると、他のレプリカのいずれかがアクティブになり、デプロイメントのネームスペース内のTimesTenClassicオブジェクトを管理します。

オペレータが機能する方法の理解

KubernetesクラスタでTimesTenClassicオブジェクトを作成すると、データベースのアクティブ・スタンバイ・ペアを作成および構成するプロセスが開始されます。オペレータが呼び出され、TimesTenを実行するために必要なKubernetesオブジェクトがいくつか作成されます。オブジェクトが作成されてリンクされると、TimesTenコンテナはTimesTenエージェントを構成および起動するスクリプトを実行します。オペレータは、TimesTenを監視および制御するために、各ポッドで実行されているTimesTenエージェントと通信します。オペレータは1つのデータベースをアクティブ・データベースとして構成し、アクティブ・データベースをスタンバイにコピーしてから、アクティブ・スタンバイ・ペアのレプリケーション・スキームを構成します。このプロセスの詳細は、次の各項で説明します。

オペレータによって作成されるオブジェクト

オペレータは、StatefulSet、サービス、シークレットなどの、TimesTenの実行に必要なKubernetesオブジェクトをいくつか作成します。さらに、これらのオブジェクトは他のオブジェクトを作成します。これらのオブジェクトはすべてKubernetesによってリンクされ、作成したTimesTenClassicオブジェクトに関連付けられます。図1-2「TimesTenClassicオブジェクトの作成」に、作成されるオブジェクトとそのリンク方法を示します。

図1-2 TimesTenClassicオブジェクトの作成

図1-2の説明が続きます。
「図1-2 TimesTenClassicオブジェクトの作成」の説明

作成されるオブジェクトについては、次の各項で説明します。

StatefulSet

オペレータは、TimesTenを実行する2つのポッドで構成されるStatefulSetを作成します。各ポッドには、TimesTenコンテナにマウントされた1つ以上のPersistentVolumes (永続記憶域)があります。これは、TimesTenデータベースが格納される場所です。PersistentVolumesがマウントされたコンテナで実行されているアプリケーションは、コンテナの存続期間を超えて存続するファイルを作成できます。(デフォルトでは、コンテナが作成および変更するすべてのファイルは、コンテナが終了すると自動的に消滅します。コンテナは短期的なものです。)

StatefulSetの1つの属性は、プロビジョニングできるreplicasの数です。各TimesTenClassicオブジェクトには、2つのreplicasを含むStatefulSetが関連付けられています。あるポッドに障害が発生した場合、Kubernetesは新しいポッドを自動的に作成して置換し、適切なPersistentVolumeを自動的にマウントします。

たとえば、sampleというTimesTenClassicオブジェクトの場合、オペレータはsampleというStatefulSetを同じKubernetesネームスペースに作成します。次に、このStatefulSetは、sample-0およびsample-1という2つのポッドをネームスペースに作成します。

サービス

Kubernetesサービスは、クラスタ内のアプリケーションに公開する必要のあるネットワーク・アドレスとポートのセットを定義します。

TimesTenClassicオブジェクトを作成すると、オペレータによって自動的にheadlessサービスが作成されます。このサービスはStatefulSetに自動的に関連付けられます。これにより、KubernetesはStatefulSetのポッドに対してKubernetesクラスタのDNSにエントリを定義し、それらのDNSエントリを最新の状態に保ちます。

headlessサービスは、アクティブ・データベースのDNS名/アドレス・エントリがスタンバイ・データベースのDNS名/アドレス・エントリとは異なるように使用されます。これにより、受信クライアント接続をアクティブなデータベースにルーティングできます。headlessサービスの詳細は、次を参照してください。

https://kubernetes.io/docs/concepts/services-networking/service/#headless-services/

sampleというTimesTenClassicオブジェクトの場合、sampleというheadlessサービスも同じKubernetesネームスペースに作成されます。これにより、sample-0.sample.namespace.svc.cluster.localおよびsample-1.sample.namespace.svc.cluster.localのクラスタのDNSにエントリが作成されます。

シークレット

オペレータは、SSL証明書をTimesTenコンテナにインジェクトするためのシークレットを作成します。これにより、オペレータとTimesTenエージェント間の通信が保護されます。

ポッド

Statefulsetは2つのポッドを作成します。各ポッドには2つのコンテナがあります。

  • ttコンテナ。このTimesTenコンテナは、常にポッドに存在します。TimesTenエージェントを実行し、TimesTenを実行します。

  • daemonlogコンテナ: このコンテナはTimesTen ttmesg.logファイルの内容をstdoutにコピーし、Kubernetesがファイルをログに記録します。これにより、TimesTenインスタンスのデーモン・ログがKubernetesインフラストラクチャによって記録されます。

Events

オペレータは、重要な変更が発生するたびにKubernetesイベントを作成します。

TimesTenコンテナおよびTimesTenエージェント

オブジェクトが作成されると、TimesTenコンテナはTimesTenエージェントを構成および起動するスクリプトを実行します。オペレータは、そのポッドでTimesTenを構成、管理および監視するために、各ポッドで実行されているTimesTenエージェントと通信します。エージェントは、オペレータがポッド内のttコンテナの問合せおよび制御に使用する、ポッド内のHTTPSエンドポイントを提供します。TimesTenエージェントに障害が発生すると、ttコンテナは自動的に終了し、Kubernetesによって再生成されます。図1-3「オペレータおよびTimesTenエージェント」に、オペレータとTimesTenエージェント間の双方向通信を示します。

図1-3 オペレータおよびTimesTenエージェント

図1-3の説明が続きます。
「図1-3 オペレータおよびTimesTenエージェント」の説明

TimesTenエージェントはTimesTenを起動し、インスタンス管理者ユーザーとして実行されます。TimesTenを完全に制御できます。

TimesTenオペレータの単純なデプロイメント

TimesTenオペレータは、単純なデプロイメントと自動障害検出およびリカバリ用に設計されています。次に例を示します。

  • TimesTenデータベースの新しいレプリケート・ペアをデプロイすることを決定します。

  • それらのデータベースの属性を決定します。

  • それらの属性の構成ファイルを作成します。

  • kubectl createコマンドを使用して、レプリケート・ペアを表すTimesTenClassicオブジェクトを作成します。

  • kubectl getおよびkubectl describeコマンドを使用して、アクティブ・スタンバイ・ペアのプロビジョニングを確認します。

  • 他のポッドで実行されるアプリケーションは、TimesTenの標準クライアント/サーバー・ドライバを使用してTimesTenデータベースにアクセスします。

障害後に、TimesTenデータベースの継続的な監視、レプリケーションの構成、フェイルオーバーの実行、データベースの再複製を行う必要はありません。TimesTenオペレータはこれらすべての機能を実行し、ユーザーは最小限の労力でデータベースを稼働させることができます。