6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Oracle Database Operator for KubernetesでShardingをやってみる

Last updated at Posted at 2022-02-09

はじめに

Oracleでは昨年、Oracle Databaseをk8s上で動作させるための手段として、Kubernetes Operatorパターンを利用したOracle Database Operator for Kubernetes(通称「OraOperator」)をリリースしました。
現時点(2021/2時点)では、まだα版かつ商用利用不可ですが、今実装されている機能をいくつか紹介していきたいと思います。

なお、OraOperatorについては、昨年のOracle Database Worldでも紹介されているので、併せてご覧ください。

OraOperatorとは

OraOperatorはOracleが開発したk8sネイティブにOracle Databaseを動作させたり、管理するためのKubernetes Operatorです。
現時点で、OraOperatorは以下の3環境のみサポートしています.

また、今の時点で実装されている機能は以下の通りです。

  • Autonomous DatabaseのSharedモデルに対する以下の操作
    • プロビジョニング
    • 既存Autonomous Databaseのバインド(OraOperatorへの紐付け)
    • 起動/停止
    • 削除
    • スケール
  • シングルインスタンスのOracle Database(コンテナ)に対する以下の操作
    • プロビジョニング
    • クローン
    • パッチ
    • データベース初期化パラメータのアップデート
    • データベース設定のアップデート
    • Oracle Enterprise Manager(EM)Express
  • Oracle Database(コンテナ)のシャーディング構成
    • シャードデータベースとトポロジのデプロイ
    • 新しいシャードの追加
    • 既存シャードの削除

Autonomous Databaseに対する操作をこの記事で取り上げても面白くないので、この記事ではOracle Database(コンテナ)のシャーディング構成を簡単に試してみたいと思います。
ちなみに、シングルインスタンスのOracle Database(コンテナ)の操作については、簡単ですが、こちらのイベントで取り上げているので、よければご覧ください。
動画セッション資料はこちらにあります。

OraOperatorを利用したシャーディング構成

今回は動作環境として、OKE v1.21を利用していきたいと思います。

環境構築

OKEの初期構築についてはこちらをご確認ください。

OraOperatorのインストール

まずは、OraOperatorをインストールするための事前作業を行なっていきます。

OraOperatorは、ユーザからのパラメータを検証するためにWebhookを利用しますが、そこで必要となるTLS証明書を生成するためにcert-managerをインストールします。

kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml

次に、OraOperatorのレポジトリをcloneしておきます。

git clone https://github.com/oracle/oracle-database-operator.git

レポジトリの中にあるoracle-database-operator.yamlをapplyします。
このManifestの中にOraOperatorに必要なCustomResourceDefinitionなどが含まれています。

kubectl apply -f oracle-database-operator.yaml

これでOraOperatorのインストールは完了です。

Oracle DatabaseとGlobal Data Service(GDS)のコンテナイメージの準備

ここでは、シャーディング構成を構築するにあたってのOracle DatabaseおよびGlobal Data Service(GDS)のコンテナイメージを準備します。
Global Data Service(GDS)についてはこちらをご確認ください。

この2つのコンテナイメージはOracle Container RegistryDatabase Repositoriesに格納されています。
利用するイメージはgsmenterpriseです。
このコンテナイメージの取得にはOracle シングルサインオンアカウントが必要です。

今回は、Oracle Container Registryに格納されているコンテナイメージを使っていきたいと思います。

Oracle Container Registryでは、事前に利用規約および制限事項に同意して頂く必要があるので、Webサイトの方から同意してください。

また、独自のコンテナイメージを構築することもでき、それぞれ以下のレポジトリよりビルドすることができます。

シャーディング構成の構築

ここからは、実際にOracle Databaseのシャーディング構成を構築していきます。

まずは、シャーディング構成を構築する環境のネームスペースを作成します。
今回は、shnsという名前で作成します。

kubectl create ns shns

次に、Oracle Container RegistryからコンテナイメージをpullできるようにするためのSecretを作成しておきます。

<your-sso-username><your-sso-password>はご自身のアカウントに置き換えてください。
--docker-emailで指定するメールアドレスは適当で構いません。

