2022/12/04
GKEにDragonflydbをデプロイする
概要
dragonflydb/dragonflyはハイパフォーマンスなredis互換のミドルウェアです。
Dragonfly reaches x25 performance compared to Redis
弊社では最近導入を決めて、ローカル環境でdocker-composeを利用した開発にて特段問題点がなかったので、GKE(on GCP)への導入を行いました。
今回は、GKEへのDragonflydbのデプロイ方法の備忘録になります。
clusterやringを組んだり、read replicaを立てたりはしていません。
参考
2022年12月04日の段階では、良さそうな kubernetes operatorが見つかりませんでしたが、いくつか参考になるコードやgithub issueがありましたので、そちらを参考にさせていただきました。
- Helm-Chart · Issue #57 · dragonflydb/dragonfly
- dragonfly/contrib/charts/dragonfly at main · dragonflydb/dragonfly
方針
dragonflydb公式のhelm chartのコードを参考にしつつ、k8sのリソースファイルを作成して、デプロイすることにしました。
デプロイ
namespace
まずは、dragonfly
というnamespaceを作って、そこにデプロイすることにしました。
# 定義ファイルを作成
% cat <<'EOF' > namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dragonfly
EOF
# デプロイ
$ kubectl apply -f namespace.yaml
# 確認
% kubectl get namespaces
NAME STATUS AGE
dragonfly Active XX
storageclass
次に、statefulsetで利用するdiskの種類を定義します。 SSDを利用します。
# 定義ファイルを作成
% cat <<'EOF' > storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: pd-custom
provisioner: kubernetes.io/gce-pd
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
type: pd-ssd
mountOptions:
- nodelalloc,noatime
EOF
# デプロイ
$ kubectl apply -f storageclass.yaml
# 確認(pd-customという名前のレコードが出てくればOK / そのほかにもデフォルトで作成されているpremium-rwoやstandard-rwoなども一緒に出てきます。)
$ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
pd-custom kubernetes.io/gce-pd Delete WaitForFirstConsumer true XX
premium-rwo pd.csi.storage.gke.io Delete WaitForFirstConsumer true XX
standard kubernetes.io/gce-pd Delete Immediate true XX
standard-rwo (default) pd.csi.storage.gke.io Delete WaitForFirstConsumer true XX
statefulset
statefulsetをデプロイします。
# 定義ファイルを作成
% cat <<'EOF' > statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: dragonfly
namespace: dragonfly
spec:
serviceName: dragonfly
replicas: 1
selector:
matchLabels:
app: dragonfly
template:
metadata:
name: dragonfly
labels:
app: dragonfly
spec:
# affinityなどは適時設定します。(今回は省略)
containers:
- name: dragonfly
image: docker.dragonflydb.io/dragonflydb/dragonfly
imagePullPolicy: IfNotPresent
args:
- "--alsologtostderr"
ports:
- name: dragonfly
containerPort: 6379
protocol: TCP
livenessProbe:
httpGet:
path: /
port: dragonfly
readinessProbe:
httpGet:
path: /
port: dragonfly
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1000m
memory: 4Gi
volumeMounts:
- mountPath: /data
name: dragonfly-data
volumeClaimTemplates:
- metadata:
name: dragonfly-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: pd-custom # 先ほど定義したstorageclassを利用します。
resources:
requests:
storage: 5Gi # 5GBのpersistent diskを確保します。
EOF
# デプロイ
% kubectl apply -f statefulset.yaml
# 確認
% kubectl get statefulset -n dragonfly
NAME READY AGE
dragonfly 1/1 XX
# persistent volume claim(ほかにもpvやdiskも)が作成されています。
% kubectl get pvc -n dragonfly
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
dragonfly-data-dragonfly-0 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 5Gi RWO pd-custom XX
% kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 5Gi RWO Delete Bound dragonfly/dragonfly-data-dragonfly-0 pd-custom XX
service
serviceをデプロイします。
# 定義ファイルを作成
$ cat <<'EOF' > service.yaml
apiVersion: v1
kind: Service
metadata:
name: dragonfly
namespace: dragonfly
spec:
type: NodePort
ports:
- name: dragonfly
port: 6379
targetPort: dragonfly
selector:
app: dragonfly
EOF
# デプロイ
$ kubectl apply -f service.yaml
# 確認
% kubectl get svc -n dragonfly
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dragonfly NodePort XXX.XX.XXX.XX <none> 6379:30229/TCP XX
デプロイ後、(同一クラスター内であれば)redis://dragonfly.dragonfly.svc.cluster.local:6379/0
でアクセスできることが確認できます。
以上になります。
関連する記事
[小〜中規模向け]GKEにTiDBをデプロイする
MySQL互換のNewSQLであるTiDBをGKEにデプロイしてみました。
NATS JetStream Controllerを使ってNATSをGKEにデプロイする
helm chartのnackを使って、NATS JetStreamサーバーをデプロイして、Stream/Consumerをk8sリソースとして管理する
GKEにDragonflydbをデプロイする
redis互換のdragonflydbをGKEにデプロイしました
[Rust]axumとdragonflyを使ったWebsocket Chatのサンプル実装
redis互換のdragonflyをPUBSUBとして利用して、Websocket Chatアプリのサンプル実装を行いました。