メインコンテンツまでスキップ
バージョン: 3.15

Helm Chart をはじめよう (cert-manager を使用した TLS 対応 ScalarDB Cluster)

このチュートリアルでは、テスト環境の Kubernetes クラスターで Helm Charts と cert-manager を使用して、TLS 構成の ScalarDB Cluster を開始する方法について説明します。開始する前に、テスト用の Mac または Linux 環境がすでに用意されている必要があります。また、このチュートリアルでは minikube の使用について説明していますが、説明されている手順はどの Kubernetes クラスターでも機能するはずです。

要件

  • ScalarDB Cluster のライセンスキー (試用ライセンスまたは商用ライセンス) が必要です。ライセンスキーをお持ちでない場合は、お問い合わせください。
  • TLS をサポートする ScalarDB Cluster 3.12以降を使用する必要があります。

作成するもの

このチュートリアルでは、次の方法で Kubernetes クラスターに次のコンポーネントをデプロイします。

+----------------------------------------------------------------------------------------------------------------------------------------------------+
| [Kubernetes Cluster] |
| [Pod] [Pod] [Pod] |
| |
| +-------+ +------------------------+ |
| +---> | Envoy | ---+ +---> | ScalarDB Cluster node | ---+ |
| [Pod] | +-------+ | | +------------------------+ | |
| | | | | |
| +-----------+ +---------+ | +-------+ | +--------------------+ | +------------------------+ | +---------------+ |
| | Client | ---> | Service | ---+---> | Envoy | ---+---> | Service | ---+---> | ScalarDB Cluster node | ---+---> | PostgreSQL | |
| | (SQL CLI) | | (Envoy) | | +-------+ | | (ScalarDB Cluster) | | +------------------------+ | | (For Ledger) | |
| +-----------+ +---------+ | | +--------------------+ | | +---------------+ |
| | +-------+ | | +------------------------+ | |
| +---> | Envoy | ---+ +---> | ScalarDB Cluster node | ---+ |
| +-------+ +------------------------+ |
| |
| +----------------------------------------------------------------------------------+ +---------------------+ |
| | cert-manager (create private key and certificate for Envoy and ScalarDB Cluster) | | Issuer (Private CA) | |
| +----------------------------------------------------------------------------------+ +---------------------+ |
| |
+----------------------------------------------------------------------------------------------------------------------------------------------------+

cert-manager は、TLS 接続用に次の秘密鍵と証明書ファイルを自動的に作成します。

                                                           +----------------------+
+---> | For Scalar Envoy |
| +----------------------+
| | tls.key |
| | tls.crt |
+-------------------------+ | +----------------------+
| Issuer (Self-signed CA) | ---(Sign certificates)---+
+-------------------------+ | +----------------------+
| tls.key | +---> | For ScalarDB Cluster |
| tls.crt | +----------------------+
| ca.crt | | tls.key |
+-------------------------+ | tls.crt |
+----------------------+

Scalar Helm Charts は、Envoy および ScalarDB Cluster の各秘密鍵と証明書ファイルを次のように自動的にマウントし、各接続で TLS を有効にします。ルート CA 証明書ファイルはクライアントに手動でマウントします。

+-------------------------------------+                            +------------------------------------------------+      +--------------------------------+
| Client | ---(CRUD/SQL requests)---> | Envoy for ScalarDB Cluster | ---> | ScalarDB Cluster nodes |
+-------------------------------------+ +------------------------------------------------+ +--------------------------------+
| ca.crt (to verify tls.crt of Envoy) | | tls.key | | tls.key |
+-------------------------------------+ | tls.crt | | tls.crt |
| ca.crt (to verify tls.crt of ScalarDB Cluster) | | ca.crt (to check health) |
+------------------------------------------------+ +--------------------------------+

ScalarDB Cluster 関連コンポーネント間には、次の接続が存在します。

  • クライアント - ScalarDB Cluster の Envoy: CRUD API または SQL API 関数を実行すると、クライアントは ScalarDB Cluster の Envoy にアクセスします。
  • ScalarDB Cluster の Envoy - ScalarDB Cluster: Envoy は ScalarDB Cluster の前で L7 (gRPC) ロードバランサーとして機能します。
  • ScalarDB Cluster ノード - ScalarDB Cluster ノード: ScalarDB Cluster ノードは他の ScalarDB Cluster ノードにアクセスします。つまり、クラスターの内部通信はすべての ScalarDB Cluster ノード間で行われます。

ステップ1. Kubernetesクラスターを起動してツールをインストールする

Kubernetes クラスターを準備し、いくつかのツール (kubectlhelmcfssl、および cfssljson) をインストールする必要があります。インストール方法の詳細については、Scalar Helm Charts の使用開始を参照してください。

ステップ2. PostgreSQLコンテナを起動する

ScalarDB Cluster では、バックエンドデータベースとして何らかのデータベースシステムを使用する必要があります。このチュートリアルでは、PostgreSQL を使用します。

次のようにして Kubernetes クラスターに PostgreSQL をデプロイできます。

  1. Bitnami helm リポジトリを追加します。

    helm repo add bitnami https://charts.bitnami.com/bitnami
  2. ScalarDB Cluster 用に PostgreSQL をデプロイします。

    helm install postgresql-scalardb-cluster bitnami/postgresql \
    --set auth.postgresPassword=postgres \
    --set primary.persistence.enabled=false \
    -n default
  3. PostgreSQL コンテナが実行されているかどうかを確認します。

    kubectl get pod -n default

    [コマンド実行結果]

    NAME                            READY   STATUS    RESTARTS   AGE
    postgresql-scalardb-cluster-0 1/1 Running 0 34s

ステップ3. 作業ディレクトリを作成する

ローカルにいくつかの設定ファイルを作成します。必ずそれらのファイル用の作業ディレクトリを作成してください。

  1. 作業ディレクトリを作成します。

    mkdir -p ${HOME}/scalardb-cluster-test/

ステップ4. cert-manager と issuer リソースをデプロイする

このチュートリアルでは、cert-manager を使用して秘密鍵と証明書を発行および管理します。次のようにして、Kubernetes クラスターに cert-manager をデプロイできます。

  1. Jetstack helm リポジトリを追加します。

    helm repo add jetstack https://charts.jetstack.io
  2. cert-manager をデプロイします。

    helm install cert-manager jetstack/cert-manager \
    --create-namespace \
    --set installCRDs=true \
    -n cert-manager
  3. cert-manager コンテナが実行されているかどうかを確認します。

    kubectl get pod -n cert-manager

    [コマンド実行結果]

    NAME                                      READY   STATUS    RESTARTS   AGE
    cert-manager-6dc66985d4-6lvtt 1/1 Running 0 26s
    cert-manager-cainjector-c7d4dbdd9-xlrpn 1/1 Running 0 26s
    cert-manager-webhook-847d7676c9-ckcz2 1/1 Running 0 26s
  4. 作業ディレクトリを ${HOME}/scalardb-cluster-test/ に変更します。

    cd ${HOME}/scalardb-cluster-test/
  5. プライベート CA のカスタム値ファイル (private-ca-custom-values.yaml) を作成します。

    cat << 'EOF' > ${HOME}/scalardb-cluster-test/private-ca-custom-values.yaml
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
    name: self-signed-issuer
    spec:
    selfSigned: {}
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
    name: self-signed-ca-cert
    spec:
    isCA: true
    commonName: self-signed-ca
    secretName: self-signed-ca-cert-secret
    privateKey:
    algorithm: ECDSA
    size: 256
    issuerRef:
    name: self-signed-issuer
    kind: Issuer
    group: cert-manager.io
    ---
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
    name: self-signed-ca
    spec:
    ca:
    secretName: self-signed-ca-cert-secret
    EOF
  6. 自己署名 CA を展開します。

    kubectl apply -f ./private-ca-custom-values.yaml
  7. 発行者リソースが True であるかどうかを確認します。

    kubectl get issuer

    [コマンド実行結果]

    NAME                 READY   AGE
    self-signed-ca True 6s
    self-signed-issuer True 6s

