このガイドでは、Redis Enterprise を Google Kubernetes Engine(GKE)クラスタにデプロイする方法について説明します。
Redis は、主にキャッシュ用に使用されるオープンソースのインメモリ NoSQL データベースです。組み込みレプリケーション、Lua スクリプト、LRU エビクション、トランザクション、オンディスクの永続性、高可用性などを備えています。
Redis Enterprise は、Redis オープンソースを拡張したエンタープライズ クラスのソリューションで、地理的に複製されたデータの分散、オペレーション スループットの線形スケーリング、データの階層化、高度なセキュリティ機能などの機能を備え、管理作業をシンプルに行うことができます。
Redis Enterprise は、デプロイ オプション(ソフトウェア、クラウド、ハイブリッド クラウドとマルチクラウド)によって料金が異なります。
このガイドは、Google Kubernetes Engine(GKE)での Redis Enterprise のデプロイに関心のあるプラットフォーム管理者、クラウド アーキテクト、運用担当者を対象としています。
環境の設定
このチュートリアルでは、Cloud Shell を使用してGoogle Cloudでホストされているリソースを管理します。Cloud Shell には、このチュートリアルに必要な kubectl
、gcloud CLI、Terraform などのソフトウェアがプリインストールされています。
Cloud Shell を使用して環境を設定するには、次の操作を行います。
Google Cloud コンソールで
(Cloud Shell をアクティブにする)をクリックして、 Google Cloud コンソールから Cloud Shell セッションを起動します。 Google Cloud コンソールの下部ペインでセッションが起動します。
環境変数を設定します。
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1
PROJECT_ID
: Google Cloud は実際のプロジェクト ID に置き換えます。GitHub リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
作業ディレクトリを変更します。
cd kubernetes-engine-samples/databases/redis-enterprise-operator
クラスタ インフラストラクチャを作成する
このセクションでは、Terraform スクリプトを実行して、限定公開の高可用性リージョン GKE クラスタと VPC を作成します。
次の図は、3 つの異なるゾーンにデプロイされた限定公開のリージョン GKE Standard クラスタを示しています。
このインフラストラクチャをデプロイするには、Cloud Shell から次のコマンドを実行します。
cd terraform/gke-standard
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform init
terraform apply -var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
プロンプトが表示されたら、「yes
」と入力します。このコマンドが完了し、クラスタが準備完了ステータスになるまでに数分かかることがあります。
Terraform が次のリソースを作成します。
- Kubernetes ノード用の VPC ネットワークとプライベート サブネット
- NAT 経由でインターネットにアクセスするためのルーター
us-central1
リージョンの限定公開 GKE クラスタ- 自動スケーリングが有効な 1 つのノードプール(ゾーンあたり 1~2 ノード、最小ゾーンあたり 1 ノード)
出力は次のようになります。
...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...
クラスタに接続する
Cloud Shell を使用して、クラスタと通信するように kubectl
を構成します。
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${REGION}
Redis Enterprise Operator をクラスタにデプロイする
このセクションでは、Redis Enterprise Operator を Kubernetes クラスタにデプロイします。
REC とそのアプリケーションの Namespace を作成します。
kubectl create namespace rec-ns kubectl create namespace application
Namespace にラベルを付けます。
kubectl label namespace rec-ns connection=redis kubectl label namespace application connection=redis
最新バージョンの Redis Enterprise Operator バンドルを取得します。
VERSION=`curl --silent https://api.github.com/repos/RedisLabs/redis-enterprise-k8s-docs/releases/latest | grep tag_name | awk -F'"' '{print $4}'`
Redis Enterprise Operator をインストールします。
kubectl apply -n rec-ns -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml
出力は次のようになります。
role.rbac.authorization.k8s.io/redis-enterprise-operator created rolebinding.rbac.authorization.k8s.io/redis-enterprise-operator created serviceaccount/redis-enterprise-operator created service/admission created customresourcedefinition.apiextensions.k8s.io/redisenterpriseclusters.app.redislabs.com created customresourcedefinition.apiextensions.k8s.io/redisenterprisedatabases.app.redislabs.com created customresourcedefinition.apiextensions.k8s.io/redisenterpriseremoteclusters.app.redislabs.com created customresourcedefinition.apiextensions.k8s.io/redisenterpriseactiveactivedatabases.app.redislabs.com created deployment.apps/redis-enterprise-operator created
Redis Enterprise Cluster をデプロイする
マニフェストをクラスタに適用します。
kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yaml
コマンドの完了までに数分かかることがあります。
REC デプロイのステータスを確認します。
kubectl get rec -n rec-ns
出力は次のようになります。
NAME NODES VERSION STATE SPEC STATUS LICENSE STATE SHARDS LIMIT LICENSE EXPIRATION DATE AGE gke-rec 3 7.2.4-52 Running Valid Valid 4 2023-09-29T20:15:32Z 4m7s
STATE
がRUNNING
の場合、クラスタは準備完了です。
任意: アドミッション コントローラを構成する
必要に応じて、デプロイ時のデータベース検証用のインフラストラクチャを構成できます。
アドミッション コントローラを設定し、アドミッション TLS Secret が存在するかどうかを確認します。
kubectl get secret admission-tls -n rec-ns
証明書を取得します。
export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
取得した証明書を
webhook.yaml
ファイルにコピーします。sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
検証 Webhook をデプロイします。
sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
アドミッション コントローラが、ラベル付き Namespace でデータベース構文を検証します。
機能しないデータベースを作成して、アドミッション コントローラを検証します。
kubectl apply -n rec-ns -f - << EOF apiVersion: app.redislabs.com/v1alpha1 kind: RedisEnterpriseDatabase metadata: name: redis-enterprise-database spec: evictionPolicy: illegal EOF
出力は次のようになります。
Error from server: error when creating "STDIN": admission webhook "redisenterprise.admission.redislabs" denied the request: 'illegal' is an invalid value for 'eviction_policy'. Possible values are ['volatile-lru', 'volatile-ttl', 'volatile-random', 'allkeys-lru', 'allkeys-random', 'noeviction', 'volatile-lfu', 'allkeys-lfu']
Namespace を作成する
デフォルトでは、Redis Enterprise Operator には自身の Namespace の外部でアクションを実行する権限はありません。Redis Enterprise Operator が他の Namespace に REDB とデータベース エンドポイントを作成できるようにするには、RBAC を構成する必要があります。
アプリケーションの Namespace で、対応するロールとロール バインディングを適用します。
kubectl apply -f manifests/01-basic-cluster/role.yaml -n application kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
rec-ns
Namespace にクラスタロールとクラスタロール バインディングを作成します。kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role.yaml kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role_binding.yaml
REC ConfigMap を編集して、アプリケーションの Namespace に対する制御を追加します。
kubectl patch ConfigMap/operator-environment-config --type merge -p '{"data": {"REDB_NAMESPACES_LABEL": "connection=redis"}}' -n rec-ns
ConfigMap としてラベル付けされている各 Namespace にパッチが適用されます。
rec-ns
Namespace の Redis インフラストラクチャ内のリソースのステータスを確認します。kubectl get pod,deploy,svc,rec,statefulset,cm,secrets -n rec-ns
出力は次のようになります。
NAME READY STATUS RESTARTS AGE pod/gke-rec-0 2/2 Running 0 172m pod/gke-rec-1 2/2 Running 0 171m pod/gke-rec-2 2/2 Running 0 168m pod/gke-rec-services-rigger-5f885f59dc-gc79g 1/1 Running 0 172m pod/redis-enterprise-operator-6668ccd8dc-kx29z 2/2 Running 2 (5m58s ago) 5h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/gke-rec-services-rigger 1/1 1 1 172m deployment.apps/redis-enterprise-operator 1/1 1 1 5h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/admission ClusterIP 10.52.11.13 <none> 443/TCP 5h service/gke-rec ClusterIP 10.52.5.44 <none> 9443/TCP,8001/TCP 172m service/gke-rec-prom ClusterIP None <none> 8070/TCP 172m service/gke-rec-ui ClusterIP 10.52.3.29 <none> 8443/TCP 172m NAME NODES VERSION STATE SPEC STATUS LICENSE STATE SHARDS LIMIT LICENSE EXPIRATION DATE AGE redisenterprisecluster.app.redislabs.com/gke-rec 3 7.2.4-52 Running Valid Valid 4 2023-10-05T11:07:20Z 172m NAME READY AGE statefulset.apps/gke-rec 3/3 172m NAME DATA AGE configmap/gke-rec-bulletin-board 1 172m configmap/gke-rec-health-check 5 172m configmap/kube-root-ca.crt 1 5h2m configmap/operator-environment-config 1 5h NAME TYPE DATA AGE secret/admission-tls Opaque 2 5h secret/gke-rec Opaque 2 172m
Redis Enterprise Databases をデプロイする
アプリケーションの Namespace に Redis Enterprise データベースを作成します。
kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
REDB のステータスを確認します。
kubectl get redb --all-namespaces
出力は次のようになります。
NAMESPACE NAME VERSION PORT CLUSTER SHARDS STATUS SPEC STATUS AGE application app-db 7.2.0 12999 gke-rec 1 active Valid 15s
各 REDB の Service が実行されていることを確認します。
kubectl get svc --all-namespaces
出力は次のようになります。
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE application app-db ExternalName <none> redis-12999.rec-ns.svc.cluster.local 12999/TCP 72m
Secret が作成されたことを確認します。
kubectl get secrets -n application
出力は次のようになります。
NAME TYPE DATA AGE redb-app-db Opaque 3 96m
パスワードを使用して認証する
アプリケーションの Namespace に redis-cli
を含む Pod を使用して、REDB に接続できます。クライアント Pod は、アプリケーションの Namespace(REDB)で利用可能な Secret を使用して接続を確立します。
カスタム リソース REDB を使用して作成されたデータベースは、ACL を使用しないパスワード認証のみに対応しています。
クライアント Pod を作成します。
kubectl apply -n application -f manifests/03-auth/client_pod.yaml
クライアント Pod に接続します。
kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
データベースに接続します。
redis-cli -h $SERVICE -p $PORT --pass $PASS
鍵を作成します。
SET mykey "Hello World"
出力は次のようになります。
OK
鍵を取得します。
GET mykey
出力は次のようになります。
"Hello World"
Pod のシェルを終了します。
exit
Prometheus が Redis クラスタの指標を収集する仕組み
次の図は、Prometheus が指標を収集する仕組みを示しています。
この図では、GKE 限定公開クラスタに次のものが存在します。
- パス
/
とポート8070
の指標を収集する Redis Pod - Redis Pod から取得した指標を処理する Prometheus ベースのコレクタ
- Cloud Monitoring に指標を送信する
PodMonitoring
リソース
Redis Enterprise Operator は、クラスタ指標を Prometheus 形式で公開します。
metrics-proxy Deployment を作成します。
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yaml
オペレーターは自己署名証明書を使用して HTTPS エンドポイントのみを提供し、
PodMonitoring
リソースは TLS 証明書の検証の無効化に対応していません。このため、metrics-proxy
Pod をこのエンドポイントのリバース プロキシとして使用して、HTTP ポートで指標を公開します。labelSelector
で指標を収集する PodMonitoring リソースを作成します。kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
Google Cloud コンソールで、GKE クラスタのダッシュボード ページに移動します。
ダッシュボードにゼロ以外の指標の取り込み率が表示されます。
ダッシュボードを作成する
指標を表示するには、ダッシュボードを作成します。
ダッシュボードを作成します。
gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
出力は次のようになります。
Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
Google Cloud コンソールで [ダッシュボード] ページに移動します。
Redis Enterprise Cluster ダッシュボードを開きます。ダッシュボードの自動プロビジョニングには数分かかる場合があります。
エクスポートされた指標を検証する
指標を検証するには、新しいデータベースを作成して指標を調べます。
Redis Enterprise Cluster ダッシュボードを開きます。
追加の Redis データベースを作成します。
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/c-rdb.yaml
ダッシュボードの [Database Count] が更新されます。
新しいデータベースに接続するためのクライアント Pod を作成します。
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
クライアント Pod に接続し、変数を準備します。
kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
redis-cli
ツールを使用して新しい鍵を作成します。for i in {1..50}; do \ redis-cli -h $SERVICE -p $PORT -a $PASS \ --no-auth-warning SET mykey-$i "myvalue-$i"; \ done
ページを更新します。グラフが更新され、実際のデータベースの状態を示していることを確認します。
Pod のシェルを終了します。
exit