KubeBlocksでRedisを導入!Kubernetes上での高速キャッシュ/NoSQL構築を体験

KubeBlocksでRedisを導入—Kubernetes上の高速キャッシュ/NoSQL構築を体験する告知画像。

はじめに

こちらの記事で実際にKubernetes環境にKubeBlocksを導入し、DBaaSの基盤を構築しました。
前回の記事ではKubeBlocksを利用してDBaaS基盤上にMySQLを構築しました。
今回は、KubeBlocksを利用してNoSQLのインメモリデータベースであるRedisを構築していきます。

導入環境構成図

以下の図は、DBaaS基盤上にRedisを導入する環境の構成図です。
「KubeBlocksオペレーター」はこちらの記事で構築しました。

本記事では、赤丸で囲まれた「DB(Redis)」の構築を対象とします。
Redisはすべてのデータをメモリ上で処理する「インメモリデータベース」の一種で、NoSQLに分類されます。
ディスク(SSD/HDD)にアクセスする一般的なデータベースと比較して圧倒的に高速なのが特徴で、主にWebサイトやアプリの高速化(キャッシュ)や、リアルタイム処理に利用されるDBになります。

導入環境構成図

Redisの構築方法

KubeBlocksを使用してRedisを構築する手順をご紹介します。
今回は最もシンプルな、1台のサーバーでRedisを稼働させるスタンドアロン構成で作成していきます。

前提条件

  • KubeBlocksが構築済みであること
  • KubeBlocksによってデフォルトでインストールされるRedisアドオン(以下コマンド結果のredis 1.0.1)が有効になっていること
    • 以下のkbcliコマンドで有効化されているアドオンを確認することができます。
      kbcli addon list
      
      # 出力例
      NAME             VERSION   PROVIDER    STATUS     AUTO-INSTALL
      qdrant           1.0.1     community   Disabled   false
      rabbitmq         1.0.1     community   Disabled   false
      apecloud-mysql   1.0.1     community   Enabled    true
      etcd             1.0.1     community   Enabled    true
      kafka            1.0.1     community   Enabled    true
      mongodb          1.0.1     community   Enabled    true
      mysql            1.0.1     community   Enabled    true
      postgresql       1.0.1     community   Enabled    true
      redis            1.0.1     community   Enabled    true

Namespeaceの作成

まずはRedisをデプロイするNamespeaceを作成します。

kubectl create namespace redis

# 出力例
namespace/redis created

デフォルトユーザー認証用Secretの作成

Redisのデフォルトユーザー用のユーザー名・パスワードを設定したSecretを作成します。

kubectl create secret generic custom-redis-root-secret \
  --from-literal=username='default' \
  --from-literal=password='<任意の値>' \
  -n redis

# 出力例
secret/custom-redis-root-secret created

※Redis作成時に本手順で作成したSecretを指定することで、デフォルトユーザーのパスワードを任意の値で設定することができます。
Secretの指定がない場合は、KubeBlocksがデフォルトユーザー用のパスワードを自動発行します。

Redisの作成

MySQLクラスター構築時と同様に、KubeBlocksのカスタムリソースである「Cluster」のマニフェストを適用し、Redisを作成します。

cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: redis-cluster
  namespace: redis
spec:
  terminationPolicy: Delete
  clusterDef: redis
  topology: standalone
  componentSpecs:
  - name: redis
    replicas: 1
    systemAccounts:
        - name: default
          secretRef:
            name: custom-redis-root-secret
            namespace: redis
    serviceVersion: 8.0.3
    disableExporter: false
    resources:
      limits:
        cpu: "0.5"
        memory: "0.5Gi"
      requests:
        cpu: "0.5"
        memory: "0.5Gi"
    volumeClaimTemplates:
      - name: data
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 20Gi
EOF

