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

前
 
次
 

A アクティブ・スタンドバイ・ペアの例

この付録では、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイおよび実行するための完全なプロセスの例を示します。データベースが稼働した後の例では、オペレータによるデータベースの制御方法と管理方法を示します。アクティブ・データベースで障害が発生した場合、オペレータは必要なタスクを実行してスタンバイ・データベースにフェイルオーバーし、そのスタンバイ・データベースをアクティブ・データベースにします。この例では最後に、TimesTenデータベースを削除し、オペレータを停止する手順を説明します。

環境の設定

例を始める前に、次のことを確認してください。

  • 前提条件を完了しました。必要な前提条件の詳細は、前提条件を参照してください。

環境を設定するには、Linux開発ホストから次のステップを実行します。

TimesTenオペレータのダウンロード

次のステップを実行して、TimesTenのフル・ディストリビューションをダウンロードし、その中に埋め込まれているTimesTenオペレータのディストリビューションを解凍します。すべてのステップをLinux開発ホストから実行します。

  1. 選択したディレクトリから次のことを実行します。

    • TimesTenのフル・ディストリビューションをダウンロードするサブディレクトリを1つ作成します。たとえば、installation_dirサブディレクトリを作成します。(この章ではこれ以降、installation_dirディレクトリを使用します。)

    • TimesTenオペレータのディストリビューションを解凍する2つ目のサブディレクトリを作成します。たとえば、kube_filesサブディレクトリを作成します。(この章ではこれ以降、このkube_filesディレクトリを使用します。)

    % mkdir -p installation_dir
    % mkdir -p kube_files
    

    これで、TimesTenのフル・ディストリビューションをダウンロードして解凍する準備ができました。

  2. installation_dirに移動します。

    % cd installation_dir
    

    このディレクトリにTimesTenのフル・ディストリビューションをダウンロードします。例として、timesten1814110.server.linux8664.zipファイル(Linux 64ビットの18.1.4.11.0フル・ディストリビューション)をダウンロードします。

  3. installation_dirから、ZIPユーティリティを使用してTimesTenのディストリビューションを解凍します。

    % unzip timesten1814110.server.linux8664.zip
    Archive:  /timesten/installation/timesten1814110.server.linux8664.zip
       creating: tt18.1.4.11.0/
       creating: tt18.1.4.11.0/ttoracle_home/
    ...
       creating: tt18.1.4.11.0/kubernetes/
    ...
    

    TimesTenのフル・ディストリビューションを正常に解凍しました。

    installation_dir/tt18.1.4.11.0/kubernetesディレクトリが作成されることに注意してください。operator.zipファイルは、このディレクトリにあります。たとえば、分散を解凍した後のディレクトリ構造の例を次に示します。

    % pwd
    installation_dir/tt18.1.4.11.0
    % dir
    3rdparty  include     lib      oraclescripts  README.html  ttoracle_home
    bin       info        network  PERL           startup
    grid      kubernetes  nls      plsql          support
    
  4. kube_filesディレクトリに移動し、operator.zipファイルをそのディレクトリに解凍します。この例では、installation_dir/tt18.1.4.11.0/kubernetes/operator.zipファイルを解凍します。

    % cd kube_files
    % unzip installation_dir/tt18.1.4.11.0/kubernetes/operator.zip
    [...UNZIP OUTPUT...]
    

    installation_dir/tt18.1.4.11.0/kubernetes/operator.zipファイルをkube_filesディレクトリに正常に解凍しました。

  5. ディレクトリ構造を確認します。この章の後半で、これらのサブディレクトリ内のファイルをいくつか変更します。この例では、リリースごとに変更される可能性がある最も重要なサブディレクトリとファイルを示します。

    README.md
    deploy/crd.yaml
    deploy/operator.yaml
    deploy/service_account.yaml
    operator/Dockerfile
    operator/timestenclassic-operator
    ttimage/agent2
    ttimage/.bashrc
    ttimage/create1.sql
    ttimage/create2.sql
    ttimage/Dockerfile
    ttimage/get1.sql
    ttimage/pausecq.sql
    ttimage/repcreate.sql
    ttimage/repduplicate.sql
    ttimage/runsql,sql
    ttimage/starthost.pl
    ttimage/.ttdotversion
    ttimage/.ttdrop
    

    ノート:

    このディレクトリ・ツリーは、TimesTenオペレータの存続期間中存続している必要があります。

    また、TimesTenのフル・ディストリビューション・ファイル(この例ではtimesten1814110.server.linux8664.zip)は削除しないでください。このファイルは次の場所にコピーする必要があります。

    • オペレータ・イメージを作成し、イメージをイメージ・レジストリにプッシュするための/operatorディレクトリ。詳細は、オペレータ・イメージの作成を参照してください。

    • TimesTenイメージをビルドし、イメージをイメージ・レジストリにプッシュするための/ttimageディレクトリ。詳細は、TimesTenイメージの作成を参照してください。


TimesTenオペレータのディストリビューションを正常にダウンロードし、展開しました。

Kubernetesの構成

オペレータは、Kubernetesサービス・アカウントを使用して実行されます。このサービス・アカウントにはネームスペースでの権限が必要です。これらの権限は、ロールを介して付与されます。service_account.yamlファイルは、サービス・アカウントとロールをネームスペースに追加し、ロールで指定された権限をサービス・アカウントに付与します。service_account.yamlファイルは、以前に解凍したoperator.zipファイルに含まれています。


ノート:

提供されたロールによって、timestenclassic-operatorにネームスペース内の幅広い権限が付与されます。service_account.yamlファイルで提供されている権限を調べて、権限を変更する必要があるかどうかを確認します。その場合は、この例のコマンドを実行する前に権限を変更してください。

