Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.
출처: https://developers.redhat.com/articles/2024/09/18/deploy-redis-cluster-openshift-virtualization
Redis는 데이터베이스, 캐시 및 메시지 브로커로 널리 사용되는 오픈 소스 메모리 기반 키-값 저장소입니다. 이 문서에서는 Red Hat OpenShift Virtualization 기반 가상 머신(VM)에 Redis 클러스터를 배포하는 방법을 다룹니다 .
환경 변수 내보내기
Redis 가상 머신, OpenShift 서비스, 상호작용을 위한 Redis 명령줄 인터페이스(CLI) 포드, 그리고 클러스터 관리 및 시각화를 위한 Redis Insights 배포/서비스/경로의 배포를 자동화하는 Ansible 플레이북을 만들었습니다 . 이 플레이북은 kubernetes.core 와 kubevirt.core Ansible 컬렉션을 활용했습니다.
플레이북을 실행하기 전에 필요한 인증 환경 변수가 내보내졌는지 확인해야 합니다. kuberentes.core 및 kubevirt.core를 사용하는 데 필요한 환경 변수는 다음과 같습니다.
export K8S_AUTH_HOST=<https://api.ocp.example.com:6443> export K8S_AUTH_API_KEY=<your-api-key> export K8S_AUTH_VERIFY_SSL=<true/false>
Redis 클러스터는 3개의 기본 노드와 3개의 보조 노드, 총 6개의 노드로 구성되며, 모두 Fedora를 기반으로 합니다.
OpenShift 서비스 생성
가상 머신을 생성하기 전에 각 VM에 대한 전용 OpenShift 서비스와 모든 Redis VM 간의 서비스 부하 분산을 생성합니다. 개별 VM 서비스는 vm.kubevirt.io/name 셀렉터를 사용하여 타겟팅되고, 부하 분산 서비스는 app: redis 셀렉터를 사용하여 모든 VM을 타겟팅합니다.
서비스 정의에서 두 개의 포트를 지정했습니다.
- 포트 6379: 클라이언트 연결을 위한 표준 Redis 데이터 포트입니다.
- 포트 16379: 노드 간 통신과 클러스터 조정에 사용되는 Redis 버스 포트입니다.
아래는 서비스 생성에 대한 세부 내용을 담은 플레이북의 일부입니다.
- name: Create redis cluster service
kubernetes.core.k8s:
state: present
definition:
apiVersion: v1
kind: Service
metadata:
name: "redis"
namespace: "{{ project }}"
spec:
selector:
app: redis
ports:
- name: redis
protocol: TCP
port: 6379
targetPort: 6379
- name: bus
protocol: TCP
port: 16379
targetPort: 16379
- name: Create redis VM services
kubernetes.core.k8s:
state: present
definition:
apiVersion: v1
kind: Service
metadata:
name: "{{ item }}"
namespace: "{{ project }}"
spec:
selector:
vm.kubevirt.io/name: "{{ item }}"
ports:
- name: redis
protocol: TCP
port: 6379
targetPort: 6379
- name: bus
protocol: TCP
port: 16379
targetPort: 16379
with_items:
- "{{ redis_vms }}"가상 머신 만들기
필요한 서비스가 생성되면 6개의 가상 머신을 생성합니다. 이러한 VM에 대한 cloud-init 구성에는 Redis 패키지 설치, 원하는 매개변수로 Redis 구성, 그리고 Redis 서비스 활성화가 포함됩니다. 아래는 VM cloud-init에 대한 자세한 내용을 설명하는 플레이북의 일부입니다.
#cloud-config
user: fedora
password: fedora
chpasswd:
expire: false
ssh_pwauth: true
packages:
- redis
runcmd:
- sed -i "s/bind 127.0.0.1/bind 0.0.0.0/" /etc/redis/redis.conf
- sed -i "s/protected-mode yes/protected-mode no/" /etc/redis/redis.conf
- sed -i "s/# cluster-enabled yes/cluster-enabled yes/" /etc/redis/redis.conf
- sed -i "s/# cluster-config-file nodes-6379.conf/cluster-config-file nodes-6379.conf/" /etc/redis/redis.conf
- sed -i "s/# cluster-node-timeout 15000/cluster-node-timeout 15000/" /etc/redis/redis.conf
- sed -i "s/# replica-announce-ip 5.5.5.5/replica-announce-ip {{(query('kubernetes.core.k8s', kind='Service', resource_name=item,namespace=project) | first ).spec.clusterIP}}/" /etc/redis/redis.conf
- sed -i "s/# cluster-announce-ip 10.1.1.5/cluster-announce-ip {{(query('kubernetes.core.k8s', kind='Service', resource_name=item,namespace=project) | first ).spec.clusterIP}}/" /etc/redis/redis.conf
- systemctl enable --now redisOpenShift Virtualization에서 네트워킹 구성
OpenShift Virtualization에서 VM에 대한 네트워킹을 구성할 때 주로 두 가지 접근 방식이 있습니다.
- OpenShift CNI: OpenShift가 제공하는 기본 컨테이너 네트워크 인터페이스(CNI) 솔루션을 활용합니다.
- 외부 네트워크: 브리지를 통해 외부 네트워크를 활용하여 VM을 외부 세계에 연결합니다.
이 문서에서는 기본 OpenShift 네트워크를 사용하여 Redis 클러스터 VM을 배포합니다.
OpenShift CNI를 사용하여 VM을 기본 Pod 네트워크에 연결할 때, VM은 NAT를 통해 Pod 네트워크에 접속하며 모든 VM의 게스트 OS 수준에서 기본 IP 10.0.2.2/24를 할당합니다. 이는 부트스트래핑 및 클러스터 연결을 위해 고유한 호스트 이름이나 IP가 필요한 Redis와 같은 클러스터형 구성 요소에 어려움을 야기합니다.
Redis의 클러스터 알림 IP 및 복제본 알림 IP 구성 매개변수를 활용하면 이러한 문제를 효과적으로 완화할 수 있습니다. Redis의 “클러스터 알림 IP”/”복제본 알림 IP”가 Kubernetes 서비스로 설정되면 기본 VM을 추상화하는 안정적인 가상 IP 주소 역할을 합니다.
클러스터 알림 IP와 복제본 알림 IP를 VM과 연결된 서비스의 클러스터 IP를 가리키도록 구성하면 Redis 클러스터 내에서 안정적인 통신 메커니즘을 구축할 수 있습니다. 이렇게 하면 게스트 OS 수준에서 사용되는 기본 IP인 10.0.2.2를 사용하지 않아도 됩니다. 다음은 플레이북 세부 정보 replica-announce-ip와 cluster-announce-ip 값의 일부입니다.
- sed -i "s/# replica-announce-ip 5.5.5.5/replica-announce-ip {{(query('kubernetes.core.k8s', kind='Service', resource_name=item,namespace=project) | first ).spec.clusterIP}}/" /etc/redis/redis.conf
- sed -i "s/# cluster-announce-ip 10.1.1.5/cluster-announce-ip {{(query('kubernetes.core.k8s', kind='Service', resource_name=item,namespace=project) | first ).spec.clusterIP}}/" /etc/redis/redis.conf"cloud-init 스크립트의 이 두 줄은 replica-announce-ip및 cluster-announce-ip를 해당 VM에 할당된 OpenShift 서비스 클러스터 IP 값으로 설정하는 역할을 합니다. 이는 Kubernetes Ansible 쿼리를 사용하여 각 VM에 대해 미리 생성된 서비스 클러스터 IP를 검색하여 수행됩니다.
Redis 클러스터 초기화
VM을 생성하고 cloud-init를 사용하여 부트스트랩하면 Redis 클러스터를 초기화할 수 있습니다. Redis CLI Pod에 연결하고 다음 명령을 실행하세요.
redis-cli --cluster create \ redis-master-1.redis-cluster.svc.cluster.local:6379 \ redis-master-2.redis-cluster.svc.cluster.local:6379 \ redis-master-3.redis-cluster.svc.cluster.local:6379 \ redis-slave-1.redis-cluster.svc.cluster.local:6379 \ redis-slave-2.redis-cluster.svc.cluster.local:6379 \ redis-slave-3.redis-cluster.svc.cluster.local:6379 --cluster-replicas 1
그림 1은 프로젝트 내부에서 이 명령이 실행되는 모습을 보여줍니다.

