方法1: リクエストと制限に特定のデータ項目を使用する

このアプローチでは、TimesTenオペレータにより、ttコンテナの適切なmemoryリクエストおよび制限が自動的に決定されます。これは、TimesTenClassicまたはTimesTenScaleoutオブジェクトのデフォルト動作(.spec.ttspec.automaticMemoryRequestsをデフォルトでtrueに設定)です。

残りのTimesTenコンテナの場合、TimesTenオペレータは、TimesTenClassicおよびTimesTenScaleoutオブジェクト定義の.spec.ttspecセクションにある特定のデータ項目を使用して、メモリー・リクエストと制限、および各TimesTenコンテナのCPUリクエストと制限を決定します。TimesTenオペレータは、データ項目にデフォルト値を使用するか、指定された値を使用します。例外は、ttコンテナのCPUリクエストおよび制限です。デフォルトがないため、CPUリクエストおよび制限を定義する場合は、TimesTenClassicおよびTimesTenScaleoutオブジェクトの.spec.ttspec.databaseCPURequestデータ項目に値を手動で指定する必要があります。次に、TimesTenオペレータは、メモリーおよびCPUリクエストと制限に関するこのすべての情報をKubernetesに提供します。

これらのデータ項目(デフォルトを含む)の詳細は、TimesTenClassicSpecSpecおよびTimesTenScaleoutSpecSpecを参照してください。

TimesTenデータベースを保持するttコンテナに対するmemoryリクエストの値は必ず正確である必要があります。

前述のとおり、ttコンテナに対するmemoryリクエストは次のことに基づいています。
  • そのデータベース用の共有メモリー: これは、そのデータベースのサイズによって異なります。

  • 追加メモリー: これは、そのデータベースの他に必要になるメモリーです。これには、TimesTenデーモン、サブデーモン、エージェント、クライアント/サーバー用に使用されるメモリーが含まれます。

TimesTenオペレータでは、これらの特定のメモリー要件についての、.spec.ttspec.databaseMemorySizeおよび.spec.ttspec.additionalMemoryRequestデータ項目が用意されています。.spec.ttspec.databaseMemorySizeはデータベースのサイズを指定するために使用し、.spec.ttspec.additionalMemoryRequestは追加メモリー用に使用します。

TimesTenオペレータによって.spec.ttspec.additionalMemoryRequestの値が.spec.ttspec.databaseMemorySizeの値に追加されます。この合計が、Kubernetesへのmemoryリクエストおよびmemory制限です。

TimesTenClassicまたはTimesTenScaleoutオブジェクト用の.spec.ttspec.databaseMemorySizeデータ項目を明示的に指定する必要はありません。指定しなかった場合は、TimesTenオペレータによってその適切な値の決定が試みられます。

TimesTenには、データベースの共有メモリー要件を決定するためのttShmSizeユーティリティが用意されています(そのsys.odbc.iniエントリが前提)。ttShmSizeの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttShmSizeを参照してください。

TimesTen sys.odbc.iniファイルは、TimesTenオペレータのdb.iniメタデータ・ファイルと同じです。db.iniファイルは、次のいくつかの方法で提供できます:
  • .spec.ttspec.dbConfigMapで参照されているConfigMapに埋め込みます。

  • .spec.ttspec.dbSecretで参照されているシークレットに埋め込みます。

  • 初期化コンテナを使用します。

メタデータ・ファイルの提供に使用できる機能の詳細は、「/ttconfigディレクトリの移入」を参照してください。

db.iniメタデータ・ファイルはConfigMapまたはシークレットで提供することをお薦めします。TimesTenオペレータによってTimesTenClassicまたはTimesTenScaleoutオブジェクト内のConfigMapおよびシークレットが確認されます(それが存在する場合)。ConfigMapまたはシークレット内にdb.iniが見つかった場合は、TimesTenオペレータによって、TimesTenのttShmSizeユーティリティが使用されて、データベース定義に基づいて、リクエストする適切な共有メモリー量が決定されます。この値は、その後、.spec.ttspec.databaseMemorySize値に使用されます。この方法では、TimesTenオペレータによってデータベースのサイズが設定されます。

次に例を示します:
kind: ConfigMap
metadata:
  name: resource9
