Kubernetes で TLS 暗号化を使用して Deployment を作成する

Spanner Omni は TLS 1.3 を使用して、クライアントとサーバー間、および Spanner Omni サーバー間でやり取りされるデータを暗号化します。 Spanner Omni は、両者がデータを交換する前に互いの信頼性を確立する mTLS を提供し、セキュリティを強化します。暗号化を使用する場合、サーバーは mTLS 経由で通信する必要があります。クライアントとサーバーも mTLS を使用するかどうかを選択できます。

Spanner Omni のプレビュー版では、TLS 暗号化はサポートされていません。TLS 暗号化を使用してデプロイを作成できる機能を入手するには、 Google にお問い合わせのうえ、Spanner Omni のフルバージョンへの早期アクセスをリクエストしてください。

始める前に

次の要件を満たしていることを確認してください。

  • Kubernetes クラスタを作成する。この構成は、Google Kubernetes Engine(GKE)と Amazon Elastic Kubernetes Service(Amazon EKS)をサポートしています。他の環境で動作させるには、構成のカスタマイズが必要になる場合があります。

  • Kubernetes クラスタが、Spanner Omni コンテナをホストする Artifact Registry アーティファクトにアクセスできることを確認します。

  • kubectl コマンドライン ツールHelm をインストールして構成します。

  • vSphere 仮想化プラットフォーム マシンに Kubernetes 環境を設定する場合は、仮想マシンの .vmx 構成ファイルに monitor_control.virtual_rdtsc = FALSE を追加して、タイムスタンプ カウンタ(TSC)の仮想化を無効にします。これにより、TrueTime が正しく動作します。

  • 環境が Spanner Omni のシステム要件を満たしていることを確認します。

ステップ 1: 証明書を生成する

3 つの証明書セットを作成する必要があります。

  • API 証明書: Spanner Omni API サーバーの保護に役立ちます。

  • サーバー証明書: サーバー間の通信の保護に役立ちます。

  • クライアント証明書: エンドユーザーまたはアプリケーションは、これを使用して Spanner Omni サーバーとの ID と信頼を確立します。

これらの証明書は認証局(CA)によって発行されます。 Spanner Omni には、自己署名 CA と 3 種類の証明書すべてを作成するツールが用意されています。

いずれかのマシンで次の手順を行います。この手順では、Namespace が spanner-ns であることを前提としています。これは、デプロイで使用する Namespace に変更してください。

これらの証明書は、Spanner Omni CLI を使用してワークステーションで作成できます。

1. 認証局(CA)を作成する

すべての証明書は認証局(CA)によって発行されます。組織に中央 CA がある場合や、パブリック CA を使用できます。すべての証明書に同じ CA を使用できますが、API 証明書とクライアント証明書には同じ CA を使用する必要があります。

Spanner Omni では、プライベート CA を作成できます。

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

create-ca コマンドは、certs ディレクトリに CA 証明書を生成します。この証明書をコピーして API 証明書の CA として使用することも、別の CA を作成することもできます。証明書を作成するときは、正しい CA を使用してください。

cp certs/ca.crt certs/ca-api.crt

ディレクトリ $HOME/.spanner/private-keys には、CA の秘密鍵が含まれています。 このディレクトリをバックアップして保護することが重要です。秘密鍵にアクセスできるユーザーは、自己署名 CA を信頼するクライアントが信頼する任意の証明書に署名できます。必要に応じて、API 証明書用に追加の CA を作成(または外部で信頼されている CA を使用)できます。このドキュメントでは、すべての種類の証明書に同じ CA を使用します。

2. サーバー証明書を生成する

2 種類のサーバー証明書を生成する必要があります。

  • API 証明書: この証明書を使用して、デプロイとやり取りする システムからの通信を暗号化します。

  • Spanner サーバー証明書: Spanner Omni サーバーは、この 証明書を使用して相互の通信を暗号化します。

この構成により、これらの証明書を柔軟に管理できます。たとえば、証明書のローテーションを使用できます。

Spanner サーバー証明書を作成する

サーバー証明書を作成するには、次のコマンドを実行します。

# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

このコマンドにより、certs ディレクトリに server.crtserver.key が作成されます。

API 証明書を作成する

API 証明書を作成するには、次のコマンドを実行します。

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

このコマンドにより、certs ディレクトリに api.crtapi.key が作成されます。必要に応じて、API 証明書に外部で信頼されている CA を使用します。

