기술나눔

[K8s 설치 redis] PVC 없이 k8s 환경에 redis sentinel 클러스터 설치

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

소개

k8s 클러스터에서 상태 저장 서비스를 구축하는 것은 상대적으로 까다롭습니다. Redis 구축에 대한 현재 주류 접근 방식은 공유 스토리지 ceph 및 nas를 사용하여 데이터의 영구 저장을 달성하는 것입니다. 현재 운영자는 기본적으로 공유를 사용합니다. 저장. 이 문서에서는 Redis 서비스의 데이터 지속성과 고가용성을 달성하기 위해 기존 환경과 다양한 요구 사항을 기반으로 Redis 클러스터를 구축하기 위해 가중치가 적용된 여러 호스트 경로 선호도 복사본을 사용합니다.

1. 조건 및 환경 설명:

K8s 버전 k8s-1.29.4 환경은 6개의 작업자 노드가 있는 통신 컴퓨터실에 구축되었습니다. 각 노드에는 ceph 또는 nas와 같은 공유 저장소가 장착되지 않은 /data/ 경로에 마운트된 비시스템 디스크 SSD 디스크가 있습니다. 현재 redis-operator는 기본적으로 공유 저장소를 사용합니다.

2. 요구사항 설명:

  • Redis Sentinel 클러스터를 구축합니다.
  • 고가용성: k8s 노드가 종료되거나 포드가 다시 시작되어도 사용에는 영향이 없습니다.
  • 고성능: 고성능 IO를 달성하기 위해 로컬 디스크를 읽고 씁니다. 공유 스토리지의 리소스와 하드웨어 성능이 충분하지 않으면 IO로 인해 성능 병목 현상이 발생합니다.
  • 데이터 보안: 전환 또는 노드 장애 후 데이터는 최대한 완전해야 합니다.
  • 간단한 설치, 손쉬운 관리 및 유지보수

3. 구현 원칙 및 지침

    1. 마스터 1개, 슬레이브 2개, 센티널 프로세스 3개로 구성된 redis sentinel 클러스터를 구축합니다.
    1. Redis는 3개의 독립적인 Statefulset과 1개의 복사본을 사용하여 빌드하는 반면, Sentinel 프로세스는 1개의 배포와 3개의 복사본을 사용하여 빌드합니다.
    1. Redis 프로세스는 노드 선호도와 가중치를 사용하여 기본 및 백업 노드를 구현합니다.
    1. Redis는 서비스 헤드리스 서비스를 사용하고 Sentinel은 서비스 서비스를 사용합니다.
    1. 두 개의 슬레이브와 활성 및 백업으로 구성된 그룹의 경우 가중치에 따라 6개 노드의 레이블 이름을 계획해야 합니다.

참고: 이 솔루션으로 구축된 Redis는 k8s 클러스터 내에서만 사용할 수 있으며 LoadBlancer 또는 NodePort를 통해 클러스터 외부에서 사용하도록 제공할 수 없습니다. 왜냐하면 Sentinel에서 선택한 기본 Redis의 IP는 스위치일 때 포드의 IP이기 때문입니다. 이것이 주요 Redis인지 확인할 수 없습니다.

4. 세부 단계

4.1.노드 라벨 계획하기
노드 이름역할상표
k8s-워커-120-81주인저장소 선택기=노드-a-마스터
k8s-워커-120-82주인저장소 선택기=노드-b-마스터
k8s-워커-120-83주인저장소 선택기=노드-c-마스터
k8s-워커-120-84준비하다저장소 선택기=노드-a-슬레이브
k8s-워커-120-85준비하다저장소 선택기=노드-a-슬레이브
k8s-워커-120-86준비하다저장소 선택기=노드-a-슬레이브

참고: 여기서 역할 분할은 다음을 의미합니다. Redis에는 마스터 1개와 슬레이브 2개가 있으므로 각 Redis 포드는 마스터 노드 3개에 속하며, 마스터 노드가 실패하면 백업 노드로 전환됩니다. 예: 이름은 defaultapp입니다. redis-a-0의 포드는 기본적으로 Storage-selector=node-a-master라는 레이블이 붙은 노드에 속합니다. 노드가 실패하면 Storage-selector=node-a-slve라는 레이블이 붙은 노드의 가중치를 기준으로 일치됩니다. .

4.2. 컨피그맵 구성 생성

구성에는 4개의 파일이 포함되어 있으며 배포 설명은 다음과 같습니다.
sentinel.conf: Sentinel 구성 파일. 기본적으로 첫 번째 statefulset이 기본 redis로 사용되며 구성:solve-hostnames는 호스트 이름을 지원합니다.
redis-master.conf: 주요 redis 구성 파일, 메모리는 256M으로 구성, 구성 포트는 6379, 구성 비밀번호는 redis#123, 저장 경로는 /data/redis입니다.
redis.conf: redis 구성 파일에서 메모리를 256M으로 구성하고, 포트를 6380으로 구성하고, 비밀번호를 redis#123으로 구성하고, 저장 경로는 /data/redis-2이며, 다음에서 동기화할 데이터를 구성합니다. 메인 레디스.
run.sh: 주요 기능은 다양한 구성 파일을 실행하는 역할을 결정하고 호스트 이름을 기반으로 디렉터리를 만든 다음 스토리지 디렉터리에 소프트 연결하는 것입니다. 이 단계는 주로 각 서비스의 Redis 데이터를 자체 디렉터리에 저장하는 것입니다. 새 Redis를 생성할 때 노드에서 디렉터리 충돌이 발생하지 않습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: defaultapp-redis-config
  namespace: default-ns
  labels:
    appname: default-app
    app: defaultapp-redis-config
data:
  sentinel.conf: |
    sentinel monitor mymaster defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379 2
    sentinel auth-pass mymaster redis#123
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    SENTINEL resolve-hostnames yes
    SENTINEL announce-hostnames yes
  redis-master.conf: |
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 10 60 100
    dir /data/redis
    masterauth redis#123
  redis.conf: |
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 10 60 100
    dir /data/redis
    replicaof defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379
    masterauth redis#123
  run.sh: |
    #!/bin/sh
    role=$1
    hname=$(hostname)
    if [ $role == "master" ];then
        echo "run redis master"
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        redis-server /etc/redis/redis-master.conf
    elif [ $role == "sentinel" ];then
        echo "run redis sentinel"
        mkdir -p /etc/redis
        cp /home/redis/sentinel.conf /etc/redis/
        redis-sentinel /etc/redis/sentinel.conf
    else
        echo "run redis slave"
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        redis-server /etc/redis/redis.conf
    fi