次のステップを実行します。

  1. kube_files/deployディレクトリに移動します。

    % cd kube_files/deploy
    
  2. サービス・アカウントを作成します。

    % kubectl create -f service_account.yaml
    role.rbac.authorization.k8s.io/timestenclassic-operator created
    serviceaccount/timestenclassic-operator created
    rolebinding.rbac.authorization.k8s.io/timestenclassic-operator created
    

service_account.yamlファイルによって、timestenclassic-operatorサービス・アカウントとtimestenclassic-operatorロールがネームスペースに作成され、ロールで指定されている権限がサービス・アカウントに付与されました。

TimesTenClassic CRDのデプロイ

kube_files/deployディレクトリに移動し、kubectl createコマンドを使用して、TimesTenClassicのカスタマイズされたリソース定義(CRD)をKubernetesクラスタに作成します。

% cd kube_files/deploy
% kubectl create -f crd.yaml
customresourcedefinition.apiextensions.k8s.io/
timestenclassics.timesten.oracle.com created

TimesTenClassicオブジェクト・タイプをKubernetesクラスタに正常に追加しました。

オペレータ・イメージの作成

Kubernetesオペレータは、カスタマイズされたイメージを実行するポッドです。オペレータを実行する前に、このイメージを作成してイメージ・レジストリにプッシュする必要があります。

イメージの作成に必要なファイルは、kube_files/operatorディレクトリ(以前に解凍したZIPファイルの一部)にあります。kube_files/operatorディレクトリには、Dockerfileおよびオペレータ・イメージの作成に必要なバイナリがあります。

オペレータ・イメージを作成してレジストリにプッシュするには、次のステップを実行します。

  1. kube_files/operatorディレクトリに移動し、TimesTenのディストリビューションをそのディレクトリにコピーします。この例は、installation_dirディレクトリにtimesten1814110.server.linux8664.zipディストリビューションをダウンロードしたと仮定しています。詳細は、TimesTenオペレータのダウンロードを参照してください。その次に、timesten1814110.server.linux8664.zipファイルがkube_files/operatorディレクトリにあることを確認します。

    % cd kube_files/operator
    % cp installation_dir/timesten1814110.server.linux8664.zip .
    % ls -a
    Dockerfile
    timesten1814110.server.linux8664.zip
    timestenclassic-operator
    
  2. kube_files/operatorディレクトリに移動し(まだこのディレクトリにない場合)、dockerコマンドを使用してオペレータ・イメージを作成します。ttclassic-operator:3には任意の名前を選択できます(この例では太字で表示)。出力はリリースごとに変わる可能性があることに注意してください。

    % cd kube_files/operator
    % docker build -t ttclassic-operator:3 .
    Sending build context to Docker daemon  478.6MB
    Step 1/7 : FROM container-registry.oracle.com/os/oraclelinux:7
     ---> d788eca028a0
    Step 2/7 : ARG TT_DISTRO=timesten1814110.server.linux8664.zip
     ---> Using cache
     ---> a259a93fe906
    Step 3/7 : RUN yum -y install openssl unzip && /usr/sbin/useradd -d 
    /tt-operator -m -u 1001 -s /bin/nologin -U tt-operator
     ---> Using cache
     ---> e3f1427246ab
    Step 4/7 : COPY --chown=tt-operator:tt-operator timestenclassic-operator 
    /usr/local/bin/timestenclassic-operator
     ---> Using cache
     ---> 6ccad53230f0
    Step 5/7 : COPY --chown=tt-operator:tt-operator $TT_DISTRO /tt-operator/
    $TT_DISTRO
     ---> 5cd31705485a
    Step 6/7 : USER tt-operator
     ---> Running in 6a773ddac5dd
    Removing intermediate container 6a773ddac5dd
     ---> 875ee38ebc75
    Step 7/7 : ENTRYPOINT ["/usr/local/bin/timestenclassic-operator"]
     ---> Running in fed0f6c94c2f
    Removing intermediate container fed0f6c94c2f
     ---> 10dde79e1617
    Successfully built 10dde79e1617
    Successfully tagged ttclassic-operator:3
    
  3. dockerコマンドを使用して、オペレータ・イメージにタグを付けます。

    • phx.ocir.io/youraccountをイメージ・レジストリの場所に置き換えます。(この例では、phx.ocir.io/youraccount太字で表示されています。)

    • ttclassic-operator:3を、前のステップで選択した名前に置き換えます。(この例では、ttclassic-operator太字で表示されています。)

    % docker tag ttclassic-operator:3 phx.ocir.io/youraccount/ttclassic-operator:3
    
  4. オペレータ・イメージをレジストリにプッシュするには、dockerコマンドを使用します。

    • phx.ocir.io/youraccountをイメージ・レジストリの場所に置き換えます。(この例では、phx.ocir.io/youraccount太字で表示されています。)

    • ttclassic-operator:3を、前のステップで選択した名前に置き換えます。(この例では、ttclassic-operator:3太字で表示されています。)

    % docker push phx.ocir.io/youraccount/ttclassic-operator:3
    The push refers to repository [phx.ocir.io/youraccount/ttclassic-operator]
    46458e9fc890: Pushed
    471a399f0540: Pushed
    9e51a2b82af3: Pushed
    2f915858a916: Layer already exists
    3: digest: 
    sha256:9b941f12e3d52298b9b38f7766ddcdfb1d011857a990ff01a8adafd32f3d3e8d size: 
    1166
    

オペレータ・イメージを正常に作成し、イメージ・レジストリにプッシュしました。