kubectl create secret docker-registry ocr-reg-cred --docker-username=<your-sso-username> \
  --docker-server=https://container-registry.oracle.com --docker-password=<your-sso-password> \
  --docker-email=xxxx.xxxx@oracle.com -n shns

次に、後ほどデータベースに外部接続できるようにするために、Manifestを少し編集しておきます。

ちなみに、今回は以下のシャーディング構成を構築します。

  • シャードデータベース1
  • シャードデータベース2
  • Global Service Manager(GSM)1
  • Global Service Manager(GSM)2
  • カタログデータベース
vim docs/sharding/provisioning/shard_prov.yaml

isExternalSvcというフィールドをTrueに設定します。
これで、シャーディング構成が構築された場合にそのデータベースに外部接続可能なLoadBalancer(今回はOCI LoadBalancer)がプロビジョニングされます。

#
# Copyright (c) 2021, Oracle and/or its affiliates. 
# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
#
apiVersion: database.oracle.com/v1alpha1
kind: ShardingDatabase
metadata:
  name: shardingdatabase-sample
  namespace: shns
spec:
 shard:
    - name: shard1
      storageSizeInGb: 50
    - name: shard2
      storageSizeInGb: 50
 catalog:
    - name: catalog
      storageSizeInGb: 50
 gsm:
    - name: gsm1
      storageSizeInGb: 50
      replicas: 1
      envVars:
        - name:  "SERVICE1_PARAMS"
          value: "service_name=oltp_rw_svc;service_role=primary"
        - name:  "SERVICE2_PARAMS"
          value: "service_name=oltp_ro_svc;service_role=primary"
    - name: gsm2
      storageSizeInGb: 50
      replicas: 1
      envVars:
        - name:  "SERVICE1_PARAMS"
          value: "service_name=oltp_rw_svc;service_role=primary"
        - name:  "SERVICE2_PARAMS"
          value: "service_name=oltp_ro_svc;service_role=primary"
 storageClass: oci
 dbImage: container-registry.oracle.com/database/enterprise:latest
 dbImagePullSecret: ocr-reg-cred
 gsmImage: container-registry.oracle.com/database/gsm:latest
 gsmImagePullSecret: ocr-reg-cred
 scriptsLocation: "set -ex;curl https://codeload.github.com/oracle/db-sharding/tar.gz/master |   tar -xz --strip=4 db-sharding-master/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts; cp -i -r scripts/* /opt/oracle/scripts/sharding/scripts/;cp -i -r scripts/*py /opt/oracle/scripts/sharding"
 secret: db-user-pass
 isExternalSvc: false  <= #ここを"True"に
 isDeleteOraPvc: True
 namespace: shns

次に、シャーディング構成で構築するデータベースのデータベースパスワードをSecretとして作成します。
今回は、パスワードをORacle_21cとします。

# 一時ディレクトリ作成
mkdir /tmp/.secrets/
# ランダムOpenssl keyの作成
openssl rand -hex 64 -out /tmp/.secrets/pwd.key
# 必要なパスワードを使用して、テキストファイルに追加
echo ORacle_21c > /tmp/.secrets/common_os_pwdfile
# 上記で生成されたランダムなopensslキーを使用して、ファイルを暗号化
openssl enc -aes-256-cbc -md md5 -salt -in /tmp/.secrets/common_os_pwdfile -out /tmp/.secrets/common_os_pwdfile.enc -pass file:/tmp/.secrets/pwd.key
# セキュリティのため、パスワードテキストファイルの削除
rm -f /tmp/.secrets/common_os_pwdfile
# Secretの作成
kubectl create secret generic db-user-pass --from-file=/tmp/.secrets/common_os_pwdfile.enc --from-file=/tmp/.secrets/pwd.key -n shns
# Secretの確認
kubectl get secret -n shns

opensslについて
上記手順で利用するopensslコマンドですが、バージョンやFIPSモード有無によって、この後作成するPodが起動しない可能性があります。
私の環境では、以下のバージョンで試しているので、取り急ぎ試したい方はご参考にしてください。

