この章では、コンテナおよびKubernetesの概要について説明します。また、TimesTenオペレータについても説明します。
コンテナは、Linuxオペレーティング・システムを実行する軽量の仮想マシンです。通常、コンテナはイメージから起動された1つのアプリケーションを実行します。作成および変更されたファイルは、通常、永続的ではありません。ただし、永続記憶域は使用可能です。コンテナは、クラウド・コンピューティング環境の重要なコンポーネントです。
Kubernetesは、コンテナ化されたワークロードおよびサービスを管理するための移植可能で拡張可能なオープン・ソースのプラットフォームであり、宣言的な構成と自動化の両方を容易にします。Kubernetesには、クラスタ内の複数のホスト(ノードと呼ばれる)のリソースを管理し、必要に応じてこれらのノード間でコンテナを実行する機能があります。コンテナを自動的に生成して、様々な障害に対応できます。Kubernetesは、コンテナ間および外部へのネットワークも管理します。Kubernetesは、多くのクラウド環境およびオンプレミス環境間で移植可能です。
デプロイメント: n
個の同じポッドの名前付きコレクション(n
はポッドの数)。Kubernetesにより、n
個の同じポッドが確実に実行されます。デプロイメントの詳細は、次を参照してください。
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
PersistentVolume: ポッドにマウントでき、ポッドの存続期間を超えて持続する記憶域。永続ボリュームの詳細は、次を参照してください。
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
StatefulSet: デプロイメントと似ていますが、各ポッドにはPersistentVolumeが関連付けられています。StatefulSetsの詳細は、次を参照してください。
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
サービス: デプロイメントまたはStatefulSetのネットワーク・エンドポイント。Kubernetesクラスタ内のアプリケーションに公開する必要のあるアドレスとポートのセットを定義します。サービスの詳細は、次を参照してください。
https://kubernetes.io/docs/concepts/services-networking/service/
Kubernetesは、アプリケーションのデプロイに必要なポッドおよび他のKubernetesリソースをプロビジョニングするための機能を提供します。デプロイ後、オブジェクトを監視および管理する必要があります。
Kubernetesは、アプリケーションの監視と管理を行いますが、すべてではありません。ポッド・レベルの問題は、自動的に処理されます。たとえば、コンテナに障害が発生した場合、Kubernetesはそのコンテナを自動的に再起動します。ノード全体に障害が発生した場合、Kubernetesは他のノードの交換ポッドを開始します。ただし、Kubernetesにはコンテナ内の問題に関する情報はありません。これはステートレス・アプリケーションでは問題になりませんが、(ステートフルな)データベースの場合、Kubernetesはコンテナ内の内容を管理するための支援が必要です。
この支援は次の形式で提供されます。
カスタム・リソース定義(一般的にCRDと呼ばれる)は、Kubernetesのオブジェクト・モデルを拡張します。ポッド、StatefulSetおよびネイティブにサポートするサービス・オブジェクト・タイプと同様の新しいオブジェクト・タイプをKubernetesクラスタに追加します。
Kubernetesオペレータ(オペレータとも呼ばれる)は、CRDの背後にある頭脳です。オペレータは、人間のコンピュータ・オペレータの機能を実行するアプリケーションです。他のアプリケーションを起動、停止、監視および管理します。
オペレータは1つ以上のポッド(1つはアクティブで、他はアイドル状態)で実行されます。アクティブなオペレータが作業を実行します。他のオペレータはアイドル状態で、アクティブなオペレータに障害が発生するまでアイドル状態のままです。アクティブなオペレータは、特定のタイプのオブジェクトをすべて管理し、CRDと組み合せることで、Kubernetesにカスタム機能を追加できます。
TimesTen Classicデータベースは、ほとんどの場合、アクティブ・スタンバイ・ペアで実行されます。図1-1「TimesTenデータベースのアクティブ・スタンバイ・ペア」に、アクティブ・スタンバイ・ペアのレプリケーション・スキームを示します。2つのデータベースがあります。1つはアクティブ・データベースで、もう1つのデータベースはスタンバイです。アプリケーションによって、アクティブ・データベースが更新されます。スタンバイ・データベースは読取り専用で、アクティブ・データベースからレプリケートされた更新を受信します。2つのデータベースのうち、一度に1つのみがアクティブ・データベースとして機能します。アクティブ・データベースで障害が発生すると、スタンバイ・データベースがアクティブ・データベースに昇格します。障害が発生した(アクティブ)データベースは、リカバリ後、スタンバイ・データベースになります。アクティブ・スタンバイ・ペアのレプリケーション・スキームの詳細は、Oracle TimesTen In-Memory Databaseレプリケーション・ガイドのレプリケーション・スキームのタイプを参照してください。
アクティブ・スタンバイ・ペアのレプリケーション・スキームは、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オブジェクト・タイプとオペレータについて説明します。
TimesTenオペレータは、KubernetesクラスタにインストールするTimesTenClassic CRDの実装を提供します。インストール後、Kubernetesはポッド、シークレットおよびサービスを理解するのと同様に、TimesTenClassicオブジェクト・タイプを理解します。
クラスタ内にTimesTenデータベースのアクティブ・スタンバイ・ペアを作成するには、kubectl
create
コマンドを使用して、タイプがTimesTenClassicのオブジェクトを作成します。TimesTen構成およびTimesTenデータベースの必要な属性を、このTimesTenClassicオブジェクトの属性として定義します。
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オブジェクトの作成」に、作成されるオブジェクトとそのリンク方法を示します。
作成されるオブジェクトについては、次の各項で説明します。
オペレータは、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インフラストラクチャによって記録されます。
オペレータは、重要な変更が発生するたびにKubernetesイベントを作成します。
オブジェクトが作成されると、TimesTenコンテナはTimesTenエージェントを構成および起動するスクリプトを実行します。オペレータは、そのポッドでTimesTenを構成、管理および監視するために、各ポッドで実行されているTimesTenエージェントと通信します。エージェントは、オペレータがポッド内のtt
コンテナの問合せおよび制御に使用する、ポッド内のHTTPSエンドポイントを提供します。TimesTenエージェントに障害が発生すると、tt
コンテナは自動的に終了し、Kubernetesによって再生成されます。図1-3「オペレータおよびTimesTenエージェント」に、オペレータとTimesTenエージェント間の双方向通信を示します。
TimesTenエージェントはTimesTenを起動し、インスタンス管理者ユーザーとして実行されます。TimesTenを完全に制御できます。
TimesTenオペレータは、単純なデプロイメントと自動障害検出およびリカバリ用に設計されています。次に例を示します。
TimesTenデータベースの新しいレプリケート・ペアをデプロイすることを決定します。
それらのデータベースの属性を決定します。
それらの属性の構成ファイルを作成します。
kubectl
create
コマンドを使用して、レプリケート・ペアを表すTimesTenClassicオブジェクトを作成します。
kubectl
get
およびkubectl
describe
コマンドを使用して、アクティブ・スタンバイ・ペアのプロビジョニングを確認します。
他のポッドで実行されるアプリケーションは、TimesTenの標準クライアント/サーバー・ドライバを使用してTimesTenデータベースにアクセスします。
障害後に、TimesTenデータベースの継続的な監視、レプリケーションの構成、フェイルオーバーの実行、データベースの再複製を行う必要はありません。TimesTenオペレータはこれらすべての機能を実行し、ユーザーは最小限の労力でデータベースを稼働させることができます。