ステップ5. Helm Charts を使用して Kubernetes クラスターに ScalarDB Cluster をデプロイする

  1. Scalar Helm Charts リポジトリを追加します。

    helm repo add scalar-labs https://scalar-labs.github.io/helm-charts
  2. ライセンスキーと証明書を環境変数として設定します。ライセンスキーがない場合は、お問い合わせください。<CERT_PEM_FOR_YOUR_LICENSE_KEY> の値の詳細については、製品ライセンスキーを構成する方法を参照してください。

    SCALAR_DB_CLUSTER_LICENSE_KEY='<YOUR_LICENSE_KEY>'
    SCALAR_DB_CLUSTER_LICENSE_CHECK_CERT_PEM='<CERT_PEM_FOR_YOUR_LICENSE_KEY>'
  3. ScalarDB Cluster のカスタム値ファイル (scalardb-cluster-custom-values.yaml) を作成します。

    cat << 'EOF' > ${HOME}/scalardb-cluster-test/scalardb-cluster-custom-values.yaml
    envoy:

    enabled: true

    tls:
    downstream:
    enabled: true
    certManager:
    enabled: true
    issuerRef:
    name: self-signed-ca
    dnsNames:
    - envoy.scalar.example.com
    upstream:
    enabled: true
    overrideAuthority: "cluster.scalardb.example.com"

    scalardbCluster:

    image:
    repository: "ghcr.io/scalar-labs/scalardb-cluster-node-byol-premium"

    scalardbClusterNodeProperties: |
    ### Necessary configurations for deployment on Kuberetes
    scalar.db.cluster.membership.type=KUBERNETES
    scalar.db.cluster.membership.kubernetes.endpoint.namespace_name=${env:SCALAR_DB_CLUSTER_MEMBERSHIP_KUBERNETES_ENDPOINT_NAMESPACE_NAME}
    scalar.db.cluster.membership.kubernetes.endpoint.name=${env:SCALAR_DB_CLUSTER_MEMBERSHIP_KUBERNETES_ENDPOINT_NAME}

    ### Storage configurations
    scalar.db.contact_points=jdbc:postgresql://postgresql-scalardb-cluster.default.svc.cluster.local:5432/postgres
    scalar.db.username=${env:SCALAR_DB_CLUSTER_POSTGRES_USERNAME}
    scalar.db.password=${env:SCALAR_DB_CLUSTER_POSTGRES_PASSWORD}
    scalar.db.storage=jdbc

    ### SQL configurations
    scalar.db.sql.enabled=true

    ### Auth configurations
    scalar.db.cluster.auth.enabled=true
    scalar.db.cross_partition_scan.enabled=true

    ### TLS configurations
    scalar.db.cluster.tls.enabled=true
    scalar.db.cluster.tls.ca_root_cert_path=/tls/scalardb-cluster/certs/ca.crt
    scalar.db.cluster.node.tls.cert_chain_path=/tls/scalardb-cluster/certs/tls.crt
    scalar.db.cluster.node.tls.private_key_path=/tls/scalardb-cluster/certs/tls.key
    scalar.db.cluster.tls.override_authority=cluster.scalardb.example.com

    ### License key configurations
    scalar.db.cluster.node.licensing.license_key=${env:SCALAR_DB_CLUSTER_LICENSE_KEY}
    scalar.db.cluster.node.licensing.license_check_cert_pem=${env:SCALAR_DB_CLUSTER_LICENSE_CHECK_CERT_PEM}

    tls:
    enabled: true
    overrideAuthority: "cluster.scalardb.example.com"
    certManager:
    enabled: true
    issuerRef:
    name: self-signed-ca
    dnsNames:
    - cluster.scalardb.example.com

    secretName: "scalardb-credentials-secret"
    EOF
  4. 資格情報とライセンスキーを含む scalardb-credentials-secret という名前のシークレットリソースを作成します。

    kubectl create secret generic scalardb-credentials-secret \
    --from-literal=SCALAR_DB_CLUSTER_POSTGRES_USERNAME=postgres \
    --from-literal=SCALAR_DB_CLUSTER_POSTGRES_PASSWORD=postgres \
    --from-literal=SCALAR_DB_CLUSTER_LICENSE_KEY="${SCALAR_DB_CLUSTER_LICENSE_KEY}" \
    --from-file=SCALAR_DB_CLUSTER_LICENSE_CHECK_CERT_PEM=<(echo ${SCALAR_DB_CLUSTER_LICENSE_CHECK_CERT_PEM} | sed 's/\\n/\
    /g') \
    -n default
  5. ScalarDB Cluster のチャートバージョンを設定します。

    SCALAR_DB_CLUSTER_VERSION=3.12.2
    SCALAR_DB_CLUSTER_CHART_VERSION=$(helm search repo scalar-labs/scalardb-cluster -l | grep -F "${SCALAR_DB_CLUSTER_VERSION}" | awk '{print $2}' | sort --version-sort -r | head -n 1)
  6. ScalarDB Cluster をデプロイします。

    helm install scalardb-cluster scalar-labs/scalardb-cluster -f ${HOME}/scalardb-cluster-test/scalardb-cluster-custom-values.yaml --version ${SCALAR_DB_CLUSTER_CHART_VERSION} -n default
  7. ScalarDB Cluster ポッドがデプロイされているかどうかを確認します。

    kubectl get pod -n default

    [コマンド実行結果]

    NAME                                     READY   STATUS    RESTARTS   AGE
    postgresql-scalardb-cluster-0 1/1 Running 0 4m30s
    scalardb-cluster-envoy-7cc948dfb-4rb8l 1/1 Running 0 18s
    scalardb-cluster-envoy-7cc948dfb-hwt96 1/1 Running 0 18s
    scalardb-cluster-envoy-7cc948dfb-rzbrx 1/1 Running 0 18s
    scalardb-cluster-node-7c6959c79d-445kj 1/1 Running 0 18s
    scalardb-cluster-node-7c6959c79d-4z54q 1/1 Running 0 18s
    scalardb-cluster-node-7c6959c79d-vcv96 1/1 Running 0 18s

    ScalarDB Cluster ポッドが適切にデプロイされている場合、それらのポッドの STATUS 列には Running と表示されます。

  8. ScalarDB Cluster サービスがデプロイされているかどうかを確認します。

    kubectl get svc -n default

    [コマンド実行結果]

    NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
    kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h34m
    postgresql-scalardb-cluster ClusterIP 10.96.92.27 <none> 5432/TCP 4m52s
    postgresql-scalardb-cluster-hl ClusterIP None <none> 5432/TCP 4m52s
    scalardb-cluster-envoy ClusterIP 10.96.250.175 <none> 60053/TCP 40s
    scalardb-cluster-envoy-metrics ClusterIP 10.96.40.197 <none> 9001/TCP 40s
    scalardb-cluster-headless ClusterIP None <none> 60053/TCP 40s
    scalardb-cluster-metrics ClusterIP 10.96.199.135 <none> 9080/TCP 40s

    ScalarDB Cluster サービスが適切にデプロイされている場合は、CLUSTER-IP 列にプライベート IP アドレスが表示されます。

