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.