$ openssl version
OpenSSL 1.1.1g FIPS  21 Apr 2020

次に、実際にシャーディング構成を構築するManifestをデプロイしていきます。

kubectl apply -f docs/sharding/provisioning/shard_prov.yaml

これでシャーディング構成が自動的に構築されます。

以下のコマンドを実行し、すべてのPodが起動するまで少し待機します。

kubectl get pods -n shns -w

以下のようになれば起動完了です。
コンテナイメージがかなり重いので、初回起動時はすべてのPodがRunningになるまで少し時間がかかります。(目安は10〜15分程度です)

NAME        READY   STATUS    RESTARTS   AGE
catalog-0   1/1     Running   0          10m
gsm1-0      1/1     Running   0          10m
gsm2-0      1/1     Running   0          10m
shard1-0    1/1     Running   0          10m
shard2-0    1/1     Running   0          10m

データベースへの接続

最後に構築したシャーディング構成に接続してみます。
まずは、Serviceを確認してみます。
以下のようにEXTERNAL-IPが付与されていることが確認できます。
ちなみにHeadless Serviceも存在しています。
これは、OCI LoadBalancerのグローバルIPです。

$ kubectl get svc -n shns
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                                                       AGE
catalog        ClusterIP      None            <none>            1521/TCP,6234/TCP,6123/TCP,8080/TCP                           75m
catalog0-svc   LoadBalancer   10.96.205.130   129.158.xxx.xxx    1521:30418/TCP,6234:30705/TCP,6123:30797/TCP,8080:30359/TCP   74m
gsm1           ClusterIP      None            <none>            1522/TCP,6234/TCP,6123/TCP,8080/TCP                           75m
gsm10-svc      LoadBalancer   10.96.110.201   129.153.xxx.xxx   1522:30963/TCP,6234:32176/TCP,6123:31227/TCP,8080:30845/TCP   73m
gsm2           ClusterIP      None            <none>            1522/TCP,6234/TCP,6123/TCP,8080/TCP                           75m
gsm20-svc      LoadBalancer   10.96.206.156   152.xxx.xxx.xxx    1522:30813/TCP,6234:31681/TCP,6123:32605/TCP,8080:31177/TCP   72m
shard1         ClusterIP      None            <none>            1521/TCP,6234/TCP,6123/TCP,8080/TCP                           75m
shard10-svc    LoadBalancer   10.96.20.133    129.159.xxx.xxx   1521:30976/TCP,6234:30188/TCP,6123:31735/TCP,8080:31039/TCP   75m
shard2         ClusterIP      None            <none>            1521/TCP,6234/TCP,6123/TCP,8080/TCP                           75m
shard20-svc    LoadBalancer   10.96.51.140    129.153.xxx.xxx   1521:30293/TCP,6234:30964/TCP,6123:32069/TCP,8080:32229/TCP   74m

今回はお試しでシャード・カタログのデータベース(catalogpdb)に接続してみます。

$ sql sys/ORacle_21c@//129.158.xxx.xxx:1521/catalogpdb as sysdba

SQLcl: Release 20.3 Production on Wed Feb 09 08:31:27 2022

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0


SQL> select * from dual;

   DUMMY 
________ 
X        

SQL> 

無事接続できました。
本来であれば、データベースにLoadBalancer経由で接続することはないと思いますが、現状のOraOperatorだとこの接続方法とHeadless Serviceを利用した2通りの接続方法しかないように見えるので、まだα版ということもありご勘弁を...

他のデータベースに接続する方法はこちらに記載されているので、遊んでみてください!

まとめ

試してきたように、レガシーのイメージが強いOracle Databaseでも、Kubernetes Operatorを利用してk8sネイティブに動作させるような取り組みが始まっています。
今後もいろんな機能や操作対象が増えてくると思うので、期待ですね!
今回試したシャーディング構成以外にも、シングルインスタンス構成含めて様々なユースケースのManifestがレポジトリに配置されているので、興味がある方はぜひお試しください!

またOraOperatorでアップデートがありましたら、記事にしようかと思います。

参考記事

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?