注記

postgresql-scalardb-cluster-hlscalardb-cluster-headlessCLUSTER-IP 値は、IP アドレスがないため None になります。

ステップ6. クライアントコンテナを起動する

CA 証明書ファイルはクライアントコンテナーで使用します。そのため、シークレットリソースを作成し、それをクライアントコンテナーにマウントする必要があります。

  1. client-ca-cert という名前のシークレットリソースを作成します。

    kubectl create secret generic client-ca-cert --from-file=ca.crt=<(kubectl get secret self-signed-ca-cert-secret -o "jsonpath={.data['ca\.crt']}" | base64 -d) -n default
  2. クライアントポッドのマニフェストファイル (scalardb-cluster-client-pod.yaml) を作成します。

    cat << 'EOF' > ${HOME}/scalardb-cluster-test/scalardb-cluster-client-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: "scalardb-cluster-client"
    spec:
    containers:
    - name: scalardb-cluster-client
    image: eclipse-temurin:8-jre-jammy
    command: ['sleep']
    args: ['inf']
    env:
    - name: SCALAR_DB_CLUSTER_VERSION
    value: SCALAR_DB_CLUSTER_CLIENT_POD_SCALAR_DB_CLUSTER_VERSION
    volumeMounts:
    - name: "client-ca-cert"
    mountPath: "/certs/"
    readOnly: true
    volumes:
    - name: "client-ca-cert"
    secret:
    secretName: "client-ca-cert"
    restartPolicy: Never
    EOF
  3. マニフェストファイルで ScalarDB Cluster のバージョンを設定します。

    sed -i s/SCALAR_DB_CLUSTER_CLIENT_POD_SCALAR_DB_CLUSTER_VERSION/${SCALAR_DB_CLUSTER_VERSION}/ ${HOME}/scalardb-cluster-test/scalardb-cluster-client-pod.yaml
  4. クライアントポッドをデプロイします。

    kubectl apply -f ${HOME}/scalardb-cluster-test/scalardb-cluster-client-pod.yaml -n default
  5. クライアントコンテナーが実行されているかどうかを確認します。

    kubectl get pod scalardb-cluster-client -n default

    [コマンド実行結果]

    NAME                      READY   STATUS    RESTARTS   AGE
    scalardb-cluster-client 1/1 Running 0 26s