명령을 실행하면 Redis 클러스터가 연결과 클라이언트를 허용할 준비가 됩니다. 다음 명령을 실행하고 PONG출력을 검증하여 확인할 수 있습니다.
redis-cli -h redis.redis-cluster.svc.cluster.local ping +PONG
Redis Insights에 클러스터 추가
이제 우리가 만든 Redis Insights 경로로 브라우저를 이동해 보겠습니다.
로드가 완료되면 Redis 클러스터를 추가할 수 있습니다. 그림 2와 같이 아래 정보를 입력하세요.
- 이름:
redis-cluster - 주인:
redis.redis-cluster.svc.cluster.local - 포트:
6379

Redis Insights에 Redis 클러스터를 추가하면 개별 노드가 자동으로 감지됩니다. 표시되는 IP는 Redis 구성 파일에 설정된 OpenShift 서비스 클러스터 IP입니다. 이는 노드가 구성에 따라 클러스터 IP를 사용하여 자신을 알리고 있음을 나타냅니다. 그림 3과 같이 모든 노드를 선택하고 “Add Cluster Database” 를 진행할 수 있습니다.

Redis 클러스터를 추가한 후 Redis Insights에서 클러스터 개요를 살펴볼 수 있습니다. CLI 탭으로 이동하여 CLUSTER NODES과 같은 명령을 실행할 수 있습니다. 그림 4를 참조하세요. 이 명령을 실행하면 그림 5와 같이 모든 클러스터 노드의 역할(기본/보조)과 연결된 노드를 포함한 자세한 분석 정보가 표시됩니다.


Redis 클러스터 테스트
Redis 클러스터를 테스트하려면 다음 CLI 명령을 사용하여 새 키-값 쌍을 만듭니다.
SET GREETING "Hello World"
그림 6은 CLI 내부에서 이 명령이 실행되는 것을 보여줍니다.

브라우저 탭으로 돌아가서 GREETING 키를 클릭하면 클러스터 데이터를 살펴볼 수 있습니다. 이렇게 하면 설정한 값이 표시됩니다 Hello World. 그림 7을 참조하세요.

결론
이 문서에서는 OpenShift Virtualization 기반 VM에서 실행되는 Redis 클러스터를 생성하는 방법을 설명했습니다. Redis 클러스터 내에서 노드 간 통신을 관리하기 위해 OpenShift Services를 효과적으로 활용하는 방법을 살펴보았습니다. 또한 redis-cli과 Redis Insights를 사용하여 클러스터 상태 점검 및 데이터 조작과 같은 기본 작업을 수행하는 방법도 살펴보았습니다.