オペレータのデプロイ

オペレータをデプロイするには、最初にネームスペースにあわせてカスタマイズしてからデプロイします。最後のステップとして、オペレータが実行されていることを確認できます。詳細は、オペレータのデプロイを参照してください。

ネームスペースのオペレータをカスタマイズするには、kube_files/deployディレクトリに移動し、operator.yamlファイルを編集します。このファイルは、以前に解凍したディストリビューションで提供されています。詳細は、TimesTenおよびTimesTenオペレータのダウンロードを参照してください。

  1. 太字で表示されている次のフィールド(次のoperator.yamlファイル内)を変更します。

    • replicas: 1

      1を、実行するオペレータのコピー数に置き換えます。開発およびテストには1を使用できます。ただし、高可用性を確保する目的で、複数のレプリカを実行できます。

    • sekretを、Kubernetesがレジストリからイメージを取得するために使用するイメージ・プル・シークレットの名前に置き換えます。

    • phx.ocir.io/youraccountを、イメージ・レジストリの場所に置き換えます。

    • ttclassic-operator:3を、前のステップで選択した名前に置き換えます。

    % cd kube_files/deploy
    % vi operator.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: timestenclassic-operator
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: timestenclassic-operator
      template:
        metadata:
          labels:
            name: timestenclassic-operator
        spec:
          serviceAccountName: timestenclassic-operator
          imagePullSecrets:
          - name: sekret
          containers:
            - name: timestenclassic-operator
              image: phx.ocir.io/youraccount/ttclassic-operator:3
              command:
              - timestenclassic-operator
              imagePullPolicy: Always
              env:
                - name: WATCH_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                - name: OPERATOR_NAME
                  value: "timestenclassic-operator"
                - name: GODEBUG
                  value: "x509ignoreCN=0"
    
  2. kubectl createコマンドを使用して、オペレータをネームスペースに定義し、オペレータを起動します。

    % kubectl create -f operator.yaml
    deployment.apps/timestenclassic-operator created
    

    オペレータをデプロイしました。これで、演算子が実行されます。

  3. kubectl get podsコマンドを使用して、オペレータが実行されていることを確認します。STATUSフィールドの値がRunningの場合、オペレータが実行されています。

    % kubectl get pods
    NAME                                       READY   STATUS    RESTARTS   AGE
    timestenclassic-operator-f84766548-5bzch   1/1     Running   0          37s
    

    オペレータが実行されていることを確認しました。

TimesTenイメージの作成

KubernetesクラスタでTimesTenを起動する前に、まずTimesTenをコンテナ・イメージとしてパッケージ化し、次にそのイメージをイメージ・レジストリにプッシュする必要があります。これを行う必要のあるファイルは、kube_filesディレクトリ・ツリーに表示されます。詳細は、TimesTenイメージの作成を参照してください。

TimesTenコンテナ・イメージを作成するには、次のステップを実行します。

  1. kube_files/ttimageディレクトリに移動し、TimesTenのディストリビューションをそのディレクトリにコピーします。この例は、installation_dirディレクトリにtimesten1814110.server.linux8664.zipディストリビューションをダウンロードしたと仮定しています。詳細は、TimesTenオペレータのダウンロードを参照してください。その次に、timesten1814110.server.linux8664.zipファイルがkube_files/ttimageディレクトリにあることを確認します。

    % cd kube_files/ttimage
    % cp installation_dir/timesten1814110.server.linux8664.zip .
    % ls *.zip
    timesten1814110.server.linux8664.zip
    
  2. kube_files/ttimageディレクトリに移動します(まだこのディレクトリにない場合)。Dockerfileを編集し、timesten1814110.server.linux8664.zipをTimesTenのフル・ディストリビューションの名前に置き換えます。TimesTenのディストリビューションがtimesten1814110.server.linux8664.zipの場合、変更の必要はありません。そうでない場合、必要な変更は太字で表示されます。ノート: TimesTenのフル・ディストリビューションは、18.1.4.11.0以降であることが必要です。

    % cd kube_files/ttimage
    % vi Dockerfile
    
    # Copyright (c) 2019, 2021, Oracle and/or its affiliates.
     
    FROM container-registry.oracle.com/os/oraclelinux:7
     
    ARG TT_DISTRO=timesten1814110.server.linux8664.zip
     
    RUN yum -y install tar gzip vim curl unzip libaio util-linux
    RUN groupadd -g 333 oracle
    RUN useradd -M -d /tt/home/oracle -s /bin/bash -u 333 -g oracle oracle
    RUN install -d -m 0750 -o oracle -g oracle /home/oracle
    COPY --chown=oracle:oracle $TT_DISTRO /home/oracle/
    COPY --chown=oracle:oracle .bashrc starthost.pl .ttdrop .ttdotversion agent2 
    create1.sql create2.sql get1.sql repcreate.sql repduplicate.sql runsql.sql 
    pausecg.sql /home/oracle/
    # Uncomment the following line if you are using the optional non-root 
    installation procedure.
    # USER 333
    ENTRYPOINT "/home/oracle/starthost.pl"
    
  3. dockerコマンドを使用して、TimesTenコンテナ・イメージを作成します。tt1814110を、選択した名前に置き換えます(次のdocker buildコマンドで太字で表示)。出力はリリースごとに変わる可能性があることに注意してください。

    % docker build -t tt1814110:3 .
    
    Sending build context to Docker daemon  445.8MB
    Step 1/9 : FROM container-registry.oracle.com/os/oraclelinux:7
     ---> d788eca028a0
    Step 2/9 : ARG TT_DISTRO=timesten1814110.server.linux8664.zip
     ---> Using cache
     ---> a259a93fe906
    Step 3/9 : RUN yum -y install tar gzip vim curl unzip libaio util-linux
     ---> Using cache
     ---> ac676b5376f3
    Step 4/9 : RUN groupadd -g 333 oracle
     ---> Using cache
     ---> ce16920f085c
    Step 5/9 : RUN useradd -M -d /tt/home/oracle -s /bin/bash -u 333 -g oracle 
    oracle
     ---> Using cache
     ---> 0319814aca1c
    Step 6/9 : RUN install -d -m 0750 -o oracle -g oracle /home/oracle
     ---> Using cache
     ---> c8612b53398a
    Step 7/9 : COPY --chown=oracle:oracle $TT_DISTRO /home/oracle/
     ---> 31cae98b71fd
    Step 8/9 : COPY --chown=oracle:oracle .bashrc starthost.pl .ttdrop 
    .ttdotversion agent2 create1.sql create2.sql get1.sql repcreate.sql 
    repduplicate.sql runsql.sql pausecg.sql /home/oracle/
     ---> e50eb99c9b54
    Step 9/9 : ENTRYPOINT "/home/oracle/starthost.pl"
     ---> Running in 0b41efd38837
    Removing intermediate container 0b41efd38837
     ---> 171245e546d5
    Successfully built 171245e546d5
    Successfully tagged tt1814110:3
    
  4. dockerコマンドを使用して、TimesTenコンテナ・イメージにタグを付けます。次のdocker tagコマンドで太字で表示されている次のものを置き換えます。

    • tt1814110:3: 前のステップで選択した名前に置き換えます。

    • phx.ocir.io/youraccount: イメージ・レジストリの場所に置き換えます。

    % docker tag tt1814110:3 phx.ocir.io/youraccount/tt1814110:3
    
  5. TimesTenコンテナ・イメージをレジストリにプッシュするには、dockerコマンドを使用します。次のdocker pushコマンドで太字で表示されている次のものを置き換えます。

    • phx.ocir.io/youraccount: イメージ・レジストリの場所に置き換えます。

    • tt1814110:3: 前に選択した名前に置き換えます。

    % docker push phx.ocir.io/youraccount/tt1814110:3
    
    The push refers to repository [phx.ocir.io/youraccount/tt1814110]
    97a0f250b2fe: Pushed
    650b003a3ad4: Pushed
    b8de51528854: Pushed
    62192d26e325: Pushed
    7dfe13e9b5a4: Pushed
    d8570fce965c: Pushed
    2f915858a916: Layer already exists
    3: digest: 
    sha256:a6ac313394229eb2256d4a56fbcd8e2eda50ea2cc21991fa76f11701f2299710 
    size: 1788
    