ステップ7. クライアントコンテナで ScalarDB Cluster SQL CLI を実行する

  1. クライアントコンテナーで bash を実行します。

    kubectl exec -it scalardb-cluster-client -n default -- bash

    次の手順のコマンドは、クライアントコンテナーで実行する必要があります。

  2. リリースから ScalarDB Cluster SQL CLI をダウンロードします。

    curl -OL https://github.com/scalar-labs/scalardb/releases/download/v${SCALAR_DB_CLUSTER_VERSION}/scalardb-cluster-sql-cli-${SCALAR_DB_CLUSTER_VERSION}-all.jar
  3. database.properties ファイルを作成し、設定を追加します。

    cat << 'EOF' > /database.properties
    # ScalarDB Cluster configurations
    scalar.db.sql.connection_mode=cluster
    scalar.db.sql.cluster_mode.contact_points=indirect:scalardb-cluster-envoy.default.svc.cluster.local

    # Auth configurations
    scalar.db.cluster.auth.enabled=true
    scalar.db.sql.cluster_mode.username=admin
    scalar.db.sql.cluster_mode.password=admin

    # TLS configurations
    scalar.db.cluster.tls.enabled=true
    scalar.db.cluster.tls.ca_root_cert_path=/certs/ca.crt
    scalar.db.cluster.tls.override_authority=envoy.scalar.example.com
    EOF
  4. ScalarDB Cluster SQL CLI を実行します。

    java -jar /scalardb-cluster-sql-cli-${SCALAR_DB_CLUSTER_VERSION}-all.jar --config /database.properties
  5. ns という名前のサンプル名前空間を作成します。

    CREATE NAMESPACE ns;
  6. 名前空間 ns の下に tbl という名前のサンプルテーブルを作成します。

    CREATE TABLE ns.tbl (a INT, b INT, c INT, PRIMARY KEY(a, b));
  7. サンプルレコードを挿入します。

    INSERT INTO ns.tbl VALUES (1,2,3), (4,5,6), (7,8,9);
  8. 挿入したサンプルレコードを選択します。

    SELECT * FROM ns.tbl;

    [コマンド実行結果]

    0: scalardb> SELECT * FROM ns.tbl;
    +---+---+---+
    | a | b | c |
    +---+---+---+
    | 7 | 8 | 9 |
    | 1 | 2 | 3 |
    | 4 | 5 | 6 |
    +---+---+---+
    3 rows selected (0.059 seconds)
  9. ScalarDB Cluster SQL CLI を終了するには、Ctrl + D を押します。

    ^D
  10. クライアントコンテナーを終了します。

    exit

ステップ8. すべてのリソースを削除する

Kubernetes クラスターで ScalarDB Cluster テストを完了したら、すべてのリソースを削除します。

  1. ScalarDB Cluster と PostgreSQL をアンインストールします。

    helm uninstall -n default scalardb-cluster postgresql-scalardb-cluster
  2. 自己署名 CA を削除します。

    kubectl delete -f ./private-ca-custom-values.yaml
  3. cert-manager をアンインストールします。

    helm uninstall -n cert-manager cert-manager
  4. クライアントコンテナを削除します。

    kubectl delete pod scalardb-cluster-client --grace-period 0 -n default
  5. シークレットリソースを削除します。

    kubectl delete secrets scalardb-credentials-secret self-signed-ca-cert-secret scalardb-cluster-envoy-tls-cert scalardb-cluster-tls-cert client-ca-cert
  6. ネームスペース cert-manager を削除します。

    kubectl delete ns cert-manager
  7. 作業ディレクトリとサンプル構成ファイルを削除します。

    cd ${HOME}
    rm -rf ${HOME}/scalardb-cluster-test/

参考文献

Scalar 製品の監視またはログ記録を開始する方法については、次のチュートリアルを参照してください。

This website uses cookies to enhance the visitor experience. By continuing to use this website, you acknowledge that you have read and understood our privacy policy and consent to the use of cookies to help improve your browsing experience and provide you with personalized content.