# 出力例
cluster.apps.kubeblocks.io/mycluster created
  • clusterDef: redis
    • Redisアドオンが提供するRedisの構成テンプレートを、作成するDBクラスターのベースとして指定する設定です。
  • topology: standalone
    • Redisを単一のRedisサーバーインスタンスで構成されるスタンドアロンクラスターとして起動する設定です。
  • terminationPolicy: Delete
    • クラスターを削除した際、関連するデータも一緒に削除する設定です。
  • systemAccounts
    • Redisのデフォルトユーザーの認証情報(ユーザー名・パスワード)に、事前に作成したSecretを割り当てる設定です。
  • volumeClaimTemplates
    • DBのデータを保存するためのPVの設定です。

Redisの作成確認

Redis作成コマンド実行後、以下のコマンドでクラスター・Podのステータスを確認します。ステータスがRunningになっていれば正常に動作しています。

kubectl get cluster redis-cluster -n redis

# 出力例
NAME            CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS    AGE
redis-cluster   redis                Delete               Running   110s

kubectl get pods -n redis

# 出力例
NAME                    READY   STATUS    RESTARTS   AGE
redis-cluster-redis-0   4/4     Running   0          2m15s

動作確認

Redisへの接続テストを行います。
まず、作成したRedisのエンドポイント(Service名)を確認します。

kubectl get svc  -l app.kubernetes.io/instance=redis-cluster -n redis

# 出力例
NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
redis-cluster-redis-redis      ClusterIP   10.43.163.160    <none>        6379/TCP   3m

kubectl runコマンドでRedisクライアント用のPodを作成し、コンテナ内でシェルを起動します。

kubectl run redis-client -n redis --rm -i --tty --image=redis:8.0.3 --restart=Never -- bash 

# 出力例
If you don't see a command prompt, try pressing enter.
root@redis-client:/data#

redis-clientコマンドを使用し、確認したRedisのエンドポイント、「デフォルトユーザー認証用Secretの作成」で作成したユーザ名・パスワードを指定して接続します。

root@redis-client:/data# redis-cli -h redis-cluster-redis-redis.redis.svc.cluster.local -p 6379 --user default --pass xxxxx

# 出力例
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-cluster-redis-redis.redis.svc.cluster.local:6379>

Redisに正常に接続できているか、以下のPINGコマンドを使用して確認します。

redis-cluster-redis-redis.redis.svc.cluster.local:6379> PING

# 出力例
PONG

「PONG」が出力されれば、正常に接続できています。

続いて、データの登録・取得が行えるかを確認します。
キー「test」に値「”Hello World” 」を登録します。

redis-cluster-redis-redis.redis.svc.cluster.local:6379> SET test "Hello World"

# 出力例
OK

登録したデータが正しく取得できるかを確認します。

redis-cluster-redis-redis.redis.svc.cluster.local:6379> GET test

# 出力例
"Hello World"

登録した「”Hello World” 」という文字列が出力されれば、Redisへのデータ登録と取得は正常に行えています。
これでRedisの構築と動作確認は完了になります。

おわりに

前々回構築したKubeBlocksを使用し、実際にRedisの構築から接続テストを行うまでの流れをご紹介しました。
前回のMySQL構築に引き続き、容易にRedisを構築できることを体感できたのではないでしょうか
今回は最もシンプルな「Redisサーバ1台のスタンドアロン構成」として構築しましたが、KubeBlocksなら本番環境向けの冗長構成も、マニフェストの設定を少し変更するだけで簡単に構築することができます。
KubeBlocksは様々なDBをサポートしているため、他のDBも同様の方法で手軽に導入することができます。
本記事が、Kubernetes上でDBを構築する際の選択肢として、KubeBlocksを検討するきっかけになれば幸いです。

参考文献

https://kubeblocks.io/docs/preview/kubeblocks-for-redis/03-topologies/01-standlone
https://kubeblocks.io/docs/preview/kubeblocks-for-redis/06-custom-secret/01-custom-secret

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です