TimesTenコンテナ・イメージを正常に作成しました。イメージ・レジストリにプッシュされます。

ConfigMapオブジェクトの作成

この項では、sample ConfigMapを作成します。このConfigMapには、db.iniadminUserおよびschema.sqlメタデータ・ファイルが含まれます。このConfigMapはTimesTenClassicオブジェクトの定義時に参照されます。構成ファイルおよびConfigMap機能の詳細は、構成メタデータおよびKubernetes機能の理解を参照してください。

Linux開発ホストで、次のことを実行します。

  1. 選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_sampleサブディレクトリを作成します。(この例ではこれ以降、このディレクトリを示すためにcm_sampleディレクトリを使用します。)

    % mkdir -p cm_sample
    
  2. ConfigMapディレクトリに移動します。

    % cd cm_sample
    
  3. このConfigMapディレクトリ(この例ではcm_sample)にdb.iniファイルを作成します。このdb.iniファイルで、PermSize接続属性とDatabaseCharacterSet接続属性を定義します。

    vi db.ini
    
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    
  4. このConfigMapディレクトリ(この例ではcm_sample)にadminUserファイルを作成します。このadminUserファイルで、tigerパスワードを使用してscottユーザーを作成します。

    vi adminUser
    
    scott/tiger
    
  5. このConfigMapディレクトリ(この例ではcm_sample)にschema.sqlファイルを作成します。このschema.sqlファイルで、scottユーザーのs順序とemp表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。

    vi schema.sql
    
    create sequence scott.s;
    create table scott.emp (
      id number not null primary key,
      name char(32)
    );
    
  6. ConfigMapを作成します。cm_sampleディレクトリ内のファイルはConfigMapに組み込まれ、後でTimesTenコンテナで使用できます。

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

    • ConfigMapの名前はsampleです。sampleを選択した名前に置き換えます(この例では、sample太字で表示されています)。

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

    kubectl createコマンドを使用して、ConfigMapを作成します。

    % kubectl create configmap sample --from-file=cm_sample
    configmap/sample created
    

    sample ConfigMapを正常に作成し、デプロイしました。

  7. kubectl describeコマンドを使用して、ConfigMapのコンテンツを確認します。(この例ではsample。)

    % kubectl describe configmap sample
    Name:         sample
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
     
    Data
    ====
    adminUser:
    ----
    scott/tiger
     
    db.ini:
    ----
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
     
    schema.sql:
    ----
    create sequence scott.s;
    create table scott.emp (
      id number not null primary key,
      name char(32)
    );
     
     
    Events:  <none>
    

TimesTenClassicオブジェクトの作成

この項では、TimesTenClassicオブジェクトを作成します。TimesTenClassicオブジェクトの詳細は、TimesTenClassicオブジェクトの定義および作成およびTimesTenClassicオブジェクト・タイプを参照してください。

