Thursday, November 21, 2024

Truy cập Redis Cluster thông qua RedisInsight

-

Mặc dù một số người hoàn toàn hài lòng và hiệu quả khi sử dụng tiện ích redis-cli để tương tác với Redis Cluster, nhưng tôi cũng thấy việc sử dụng giao diện web giúp tôi hiểu rõ hơn và làm việc hiệu quả hơn. Có một số giao diện web mã nguồn mở có sẵn, nhưng tôi đã chọn sử dụng RedisInsight được phát triển bởi RedisLab. Giao diện web này có thể triển khai vào Kubernetes (K8S) dưới dạng một Deployment. Dưới đây là phiên bản có một số sửa đổi so với tài liệu chính thức từ RedisLab. Sự khác biệt chính là đã thêm một PVC (persistent volume claim), để các cấu hình không bị mất sau khi khởi động lại:

  • Giới thiệu: Redis Cluster là một hệ thống Redis được triển khai trên nhiều node, cho phép mở rộng và tăng tính sẵn sàng của dịch vụ Redis. Để tương tác với Redis Cluster thông qua giao diện web, bạn có thể sử dụng RedisInsight, một công cụ được phát triển bởi RedisLab.
  • Triển khai RedisInsight trên Kubernetes: Để triển khai RedisInsight trên Kubernetes, bạn cần tạo một Kubernetes Deployment. Tuy nhiên, để đảm bảo rằng các cấu hình không bị mất khi bạn khởi động lại RedisInsight, bạn cần sử dụng một PVC. PVC sẽ lưu trữ dữ liệu cấu hình của RedisInsight.
  • Cấu hình Deployment: Bạn có thể sử dụng một tệp YAML để cấu hình Deployment. Đoạn manifest sau đây là một phiên bản cơ bản của cấu hình Deployment với PVC:
cat > redisinsight.yaml << 'OEF'
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redisinsight-pv-claim
  namespace: redis-cluster
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redisinsight
  namespace: redis-cluster
  labels:
    app: redisinsight
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redisinsight
  template:
    metadata:
      labels:
        app: redisinsight
    spec:
      containers:
      - name:  redisinsight
        image: redislabs/redisinsight:1.9.0
        imagePullPolicy: IfNotPresent
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: db
          mountPath: /db
        ports:
        - containerPort: 8001
          protocol: TCP
      volumes:
      - name: db
        persistentVolumeClaim:
          claimName: redisinsight-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: redisinsight-service
  namespace: redis-cluster
spec:
  type: NodePort
  ports:
    - name: http-redisinsight
      port: 8001
      protocol: TCP
      targetPort: 8001
      nodePort: 32207
  selector:
    app: redisinsight
OEF

Đoạn manifest trên tạo một Deployment có một container RedisInsight, sử dụng hình ảnh redislabs/redisinsight:latest. Nó cũng định nghĩa một PVC có tên redisinsight-data để lưu trữ dữ liệu cấu hình và một service sử dụng NodePort để cho phép kết nối từ bên ngoài vào RedisInsight.

Sau khi bạn đã tạo cả Deployment và PVC, bạn có thể triển khai RedisInsight lên Kubernetes bằng lệnh kubectl apply -f redisinsight.yaml.

$ kubectl apply -f redisinsight.yaml
persistentvolumeclaim/redisinsight-pv-claim unchanged
service/redisinsight-service unchanged

Khi triển khai thành công, bạn có thể truy cập RedisInsight thông qua trình duyệt web tại địa chỉ IP hoặc tên miền của Kubernetes. RedisInsight sẽ cho phép bạn tương tác với Redis Cluster của bạn thông qua giao diện web thân thiện và dễ sử dụng.

Mình đang có 1 con Haproxy nên mình sẽ dùng Haproxy lắng nghe port 32207 trên các worker và forward ra ngoài bằng port 8001 bằng đoạn config như dưới.

frontend redisInsight
    bind *:8001
    mode tcp
    option tcplog
    default_backend redisInsight

backend redisInsight
    mode tcp
    balance roundrobin
    server k8s-worker1 192.168.13.214:32207 check
    server k8s-worker2 192.168.13.215:32207 check
    server k8s-worker3 192.168.13.216:32207 check
    server k8s-worker4 192.168.13.217:32207 check
    server k8s-worker5 192.168.13.218:32207 check

Khởi động lại Haproxy.

systemctl restart haproxy

Dùng trình duyệt truy cập vào url http://<ip_haproxy>:8001 và chọn I already have a database (vì mình đã có 1 Redis DB).

Chọn Connect to a Redis Database.

Truyền thông tin Redis DB.

Bạn sẽ thấy các node trong Redis Cluster, bạn có thể lựa chọn các pod mà bạn cần hoặc chọn hết cũng được, tùy nhu cầu của bạn.

Thêm DB thành công.

Bấm vào DB vừa thêm, bạn sẽ có nhiều thông tin hơn. Hãy tự khám phá nó nhé.

Nếu bạn sử dụng Nginx Ingress thì có thể sử dụng manifest này.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redisinsight-pv-claim
  namespace: redis-cluster
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: csi-rbd-sc-delete
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redisinsight
  namespace: redis-cluster
  labels:
    app: redisinsight
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redisinsight
  template:
    metadata:
      labels:
        app: redisinsight
    spec:
      containers:
      - name:  redisinsight
        image: redislabs/redisinsight:1.9.0
        imagePullPolicy: IfNotPresent
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: db
          mountPath: /db
        ports:
        - containerPort: 8001
          protocol: TCP
      volumes:
      - name: db
        persistentVolumeClaim:
          claimName: redisinsight-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: redisinsight-service
  namespace: redis-cluster
spec:
  type: ClusterIP
  ports:
    - name: http-redisinsight
      port: 8001
      protocol: TCP
      targetPort: 8001
  selector:
    app: redisinsight
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: redisinsight-ingress
  namespace: redis-cluster
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: redis.hoanghd.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: redisinsight-service
                port:
                  number: 8001

Kết quả triển khai.

$ kubectl get ingress,svc,po -n redis-cluster
NAME                                             CLASS   HOSTS               ADDRESS          PORTS   AGE
ingress.networking.k8s.io/redisinsight-ingress   nginx   redis.hoanghd.com   192.168.13.190   80      10m

NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/redisinsight-service   ClusterIP   10.104.129.174   <none>        8001/TCP   13m

NAME                                READY   STATUS    RESTARTS   AGE
pod/redisinsight-7fb54667b6-tq886   1/1     Running   0          13m

Sử dụng url http://redis.hoanghd.com đã khai báo ở ingress truy cập trên trình duyệt, ta có kết quả.

Như vậy, bạn đã triển khai RedisInsight trên Kubernetes sử dụng PVC để lưu trữ cấu hình và có thể tương tác với Redis Cluster của mình thông qua giao diện web.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories