2022/12/04

GKEにDragonflydbをデプロイする

dragonflyk8sgke

概要

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がありましたので、そちらを参考にさせていただきました。

方針

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 でアクセスできることが確認できます。

以上になります。