次のステップを実行します。

  1. 空のYAMLファイルを作成します。任意の名前を選択できますが、TimesTenClassicオブジェクトに使用した名前と同じ名前を使用することもできます。(この例では、sampleです。)YAMLファイルには、TimesTenClassicオブジェクトの定義が格納されています。このYAMLファイルで指定する必要があるフィールド、およびオプションのフィールドの詳細は、TimesTenClassicSpecSpecを参照してください。

    この例では、次のものを置き換えます。(置き換えることができる値は太字で表示されています。)

    • name: sampleを、TimesTenClassicオブジェクトの名前に置き換えます。

    • storageClassName: ociを、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。

    • storageSize: 250Gを、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。ノート: この例では、本番環境を想定していることから、storageSizeには250Gの値を使用しています。デモ用の場合は、50Gの値で対応できます。詳細は、表11-3「TimesTenClassicSpecSpec」storageSizeエントリとlogStorageSizeエントリを参照してください。

    • image: phx.ocir.io/youraccount/tt1814110:3は、イメージ・レジストリの場所(phx.ocir.io/youraccount)とTimesTenが含まれているイメージ(tt1814110:3)に置き換えます。

    • imagePullSecret: sekretを、KubernetesがTimesTenイメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。

    • dbConfigMap: この例では、db.iniadminUserおよびschema.sqlメタデータ・ファイルに1つのConfigMap (sampleという名前)を使用します。このConfigMapはProjectedVolumeに組み込まれます。このボリュームはTimesTenコンテナに/ttconfigとしてマウントされます。ConfigMapの詳細は、ConfigMapおよびシークレットの使用および1つのConfigMapを使用する例を参照してください。

    % vi sample.yaml
    
    apiVersion: timesten.oracle.com/v1
    kind: TimesTenClassic
    metadata:
      name: sample
    spec:
      ttspec:
        storageClassName: oci
        storageSize: 250G
        image: phx.ocir.io/youraccount/tt1814110:3
        imagePullSecret: sekret
        dbConfigMap:
        - sample
    
  2. kubectl createコマンドを使用して、YAMLファイル(この例ではsample.yaml)のコンテンツからTimesTenClassicオブジェクトを作成します。これにより、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。

    % kubectl create -f sample.yaml
    configmap/sample created
    timestenclassic.timesten.oracle.com/sample created
    

KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。

デプロイメントの監視

kubectl getコマンドとkubectl describeコマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。


ノート:

kubectl get timestenclassicコマンドとkubectl describe timestenclassicの場合、かわりにkubectl get ttckubectl describe ttcをそれぞれ指定できます。timestenclassicttcは、これらのコマンドで使用される場合同義であり、同じ結果を返します。この付録の最初のkubectl getおよび最初のkubectl describeの例では、timestenclassicを使用しています。この付録の残りの例では、簡略化のためにttcを使用します。

  1. kubectl getコマンドを使用して、STATEフィールドを確認します。値がInitializingであることを確認します。アクティブ・スタンバイ・ペアのプロビジョニングが開始しましたが、まだ完了していません。

    % kubectl get timestenclassic sample
    NAME     STATE          ACTIVE   AGE
    sample   Initializing   None     11s
    
  2. kubectl describeコマンドを使用して、初期プロビジョニングを詳細に表示します。

    % kubectl describe timestenclassic sample
    Name:         sample
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
    API Version:  timesten.oracle.com/v1
    Kind:         TimesTenClassic
    Metadata:
      Creation Timestamp:  2020-05-31T15:35:12Z
      Generation:          1
      Resource Version:    20231755
      Self Link: 
    /apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/sample
      UID:                 517a8646-a354-11ea-a9fb-0a580aed5e4a
    Spec:
      Ttspec:
        Db Config Map:
          sample
        Image:               phx.ocir.io/youraccount/tt1814110:3
        Image Pull Policy:   Always
        Image Pull Secret:   sekret
        Storage Class Name:  oci
        Storage Size:        250G
    Status:
      Active Pods:       None
      High Level State:  Initializing
      Last Event:        3
      Pod Status:
        Cache Status:
          Cache Agent:        Down
          Cache UID Pwd Set:  false
          N Cache Groups:     0
        Db Status:
          Db:            Unknown
          Db Id:         0
          Db Updatable:  Unknown
        Initialized:     true
        Pod Status:
          Agent:                Down
          Last Time Reachable:  0
          Pod IP:
          Pod Phase:            Pending
        Replication Status:
          Last Time Rep State Changed:  0
          Rep Agent:                    Down
          Rep Peer P State:             Unknown
          Rep Scheme:                   Unknown
          Rep State:                    Unknown
        Times Ten Status:
          Daemon:          Down
          Instance:        Unknown
          Release:         Unknown
        Admin User File:   false
        Cache User File:   false
        Cg File:           false
        High Level State:  Down
        Intended State:    Active
        Name:              sample-0
        Schema File:       false
        Cache Status:
          Cache Agent:        Down
          Cache UID Pwd Set:  false
          N Cache Groups:     0
        Db Status:
          Db:            Unknown
          Db Id:         0
          Db Updatable:  Unknown
        Initialized:     true
        Pod Status:
          Agent:                Down
          Last Time Reachable:  0
          Pod IP:
          Pod Phase:            Pending
        Replication Status:
          Last Time Rep State Changed:  0
          Rep Agent:                    Down
          Rep Peer P State:             Unknown
          Rep Scheme:                   Unknown
          Rep State:                    Unknown
        Times Ten Status:
          Daemon:            Down
          Instance:          Unknown
          Release:           Unknown
        Admin User File:     false
        Cache User File:     false
        Cg File:             false
        High Level State:    Unknown
        Intended State:      Standby
        Name:                sample-1
        Schema File:         false
      Rep Create Statement:  create active standby pair "sample" on 
     "sample-0.sample.mynamespace.svc.cluster.local", "sample" on 
     "sample-1.sample.mynamespace.svc.cluster.local" NO RETURN store "sample" on 
     "sample-0.sample.mynamespace.svc.cluster.local" PORT 4444 FAILTHRESHOLD 0 
     store "sample" on "sample-1.sample.mynamespace.svc.cluster.local" PORT 4444 
     FAILTHRESHOLD  0
      Rep Port:              4444
      Status Version:        1.0
    Events:
      Type  Reason  Age   From       Message
      ----  ------  ----  ----       -------
      -     Create  50s   ttclassic  Secret tt517a8646-a354-11ea-a9fb-0a580aed5e4a
     created
      -     Create  50s   ttclassic  Service sample created
      -     Create  50s   ttclassic  StatefulSet sample created
    
  3. kubectl getコマンドを再度使用して、STATEフィールドの値が変更されているかどうかを確認します。この例では、この値はNormalで、データベースのアクティブ・スタンバイ・ペアがプロビジョニングされ、プロセスが完了したことを示しています。

    % kubectl get ttc sample
    NAME     STATE    ACTIVE     AGE
    sample   Normal   sample-0   3m5s
    
  4. kubectl describeコマンドを再度使用して、アクティブ・スタンバイ・ペアのプロビジョニングを詳細に表示します。

    ノート: この例では、now Normal行が独立した行に表示されています。実際の出力では、この行は独立した行として表示されるのではなく、前のStateChangeの行の最後に表示されます。

    % kubectl describe ttc sample
    Name:         sample
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
    API Version:  timesten.oracle.com/v1
    Kind:         TimesTenClassic
    Metadata:
      Creation Timestamp:  2020-05-31T15:35:12Z
      Generation:          1
      Resource Version:    20232668
      Self Link:
    /apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/sample 
      UID:                 517a8646-a354-11ea-a9fb-0a580aed5e4a
    Spec:
      Ttspec:
        Db Config Map:
          sample
        Image:               phx.ocir.io/youraccount/tt1814110:3
        Image Pull Policy:   Always
        Image Pull Secret:   sekret
        Storage Class Name:  oci
        Storage Size:        250G
    Status:
      Active Pods:       sample-0
      High Level State:  Normal
      Last Event:        35
      Pod Status:
        Cache Status:
          Cache Agent:        Not Running
          Cache UID Pwd Set:  true
          N Cache Groups:     0
        Db Status:
          Db:            Loaded
          Db Id:         26
          Db Updatable:  Yes
        Initialized:     true
        Pod Status:
          Agent:                Up
          Last Time Reachable:  1590939597
          Pod IP:               192.0.2.1
          Pod Phase:            Running
        Replication Status:
          Last Time Rep State Changed:  0
          Rep Agent:                    Running
          Rep Peer P State:             start
          Rep Scheme:                   Exists
          Rep State:                    ACTIVE
        Times Ten Status:
          Daemon:          Up
          Instance:        Exists
          Release:         18.1.4.11.0
        Admin User File:   true
        Cache User File:   false
        Cg File:           false
        High Level State:  Healthy
        Intended State:    Active
        Name:              sample-0
        Schema File:       true
        Cache Status:
          Cache Agent:        Not Running
          Cache UID Pwd Set:  true
          N Cache Groups:     0
        Db Status:
          Db:            Loaded
          Db Id:         26
          Db Updatable:  No
        Initialized:     true
        Pod Status:
          Agent:                Up
          Last Time Reachable:  1590939597
          Pod IP:               192.0.2.2
          Pod Phase:            Running
        Replication Status:
          Last Time Rep State Changed:  1590939496
          Rep Agent:                    Running
          Rep Peer P State:             start
          Rep Scheme:                   Exists
          Rep State:                    STANDBY
        Times Ten Status:
          Daemon:            Up
          Instance:          Exists
          Release:           18.1.4.11.0
        Admin User File:     true
        Cache User File:     false
        Cg File:             false
        High Level State:    Healthy
        Intended State:      Standby
        Name:                sample-1
        Schema File:         true
      Rep Create Statement:  create active standby pair "sample" on 
    "sample-0.sample.mynamespace.svc.cluster.local", "sample" on 
    "sample-1.sample.mynamespace.svc.cluster.local" NO RETURN store "sample" on 
    "sample-0.sample.mynamespace.svc.cluster.local" PORT 4444 FAILTHRESHOLD 0 
    store "sample" on "sample-1.sample.mynamespace.svc.cluster.local" PORT 4444 
    FAILTHRESHOLD 0
      Rep Port:              4444
      Status Version:        1.0
    Events:
      Type  Reason       Age    From       Message
      ----  ------       ----   ----       -------
      -     Create       4m43s  ttclassic  Secret 
    tt517a8646-a354-11ea-a9fb-0a580aed5e4a created
      -     Create       4m43s  ttclassic  Service sample created
      -     Create       4m43s  ttclassic  StatefulSet sample created
      -     StateChange  3m47s  ttclassic  Pod sample-0 Daemon Unknown
      -     StateChange  3m47s  ttclassic  Pod sample-0 CacheAgent Unknown
      -     StateChange  3m47s  ttclassic  Pod sample-0 RepAgent Unknown
      -     StateChange  3m47s  ttclassic  Pod sample-1 Daemon Unknown
      -     StateChange  3m47s  ttclassic  Pod sample-1 CacheAgent Unknown
      -     StateChange  3m47s  ttclassic  Pod sample-1 RepAgent Unknown
      -     StateChange  3m26s  ttclassic  Pod sample-0 Agent Up
      -     StateChange  3m26s  ttclassic  Pod sample-0 Release 18.1.4.11.0
      -     StateChange  3m26s  ttclassic  Pod sample-0 Daemon Down
      -     StateChange  3m26s  ttclassic  Pod sample-1 Agent Up
      -     StateChange  3m26s  ttclassic  Pod sample-1 Release 18.1.4.11.0
      -     StateChange  3m26s  ttclassic  Pod sample-1 Daemon Down
      -     StateChange  3m26s  ttclassic  Pod sample-0 Daemon Up
      -     StateChange  3m25s  ttclassic  Pod sample-1 Daemon Up
      -     StateChange  2m13s  ttclassic  Pod sample-0 RepState IDLE
      -     StateChange  2m13s  ttclassic  Pod sample-0 Database Updatable
      -     StateChange  2m13s  ttclassic  Pod sample-0 CacheAgent Not Running
      -     StateChange  2m13s  ttclassic  Pod sample-0 RepAgent Not Running
      -     StateChange  2m13s  ttclassic  Pod sample-0 RepScheme None
      -     StateChange  2m13s  ttclassic  Pod sample-0 Database Loaded
      -     StateChange  2m11s  ttclassic  Pod sample-0 RepAgent Running
      -     StateChange  2m10s  ttclassic  Pod sample-0 RepScheme Exists
      -     StateChange  2m10s  ttclassic  Pod sample-0 RepState ACTIVE
      -     StateChange  113s   ttclassic  Pod sample-1 Database Loaded
      -     StateChange  113s   ttclassic  Pod sample-1 Database Not Updatable
      -     StateChange  113s   ttclassic  Pod sample-1 CacheAgent Not Running
      -     StateChange  113s   ttclassic  Pod sample-1 RepAgent Not Running
      -     StateChange  113s   ttclassic  Pod sample-1 RepScheme Exists
      -     StateChange  113s   ttclassic  Pod sample-1 RepState IDLE
      -     StateChange  106s   ttclassic  Pod sample-1 RepAgent Running
      -     StateChange  101s   ttclassic  Pod sample-1 RepState STANDBY
      -     StateChange  101s   ttclassic  TimesTenClassic was Initializing, 
    now Normal
    

TimesTenデータベースのアクティブ・スタンバイ・ペアが(Normalで示されているように)正常にデプロイされました。アクティブ・スタンバイ・ペアとして構成された2つのTimesTenデータベースがあります。1つのデータベースがアクティブです。(この例では、Rep State ACTIVEで示されているように、sample-0がアクティブ・データベースです。)もう1つのデータベースはスタンバイです。(この例では、Rep State STANDBYで示されているように、sample-1はスタンバイ・データベースです。)アクティブ・データベースは、変更および問合せできます。アクティブ・データベースで行われた変更は、スタンバイ・データベースにレプリケートされます。アクティブ・データベースで障害が発生した場合、オペレータは自動的にスタンバイ・データベースをアクティブに昇格させます。以前のアクティブ・データベースは修復または置換され、スタンバイになります。

基礎となるオブジェクトが存在するかどうかの確認

kubectl describeコマンドを使用して、基礎となるオブジェクトを確認します。

  1. StatefulSet:

    % kubectl get statefulset sample
    NAME     READY   AGE
    sample   2/2     8m21s
    
  2. サービス:

    % kubectl get service sample
    NAME     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    sample   ClusterIP   None         <none>        6625/TCP   9m28s
    
  3. ポッド:

    % kubectl get pods
    NAME                                        READY   STATUS    RESTARTS   AGE
    sample-0                                    2/2     Running   0          10m
    sample-1                                    2/2     Running   0          10m
    timestenclassic-operator-5d7dcc7948-8mnz4   1/1     Running   0          11h
    
  4. PersistentVolumeClaims (PVC):

    % kubectl get pvc
    NAME                         STATUS   VOLUME 
    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    tt-persistent-sample-0       Bound
    ocid1.volume.oc1.phx.abyhqljrbxcgzyixa4pmmcwiqxgqclc7gxvdnoty367w2qn26tij6kfpx
    6qq
    250Gi       RWO            oci            10m
    tt-persistent-sample-1       Bound
    ocid1.volume.oc1.phx.abyhqljtt4qxxoj5jqiskriskh66hakaw326rbza4uigmuaezdnu53qhh
    oaa
    250Gi       RWO            oci            10m
    

アクティブTimesTenデータベースへの接続の確認

kubectl execコマンドを実行して、ポッドのシェルを起動し、それらのポッドで実行されているTimesTenを制御できます。TimesTenは、ポッドでoracleユーザーとして実行されます。ポッドでシェルを確立したら、su - oracleコマンドを使用してoracleユーザーに切り替えます。oracleユーザーに切り替えた後、sampleデータベースに接続できること、およびメタデータ・ファイルの情報が正しいことを確認します。オプションで、データベースまたは他の操作に対して問合せを実行できます。

  1. ポッドでシェルを確立し、oracleユーザーに切り替えます

    % kubectl exec -it sample-0 -c tt -- /usr/bin/su - oracle 
    
  2. sampleデータベースに接続します。メタデータ・ファイルの情報がデータベースに正しく存在していることを確認します。たとえば、scottユーザーとしてデータベースへの接続を試みます。200PermSize値が正しいことを確認します。scott.emp表が存在することを確認します。

     % ttIsql sample
     
    Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
    Type ? or "help" for help, type "exit" to quit ttIsql.
     
     
     
    connect "DSN=sample";
    Connection successful:
    DSN=sample;UID=oracle;DataStore=/tt/home/oracle/datastore/sample;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;PermSize=200;
    DDLReplicationLevel=3;
    (Default setting AutoCommit=1)
    
    Command> connect adding "uid=scott;pwd=tiger" as scott;
    Connection successful:
    DSN=sample;UID=scott;DataStore=/tt/home/oracle/datastore/sample;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;PermSize=200;
    DDLReplicationLevel=3;
    (Default setting AutoCommit=1)
    scott: Command> tables;
      SCOTT.EMP
    1 table found.
    

