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 |
apiVersion: v1 kind: Service metadata: name: redis-cluster namespace: myspace labels: app: redis-cluster spec: type: ClusterIP ports: - port: 6379 targetPort: 6379 name: client - port: 16379 targetPort: 16379 name: gossip clusterIP: None selector: app: redis-cluster |
[Configmap 배포]
Redis-configmap.yaml |
apiVersion: v1 kind: ConfigMap metadata: name: redis-cluster namespace: myspace labels: app: redis-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 |
apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster namespace: myspace labels: app: redis-cluster spec: serviceName: redis-cluster replicas: 6 selector: matchLabels: app: redis-cluster template: metadata: labels: app: redis-cluster spec: containers: - name: redis image: repository/redis:5.0.5-alpine3.9 resources: requests: cpu: 100m memory: 100Mi limits: cpu: 1000m memory: 1Gi ports: - containerPort: 6379 name: client - containerPort: 16379 name: gossip command: ["/conf/fix-ip.sh", "redis-server", "/conf/redis.conf"] readinessProbe: exec: command: - sh - -c - "redis-cli -h $(hostname) -a ${REDIS_PASSWORD} ping" initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: exec: command: - sh - -c - "redis-cli -h $(hostname) -a ${REDIS_PASSWORD} ping" initialDelaySeconds: 20 periodSeconds: 3 env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: REDIS_PASSWORD value: password volumeMounts: - name: conf mountPath: /conf readOnly: false - name: data mountPath: /data readOnly: false - name: tz-config mountPath: /etc/localtime volumes: - name: conf configMap: name: redis-cluster defaultMode: 0755 - name: tz-config hostPath: path: /etc/localtime volumeClaimTemplates: - metadata: name: data labels: name: redis-cluster spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 3Gi storageClassName: kuber-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/
'IT Knowledge > 기타' 카테고리의 다른 글
RedisClusterNode Validate that the Redis URI are equal when comparing nodes (1) | 2023.09.04 |
---|---|
Redis 명령어 모음 사용법 (0) | 2023.09.03 |
OS TCP Parameters 튜닝 (1) | 2023.08.25 |
Tuned 개요 및 사용법 (4) | 2023.08.17 |
NFS wrong fs type 오류(CentOS) (1) | 2022.05.03 |
댓글