/ttconfigディレクトリの移入

様々な方法を使用して、メタデータ・ファイルがTimesTenコンテナの/ttconfigディレクトリに配置されるようにできます。どの方法を使用するかについての要件はありません。Kubernetesは、考慮する必要があるConfigMap、シークレット、初期化コンテナなどの機能を提供します。

ConfigMapおよびシークレットの使用

1つ以上のConfigMapおよび1つ以上のシークレットを使用して、メタデータ・ファイルをTimesTenコンテナに組み込むことができます。これにより、異なるデプロイメントに異なるTimesTenメタデータを指定できます。また、パスワードや証明書などの機密データを含むメタデータにシークレットを使用できます。

ConfigMapを使用してメタデータをポッドに移入する方法は、標準的なKubernetesの手法です。メリットの1つは、作成後にConfigMapを変更できることです。この結果、ポッド内のファイルが即時に更新されます。

ノート:

TimesTenは、すぐには認識せずに、ファイルの変更されたコンテンツを処理する場合があります。

ConfigMapおよびシークレットを使用してメタデータを保持し、TimesTenClassicオブジェクト定義内でそれらを参照する場合、TimesTenオペレータはtt-configという予測ボリュームを作成します。このtt-configボリュームには、TimesTenClassicオブジェクトのdbConfigMapフィールドとdbSecretフィールドで指定されたすべてのConfigMapのコンテンツとすべてのシークレットが含まれています。このボリュームはTimesTenコンテナに/ttconfigとしてマウントされます。

ノート:

dbConfigMapデータ項目とdbSecretデータ項目を使用して、TimesTenClassicオブジェクト内の1つ以上のConfigMapまたはシークレット(あるいはその両方)を指定できます。その結果、これらのConfigMapまたはシークレット(あるいはその両方)が/ttconfigで読取り専用でマウントされます。このようなマウントは読取り専用であるため、初期化コンテナからそれに書き込むことはできません。別の方法として、emptydirボリュームを使用し初期化コンテナを使用してそれにファイルを書き込むことはできます。ただし、ConfigMapとシークレットを初期化コンテナと組み合せることはできません。初期化コンテナの使用については、「初期化コンテナの使用」を参照してください。

ConfigMapおよびシークレットを使用するには、次のプロセスに従います。

  • どの機能にどのメタデータ・ファイルを含めるかを決定します。たとえば、すべてのメタデータ・ファイルに対して1つのConfigMapを使用できます。または、たとえば、db.iniメタデータ・ファイルに1つのConfigMapを使用し、adminUserおよびschema.sqlメタデータ・ファイルに1つのシークレットを使用できます。特定の要件はありません。

  • メタデータ・ファイルを格納するディレクトリを作成します。

  • kubectl createコマンドを使用して、KubernetesクラスタにConfigMapおよびシークレットを作成します。

  • TimesTenClassicオブジェクト定義にConfigMapおよびシークレットを含めます。

次の例は、TimesTenClassicオブジェクトにConfigMapおよびシークレットを使用する方法を示しています。

1つのConfigMapを使用する例

この例では、db.iniadminUserおよびschema.sqlメタデータ・ファイルに1つのConfigMap (sampleという名前)を使用します。

  1. 開発ホストで、任意のディレクトリから、メタデータ・ファイル用の空のサブディレクトリを作成します。この例では、cm_sampleサブディレクトリを作成します。(この例ではこれ以降、このディレクトリを示すためにcm_sampleディレクトリを使用します。)
    mkdir -p cm_sample
  2. ConfigMapディレクトリに移動します。
    cd cm_sample
  3. db.iniファイルを作成します。このdb.iniファイルで、PermSize接続属性とDatabaseCharacterSet接続属性を定義します。
    vi db.ini
    
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    ConnectionCharacterSet=AL32UTF8
  4. adminUserファイルを作成します。このadminUserファイルで、samplepwパスワードを使用してsampleuserユーザーを作成します。
    vi adminUser
    
    sampleuser/samplepw
  5. schema.sqlファイルを作成します。このschema.sqlファイルで、sampleuserユーザーのs順序とemp表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。
    vi schema.sql
    
    create sequence sampleuser.s;
    create table sampleuser.emp (
      id number not null primary key,
      name char(32)
    );
  6. ConfigMapを作成します。cm_sampleディレクトリ内のファイルは、ConfigMapに含まれます。これらのファイルは、後でTimesTenコンテナで使用できます。

    この例では次のとおりです。

    • ConfigMapの名前はsampleです。sampleを任意の名前に置き換えます。

    • この例では、ConfigMapにコピーされるファイルが存在するディレクトリとしてcm_sampleを使用しています。別のディレクトリを使用する場合、cm_sampleは使用するディレクトリの名前に置き換えます。

    kubectl create configmap sample --from-file=cm_sample
    出力は次のようになります。
    configmap/sample created
  7. ConfigMapの内容を確認します。
    kubectl describe configmap sample
    出力は次のようになります。
    Name:         sample
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
     
    Data
    ====
    adminUser:
    ----
    sampleuser/samplepw
     
    db.ini:
    ----
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    ConnectionCharacterSet=AL32UTF8
     
    schema.sql:
    ----
    create sequence sampleuser.s;
    create table sampleuser.emp (
      id number not null primary key,
      name char(32)
    );
    
    Events:  <none>
  8. オブジェクト定義にConfigMapを含めます。dbConfigMapフィールドで、ConfigMapの名前を指定します(この例ではsample)。

    この例では、250GistorageSizeを使用します(本番環境に適しています)。デモ用の場合は、50GistorageSizeで対応できます。

    これは、TimesTenClassicオブジェクトにConfigMapを使用する例です。

    apiVersion: timesten.oracle.com/v5
    kind: TimesTenClassic
    metadata:
      name: sample
    spec:
      ttspec:
        storageClassName: oci-bv
        storageSize: 250Gi
        image: container-registry.oracle.com/timesten/timesten:22.1.1.36.0
        imagePullSecret: sekret
        dbConfigMap:
        - sample
    

    sample ConfigMapはメタデータ・ファイルを保持します。tt-configボリュームには、sample ConfigMapのコンテンツが含まれています。

1つのConfigMapと1つのシークレットを使用する例

この例では、db.iniメタデータ・ファイルに1つのConfigMap (myconfigという名前)を、adminUserおよびschema.sqlメタデータ・ファイルに1つのシークレット(mysecretという名前)を使用します。

  1. 開発ホストで、任意のディレクトリから次のことを実行します。
    • ConfigMap用に空のサブディレクトリを1つ作成します。この例では、cm_myconfigサブディレクトリを作成します。(この例ではこれ以降、このディレクトリを示すためにcm_myconfigディレクトリを使用します。) このディレクトリにはdb.iniメタデータ・ファイルが格納されます。

    • シークレット用に2つ目の空のサブディレクトリを作成します。この例では、secret_mysecretサブディレクトリを作成します。(この例ではこれ以降、このディレクトリを示すためにsecret_mysecretディレクトリを使用します。) このディレクトリには、adminUserおよびschema.sqlメタデータ・ファイルが格納されます。

    mkdir -p cm_myconfig
    mkdir -p secret_mysecret
  2. ConfigMapディレクトリに移動します。
    cd cm_myconfig
  3. このConfigMapディレクトリ(この例ではcm_myconf)にdb.iniファイルを作成します。このdb.iniファイルで、PermSize接続属性とDatabaseCharacterSet接続属性を定義します。
    vi db.ini
    
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    ConnectionCharacterSet=AL32UTF8
  4. Secretディレクトリに移動します。
    cd secret_mysecret
  5. このSecretディレクトリ(この例ではsecret_mysecret)にadminUserファイルを作成します。このadminUserファイルで、samplepwパスワードを使用してsampleuserユーザーを作成します。
    vi adminUser
    
    sampleuser/samplepw
  6. このSecretディレクトリ(この例ではsecret_mysecret)にschema.sqlファイルを作成します。このschema.sqlファイルで、sampleuserユーザーのs順序とemp表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。
    vi schema.sql
    
    create sequence sampleuser.s;
    create table sampleuser.emp (
      id number not null primary key,
      name char(32)
    );
  7. ConfigMapを作成します。cm_myconfig ディレクトリ内のファイルはConfigMapに組み込まれ、後でTimesTenコンテナで使用できます。

    この例では次のとおりです。

    • ConfigMapの名前はmyconfigです。myconfigを任意の名前に置き換えます。

    • この例では、ConfigMapにコピーされるファイルが存在するディレクトリとしてcm_myconfig を使用します。別のディレクトリを使用する場合、cm_myconfigは使用するディレクトリの名前に置き換えます。

    ConfigMapを作成します。

    kubectl create configmap myconfig --from-file=cm_myconfig
    出力は次のようになります。
    configmap/myconfig created
  8. ConfigMapの内容を確認します。
    kubectl describe configmap myconf
    
    出力は次のようになります。
    Name:         myconfig
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
     
    Data
    ====
    db.ini:
    ----
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    ConnectionCharacterSet=AL32UTF8
     
    Events:  <none>
  9. シークレットを作成します。secret_mysecretディレクトリ内のファイルはシークレットに組み込まれ、後でTimesTenコンテナで使用できます。

    この例では次のとおりです。

    • シークレットの名前はmysecretです。mysecretを任意の名前に置き換えます。

    • この例では、シークレットにコピーされるファイルが置かれるディレクトリとしてsecret_mysecretを使用します。別のディレクトリを使用する場合、secret_mysecretは使用するディレクトリの名前に置き換えます。

    kubectl create secret generic mysecret --from-file=secret_mysecret
    出力は次のようになります。
    secret/mysecret created
  10. シークレットを確認します。adminUserおよびschema.sqlファイルの内容は表示されないことに注意してください。
    kubectl describe secret mysecret
    出力は次のようになります。
    
    Name:         mysecret
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
     
    Type:  Opaque
     
    Data
    ====
    adminUser:   12 bytes
    schema.sql:  98 bytes
  11. ConfigMapおよびシークレットをオブジェクト定義に含めます。
    • dbConfigMapフィールドで、ConfigMapの名前を指定します。

    • dbSecretフィールドで、シークレットの名前を指定します。

    これは、TimesTenClassicオブジェクトにConfigMapおよびシークレットを使用する例です。

    apiVersion: timesten.oracle.com/v5
    kind: TimesTenClassic
    metadata:
      name: sample
    spec:
      ttspec:
        storageClassName: oci-bv
        storageSize: 250Gi
        image: container-registry.oracle.com/timesten/timesten:22.1.1.36.0
        imagePullSecret: sekret
        dbConfigMap:
        - myconfig
        dbSecret:
        - mysecret

    myconfig ConfigMapおよびmysecretシークレットは、メタデータ・ファイルを保持します。tt-configボリュームには、myconfig ConfigMapおよびmysecretシークレットのコンテンツが含まれます。