障害からのリカバリ

この例では、アクティブTimesTenデータベースの障害をシミュレートします。これは、デモのみを目的としています。本番環境では実行しないでください。

  1. kubectl delete podコマンドを使用して、アクティブ・データベース(この場合はsample-0)を削除します

    % kubectl delete pod sample-0
    
  2. kubectl describeコマンドを使用して、オペレータがどのように障害からリカバリするかを確認します。オペレータは、スタンバイ・データベース(sample-1)をアクティブに昇格させます。sample-0データベースに接続されていたすべてのアプリケーションは、TimesTenによってsample-1データベースに自動的に再接続されます。短時間の停止後、アプリケーションは引き続きデータベースを使用できます。アクティブ・スタンバイ・ペアの状態の詳細は、データベースのアクティブ・スタンバイ・ペアの状態の監視を参照してください。

    ノート: この例では、3つの状態変更に対するMessage列のテキストが2行に表示されています。ただし、これら3つの状態変更に対する実際の出力は1行に表示されます。

    % kubectl describe ttc sample
    Name:         sample
    ...
    Events:
      Type  Reason       Age    From       Message
      ----  ------       ----   ----       -------
      -     StateChange  2m1s   ttclassic  TimesTenClassic sample: was Normal,
    now ActiveDown
      -     StateChange  115s   ttclassic  Pod sample-1 Database Updatable: Yes
      -     StateChange  115s   ttclassic  TimesTenClassic sample:was ActiveDown,
    now StandbyDown
      -     StateChange  115s   ttclassic  Pod sample-1 RepState ACTIVE
      -     StateChange  110s   ttclassic  Pod sample-0 High Level State Unknown
      -     StateChange  63s    ttclassic  Pod sample-0 Pod Phase Running
      -     StateChange  63s    ttclassic  Pod sample-0 Agent Up
      -     StateChange  63s    ttclassic  Pod sample-0 Instance Exists
      -     StateChange  63s    ttclassic  Pod sample-0 Daemon Up
      -     StateChange  63s    ttclassic  Pod sample-0 Database None
      -     StateChange  42s    ttclassic  Pod sample-0 Database Loaded
      -     StateChange  42s    ttclassic  Pod sample-0 Database Updatable: No
      -     StateChange  42s    ttclassic  Pod sample-0 RepAgent Running
      -     StateChange  42s    ttclassic  Pod sample-0 CacheAgent Not Running
      -     StateChange  42s    ttclassic  Pod sample-0 RepScheme Exists
      -     StateChange  42s    ttclassic  Pod sample-0 RepState IDLE
      -     StateChange  36s    ttclassic  Pod sample-0 High Level State Healthy
      -     StateChange  36s    ttclassic  Pod sample-0 RepState STANDBY
      -     StateChange  36s    ttclassic  TimesTenClassic sample:was StandbyDown,
    now Normal
    

    Kubernetesは新しいsample-0ポッドを自動的に生成し、削除したポッドに置き換えます。オペレータはそのポッド内でTimesTenを構成し、ポッドのデータベースを新しいスタンバイ・データベースとして起動します。データベースのレプリケート・ペアは、再び正常に機能します。

クリーン・アップ

この例では、TimesTenClassicに関連付けられているデータベースおよびすべてのオブジェクトの削除を完了します。これらのステップは、例としてのみ使用されます。これらのステップを実行すると、TimesTenデータベースを実行しているポッドが終了し、TimesTenデータベース自体が削除されます。

  1. ConfigMapオブジェクト(この例ではsample)を削除します。

    % kubectl delete configmap sample
    configmap "sample" deleted
    
  2. TimesTenClassicオブジェクトと基礎となるオブジェクトを削除します。

    % kubectl delete -f sample.yaml
    timestenclassic.timesten.oracle.com "sample" deleted
    
  3. TimesTenデータベースを実行していたポッドが存在しないことを確認します。

    % kubectl get pods
    NAME                                        READY   STATUS    RESTARTS   AGE
    timestenclassic-operator-5d7dcc7948-8mnz4   1/1     Running   0          5d23h
    
  4. データベースの保持に使用する永続記憶域を削除します。これは手動で行う必要があります。

    % kubectl get pvc
    NAME                     STATUS   VOLUME
    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    tt-persistent-sample-0   Bound
    ...
    
    tt-persistent-sample-1   Bound
    ...
    % kubectl delete pvc tt-persistent-sample-0
    persistentvolumeclaim "tt-persistent-sample-0" deleted
    % kubectl delete pvc tt-persistent-sample-1
    persistentvolumeclaim "tt-persistent-sample-1" deleted
    
  5. オペレータが不要になった場合は、停止できます。/deployディレクトリ(この例ではkube_files/deploy)に移動し、kubectl deleteコマンドを使用してオペレータを停止します。

    % cd kube_files/deploy
    % kubectl delete -f operator.yaml
    deployment.apps "timestenclassic-operator" deleted