IT Knowledge/기타

Redis Cluster On Kubernetes

Seok. 2023. 9. 3. 22:48
반응형

Redis Cluster Kubernetes 환경에 배포하기 위해선, StatusfulSets PersistentVolumes 조합이 필요합니다.

추가로, kubernetes cluster에서 활용하려면, Service 까지 필요합니다.

  • Redis Kubernetes 컨테이너 환경 구성
    • Redis Service
    • Redis ConfigMap
    • Redis StatusfulSets
    • Redis PersistentVolumes
  • Redis Cluster 구성
    • Redis Cluster 상태 확인

[Service 배포]

$ kubectl apply -f redis-svc.yaml

service/redis-cluster created

redis-svc.yaml
apiVersionv1
kindService
metadata:
  nameredis-cluster
  namespace: myspace
  labels:
    appredis-cluster
spec:
  typeClusterIP
  ports:
  - port6379
    targetPort6379
    nameclient
  - port16379
    targetPort16379
    namegossip
  clusterIP: None
  selector:
    appredis-cluster

 

[Configmap 배포]

Redis-configmap.yaml
apiVersionv1
kindConfigMap
metadata:
  nameredis-cluster
  namespacemyspace
  labels:
    appredis-cluster
data:
  update-node.sh|
    #!/bin/sh
    REDIS_NODES="/data/nodes.conf"
    sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
    exec "$@"
  redis.conf|+
    cluster-enabled yes
    cluster-require-full-coverage no
    cluster-node-timeout 15000
    cluster-config-file /data/nodes.conf
    cluster-migration-barrier 1
    appendonly no
    protected-mode no
    requirepass DEFAULT-PASSWORD
    masterauth DEFAULT-PASSWORD
    maxmemory 1gb
    maxmemory-policy allkeys-lru

Cluster-enabled : yes 하면 cluster mode로 시작. No 하면 standalone mode 시작

Cluster-config-file /data/nodes.conf : nodes.conf 파일은 클러스터의 상태를 기록하는 바이너리 파일이다. 클러스터의 상태가 변경될때 마다 상태를 기록한다.

Cluster-node-timeout 15000 : 레디스 노드가 다운되었는지 판단하는 시간

Appendonly 클러스터와 직접적인 연관이 있는 파라미터는 아니지만, 다운되었던 마스터 노드 재시작시, appendonly 파일에 가장 최근까지 데이터가 있으므로, 클러스터 운영시에는 yes 권장한다.

 

[StatusFulSets 배포]

Redis-sts.yaml
apiVersionapps/v1
kindStatefulSet
metadata:
  nameredis-cluster
  namespacemyspace
  labels:
    appredis-cluster
spec:
  serviceNameredis-cluster
  replicas6
  selector:
    matchLabels:
      appredis-cluster
  template:
    metadata:
      labels:
        appredis-cluster
    spec:
      containers:
      - nameredis
        imagerepository/redis:5.0.5-alpine3.9
        resources:
          requests:
            cpu100m
            memory100Mi
          limits:
            cpu1000m
            memory1Gi
        ports:
        - containerPort6379
          nameclient
        - containerPort16379
          namegossip
        command: ["/conf/fix-ip.sh""redis-server""/conf/redis.conf"]
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - "redis-cli -h $(hostname) -a ${REDIS_PASSWORD} ping"
          initialDelaySeconds15
          timeoutSeconds5
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - "redis-cli -h $(hostname) -a ${REDIS_PASSWORD} ping"
          initialDelaySeconds20
          periodSeconds3
        env:
        - namePOD_IP
          valueFrom:
            fieldRef:
              fieldPathstatus.podIP
        - nameREDIS_PASSWORD
          valuepassword
        volumeMounts:
        - nameconf
          mountPath/conf
          readOnlyfalse
        - namedata
          mountPath/data
          readOnlyfalse
        - nametz-config
          mountPath/etc/localtime
      volumes:
      - nameconf
        configMap:
          nameredis-cluster
          defaultMode0755
      - nametz-config
        hostPath:
          path/etc/localtime
  volumeClaimTemplates:
  - metadata:
      namedata
      labels:
        nameredis-cluster
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage3Gi
      storageClassNamekuber-storage

 

[Redis-cluster ip제대로 가지고 오는지 확인.]

$ kubectl get pods -n myspace -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}{":6379 "}{end}'


 

 

[Redis-Cluster 구성 설정]

 

$ kubectl exec -it redis-cluster-0 -n myspace -- redis-cli -a "password" --cluster create --cluster-replicas 1 $(kubectl get pods -n myspace -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}{":6379 "}{end}')

 

Redis 클러스터 구성 완료

 

 

[Redis 클러스터 상태 확인]

Redis-cluster-0 POD에서 확인

cluster info
cluster node

정상 확인

 

 

참조 : https://www.suse.com/c/rancher_blog/deploying-redis-cluster-on-top-of-kubernetes/

반응형