3. クライアント証明書を生成する

クライアント証明書を使用して、ユーザーとアプリケーションを認証できます。クライアント証明書により、クライアントとサーバー間で mTLS を有効にできます。mTLS を使用しない場合は、この手順をスキップできます。

API 証明書に署名する CA と同じ CA がクライアント証明書に署名する必要があります。また、クライアント証明書には認可用のユーザー名も含まれている必要があります。この例では、新しいデータベースのデフォルト ユーザーである admin ユーザーを使用します。詳細については、 Spanner Omni の 認証と認可をご覧ください。

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

このコマンドにより、clientcerts ディレクトリに client.crtclient.key が作成されます。これらのファイルを、デプロイに接続するマシンに送信します。

Java クライアント ライブラリでクライアント証明書を使用する場合は、証明書鍵を PKCS#8 形式で生成する必要があります。次のコマンドを使用します。

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

ステップ 2: 証明書を Kubernetes クラスタに push する

次のコマンドを実行して、証明書を Kubernetes クラスタに push します。

kubectl create namespace NAMESPACE

kubectl create secret generic tls-certs \
  --from-file=ca.crt="certs/ca.crt" \
  --from-file=ca-api.crt="certs/ca-api.crt" \
  --from-file=server.crt="certs/server.crt" \
  --from-file=server.key="certs/server.key" \
  --from-file=api.crt="certs/api.crt" \
  --from-file=api.key="certs/api.key" \
  -n NAMESPACE

ステップ 3: TLS 暗号化を使用してデプロイを作成する

次の手順に沿って、TLS 暗号化を使用してデプロイを作成します。

1. Helm 構成を準備する

Helm チャート構成を作成する を参照して、環境のデプロイ構成を作成します。

TLS を有効にするには、Helm チャート構成に次の値を設定します。

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true

2. デプロイの作成

次のコマンドを実行してデプロイを作成します。

kubectl create ns monitoring

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
  --version VERSION \
  --set global.platform=gke \
  --set global.insecureMode=false \
  --set deployment.enableClientCertificateAuthentication=true \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

このコマンドはブートストラップ ジョブをトリガーします。このジョブのログを監視することで、進行状況を追跡できます。

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

出力に進行状況が表示されます。完了すると、「Deployment created successfully」というメッセージが表示されます。

3. Pod のステータスを確認する

次のコマンドを実行して、Pod のステータスを確認します。

kubectl get pods --watch --namespace NAMESPACE

すべての Pod が READY 状態になっています。

4. ロードバランサの詳細を使用して証明書とデプロイを更新する

クライアントが Kubernetes クラスタの外部から接続する場合は、この手順が必要です。

# Get the service details
kubectl get service spanner -n NAMESPACE

# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca_certificate_directory certs --output_directory certs --overwrite

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

ステップ 4: Spanner Omni を操作する

Spanner Omni CLI を使用すると、任意の VM から Spanner Omni デプロイを操作できます。

クライアントで mTLS を有効にした場合は、各コマンドで次のフラグを使用します。

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. Spanner Omni にログインする

次のコマンドを実行してログインします。

./google/spanner/bin/spanner auth login admin --ca-certificate-file=certs/ca-api.crt \
--client-certificate_directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

デフォルトのパスワードは admin です。

Successfully logged in as "admin"

2. データベースの作成

次のコマンドを実行してデータベースを作成します。

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. SQL Shell を開く

次のコマンドを実行してシェルを開きます。

./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

4. テーブルを作成してデータを追加する

次の SQL コマンドを実行します。

spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)

spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)

5. デプロイを確認する

データベースを一覧表示するには、次のコマンドを実行します。

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

出力は次のようになります。

NAME 状態 VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME READY 1 時間 2025-02-07T12:25:30Z false

データをクエリするには、次のコマンドを実行します。

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

次の SQL コマンドを実行します。

SHOW TABLES;
SELECT * FROM names;

または、Spanner Omni で PGAdapter を使用するの手順に沿って PGAdapter を構成し、 psql などのツールを使用して操作することもできます。

ステップ 5: デプロイをモニタリングする

monitoring.enabled=true で Spanner Omni をインストールすると、Prometheus が指標をスクレイピングします。Grafana を使用してこれらの指標を可視化できます。

1. サービスの詳細を取得する

次のコマンドを実行して、サービスの詳細を取得します。

# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring

# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring

次のステップ