로컬에서 k8s redis cluster 접속

# k8s 에 redis cluster 를 구성하였다.
# redis 노드1개는 1개의 pod 로 구성되고, 이 pod 를 서비스로 묶었다.

# 다음과 클라이언트가 k8s 안의 pod(redis-cluster-0) 라면 접속이 잘된다.
kubectl --namespace redis exec -it redis-cluster-0 -- redis-cli -h {레디스 노드 중 하나} -p 6379 -c

# 실제 서비스 서버도 k8s 배포되어 운영시는 문제가 없지만
# 개발시에는 로컬에서 k8s redis 에 접근이 필요하다.
# 그래서 redis 의 k8s service 에 nodeport (32000) 설정하고 
# k8s nodeIP:nodeport 로 접속을 시도 하였다.
redis-cli -h {k8s 노드 중 하나} -p 32000 -c
# 접속은 되지만 set 수행시 연결되지 않고,
set aaa bbb
# 이미 저장된 값을 get 수행하면 moved 로 
# redis pod 로 redirect 시도하고 연결되지 않는다.
get aaa
moved xxxx

# 로컬에서 redis set,get 등 수행시 해당 값을 redis node(slot)으로 분배를 시도하고
# 결국 redis-cluster 의 pod(redis node) ip 에 접근할 수 밖에 없다.

# 해결 방법은 redis-cluster 를 프록시 해주는 redis-cluster-proxy 프로그램을
# k8s service(+pod)에 두고, 이 redis-cluster-proxy 로 요청을 하도록 한다.

# 먼저 redis-cluster-proxy 도커 이미지를 생성한다.
# os 버전이 낮아 gcc 버전이 낮으면 빌드 에러가 발생하니 최신 os 기반에서 빌드하자.
# 자세한 내용은 dockerfile 참고

# 이미 빌드된 redis-cluster-proxy 도커 이미지 사용시 참고


# 이제 redis-cluster-proxy 를 k8s service(+pod)로 다음과 같이 구성한다.
# redis-cluster-proxy.yaml
apiVersion: v1
kind: Pod
metadata:
  name: redis-cluster-proxy
  labels:
    app: redis-cluster-proxy
spec:
  containers:
    - name: redis-cluster-proxy
      image: ysoftman/redis-cluster-proxy:latest
      imagePullPolicy: Always
      command:
        ["/redis-cluster-proxy/src/redis-cluster-proxy", "10.123.123.123:6379"]
---
apiVersion: v1
kind: Service
metadata:
  name: redis-cluster-proxy
  labels:
    app: redis-cluster-proxy
spec:
  # type: ClusterIP
  type: NodePort
  ports:
    - port: 7777
      targetPort: 7777
      nodePort: 30777 # The range of valid ports is 30000-32767
      name: redis-cluster-proxy
  selector:
    app: redis-cluster-proxy

# k8s service(+pod) 반영
kubectl apply -f redis-cluster-proxy.yaml --namespace redis

# 다음과 같은 요청 흐름이 된다.
로컬 redis-cli k8s 노드 중 하나:30777 --> redis-cluster-proxy(service) --> redis-cluster-proxy(pod):7777 --> redis cluster nodes(pods):6379

# 이제 로컬 개발시에는 redis-cluster-proxy 를 통해 k8s redis 를 사용할 수 있다.
redis-cli -h {k8s 노드 중 하나} -p 30777 -c


#####


# helm 으로 외부에서 접근 가능한 redis-cluster 으로 구성할 경우
# 다음과 같이 실행하면 service 3개에 각각 redis pod 1개를 띄우고, 
# 서비스별 external ip 를 생성한다.(시간이 좀 걸린다.)
helm install redis-cluster bitnami/redis-cluster \
--namespace redis-cluster \
--set cluster.node=3 \
--set cluster.externalAccess.enabled=true

# 이후 helm upgrade 설치 가이드 명령 참고해서 
helm upgrade redis-cluster bitnami/redis-cluster \
--namespace redis-cluster \
--set cluster.node=3 \
--set cluster.externalAccess.enabled=true \
--set cluster.externalAccess.service.type=LoadBalancer \
--set "cluster.externalAccess.service.loadBalancerIP[0]=10.10.10.1,cluster.externalAccess.service.loadBalancerIP[1]=10.10.10.2,cluster.externalAccess.service.loadBalancerIP[2]=10.10.10.3"


# 참고


comments:

댓글 쓰기