初期化コンテナの使用

初期化コンテナを使用して、メタデータ・ファイルをTimesTenコンテナの/ttconfigディレクトリに配置できます。初期化コンテナでは、独自のスクリプトを作成して、/ttconfigディレクトリに移入できます。初期化コンテナの詳細は、次を参照してください。

https://kubernetes.io/docs/concepts/workloads/pods/init-containers

ノート:

dbConfigMapデータ項目とdbSecretデータ項目を使用して、TimesTenClassicオブジェクト内の1つ以上のConfigMapまたはシークレット(あるいはその両方)を指定できます。その結果、これらのConfigMapまたはシークレット(あるいはその両方)が/ttconfigで読取り専用でマウントされます。このようなマウントは読取り専用であるため、初期化コンテナからそれに書き込むことはできません。別の方法として、emptydirボリュームを使用し初期化コンテナを使用してそれにファイルを書き込むことはできます。ただし、ConfigMapとシークレットを初期化コンテナと組み合せることはできません。ConfigMapとシークレットの使用については、「ConfigMapおよびシークレットの使用」を参照してください。

TimesTenClassicオブジェクトに初期化コンテナを使用する方法を示す例を次に示します。template要素は必須です。この要素は、TimesTen Classicインスタンスを含むポッドに適用されます。この例は、/ttconfigディレクトリに移入するスクリプトを指定する場所を示しています。また、TimesTenClassicオブジェクトのvolumesフィールドでtt-configボリューム名を使用します。tt-config名でボリュームを指定すると、TimesTenコンテナの/ttconfigに自動的にマウントされます。

apiVersion: timesten.oracle.com/v5
kind: TimesTenClassic
metadata:
  name: init1
spec:
  ttspec:
    storageClassName: oci-bv
    storageSize: 250Gi
    image: container-registry.oracle.com/timesten/timesten:22.1.1.36.0
    imagePullSecret: sekret
  template:
    spec:
      imagePullSecrets: 
      - name: sekret
      initContainers:
      - name: initclassic
        image: container-registry.oracle.com/timesten/timesten:22.1.1.36.0
        command:
        - sh
        - "-c"
        - |
          /bin/bash <<'EOF'
          Your script to populate /ttconfig goes here
          EOF
        volumeMounts:
        - name: tt-config
          mountPath: /ttconfig
      volumes:
      - name: tt-config
        emptyDir: {}