data:
  adminUser: |
    adminuser/adminuserpwd
  schema.sql: |
    create user sampleuser identified by sampleuserpwd;
    grant admin to sampleuser;
    create table sampleuser.a (b number not null primary key, c number, d timestamp);  
    insert into sampleuser.a values(-1, -1, sysdate);
  db.ini: |
    Permsize=32768
    TempSize=4096
    LogBufMB=1024
    Connections=2048
    DatabaseCharacterSet=AL32UTF8
---
apiVersion: timesten.oracle.com/v2
kind: TimesTenClassic
metadata:
  name: recommendedoption
spec:
  ttspec:
    dbConfigMap:
    - option1
    storageClassName: standard
    storageSize: 200Gi
    image: container-registry.oracle.com/timesten/timesten:22.1.1.27.0
    imagePullSecret: sekret
    prometheus:
      insecure: true
この場合は、TimesTenオペレータによって、提供したdb.iniファイルに対してttShmSizeが実行され、.spec.ttspec.databaseMemorySizeの値が自動的に決定されます。次に、TimesTenオペレータによってこの値が.spec.ttspec.additionalMemoryRequestの値に追加されます。この合計が、Kubernetesへのmemoryリクエストおよびmemory制限です。

初期化コンテナまたはその他のメカニズムを使用することでdb.iniファイルを提供した場合は、TimesTenオペレータによって.spec.ttspec.databaseMemorySizeの値を決定することはできません。ポッドがプロビジョニングされ初期化コンテナが実行されるころには、ポッドはすでに作成されており、そのメモリー要件が定義されています。このような場合は、YAMLの一部として.spec.ttspec.databaseMemorySizeを手動で指定する必要があります。

Kubernetesの外部のTimesTenインスタンスでttShmSizeユーティリティを使用して、.spec.ttspec.databaseMemorySizeの適切な値を特定することをお薦めします。データベースを作成する必要はありません。

この例では、Kubernetesの外部でTimesTenインスタンスを作成し、sys.odbc.iniファイル内でdatabase1という名前でDSNを作成してあると仮定します。PermSizeTempSizeLogBufMBおよびConnections接続属性に対して指定されている値に基づいて、ttShmSizeユーティリティを使用します。

ttShmSize -connstr "DSN=database1;PermSize=32768;TempSize=4096;LogBufMB=1024;Connections=2048" 
The required shared memory size is 39991547720 bytes.

この値は.spec.ttspec.databaseMemorySizeデータ項目で指定します。

初期化コンテナを使用し.spec.ttspec.databaseMemorySizeの計算値を使用する例を見てみましょう。
apiVersion: timesten.oracle.com/v2
kind: TimesTenClassic
metadata:
  name: init1
spec:
  ttspec:
    databaseMemorySize: 41Gi
    storageClassName: standard
    storageSize: 200Gi
    image: container-registry.oracle.com/timesten/timesten:22.1.1.27.0
    imagePullSecret: sekret
    prometheus:
      insecure: true
  template:
    spec:
      initContainers:
      - name: init1a
         command:
        - sh
        - "-c"
        - |
          /bin/bash <<'EOF'
          echo adminuser/adminuserpwd > /ttconfig/adminUser
          echo PermSize=32768 > /ttconfig/db.ini
          echo TempSize=4096 > /ttconfig/db.ini
          echo LogBufMB=1024 > /ttconfig/db.ini
          echo Connections=2048 > /ttconfig/db.ini
          echo DatabaseCharacterSet=AL32UTF8 >> /ttconfig/db.ini
          ls -l /ttconfig
          EOF
        volumeMounts:
        - name: tt-config
          mountPath: /ttconfig
      volumes:
      - name: tt-config
        emptyDir: {}  

この場合は、TimesTenオペレータによって、.spec.ttspec.databaseMemorySizeに指定した値が使用されて、TimesTenデータベースを保持する共有メモリー・セグメントのサイズが決められます。次に、TimesTenオペレータによってこの値が.spec.ttspec.additionalMemoryRequestの値に追加されます。この合計が、Kubernetesへのmemoryリクエストおよびmemory制限です。

ノート:

TimesTen Scaleoutでは、sys.odbc.iniファイル(および対応するdb.iniファイル)により、データベース全体ではなく、データベースの単一要素のサイズが定義されます。TimesTenScaleoutオブジェクトをプロビジョニングするときは、TimesTenオペレータによって、TimesTenClassicオブジェクトの場合と同じ方法で、指定したデータが使用されます。