Compartilhamento de tecnologia

[Redis de instalação do K8s] Instale o cluster redis sentinela no ambiente k8s sem pvc

2024-07-11

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

Introdução

Construir serviços com estado em um cluster k8s é relativamente problemático. A abordagem atual para construir redis é usar armazenamento compartilhado ceph e nas para obter armazenamento persistente de dados. armazenar. Este artigo usará múltiplas cópias ponderadas da afinidade do caminho do host para construir um cluster Redis com base no ambiente existente e nas diferentes necessidades para obter persistência de dados e alta disponibilidade do serviço Redis.

1. Condições e descrição do ambiente:

K8s versão k8s-1.29.4, o ambiente é construído em uma sala de informática de telecomunicações, com seis nós de trabalho. Cada nó possui um disco SSD que não é do sistema montado no caminho /data/. usado. Nenhum operador é usado atualmente, o operador redis usa basicamente armazenamento compartilhado.

2. Descrição dos requisitos:

  • Construa um cluster sentinela redis.
  • Alta disponibilidade: Se um nó k8s morrer ou o pod for reiniciado, o uso não será afetado.
  • Alto desempenho: leia e grave discos locais para obter E/S de alto desempenho. Se os recursos e o desempenho do hardware do armazenamento compartilhado não forem suficientes, a E/S será um gargalo de desempenho.
  • Segurança de dados: Após uma transição ou falha de nó, os dados devem estar tão completos quanto possível
  • Instalação simples, fácil gerenciamento e manutenção

3. Princípios e instruções de implementação

    1. Construa um cluster sentinela redis, com um mestre, dois escravos e três processos sentinela.
    1. O Redis usa três statefulsets independentes e uma cópia para construir, enquanto o processo sentinela usa uma implantação e três cópias para construir.
    1. O processo redis usa afinidade e peso do nó para implementar nós primários e de backup.
    1. Redis usa serviço headless e sentinela usa serviço de serviço.
    1. Para um grupo de dois escravos e ativo e backup de acordo com o peso, os nomes dos rótulos de seis nós precisam ser planejados.

Obs: Os redis construídos por esta solução só podem ser utilizados dentro do cluster k8s e não podem ser fornecidos para uso fora do cluster através do LoadBlancer ou NodePort, pois o IP dos redis principais eleitos no Sentinel é o IP do pod quando um switch. ocorre, não pode ser determinado qual é o redis principal.

4. Etapas detalhadas

4.1.Rótulos de nós de planejamento
Nome do nóPapelRótulo
k8s-trabalhador-120-81hospedarseletor de armazenamento=nó-mestre
k8s-trabalhador-120-82hospedarseletor de armazenamento=node-b-master
k8s-trabalhador-120-83hospedarseletor de armazenamento=node-c-master
k8s-trabalhador-120-84Prepararseletor de armazenamento=nó-a-slve
k8s-trabalhador-120-85Prepararseletor de armazenamento=nó-a-slve
k8s-trabalhador-120-86Prepararseletor de armazenamento=nó-a-slve

Nota: A divisão de funções aqui se refere a: Como o redis tem um mestre e dois escravos, cada pod redis cai em três nós mestres. Quando o nó mestre falha, ele é alternado para o nó de backup. Por exemplo: o nome é defaultapp- O. O pod de redis-a-0 cai no nó rotulado storage-selector=node-a-master por padrão. Quando o nó falha, ele será correspondido com base no peso do nó rotulado storage-selector=node-a-slve. . no nó.

4.2. Criar configuração do configmap

A configuração contém quatro arquivos e a descrição da distribuição é a seguinte:
sentinel.conf: arquivo de configuração do Sentinel Por padrão, o primeiro statefulset é usado como o redis principal e a configuração: resolve-hostnames suporta nomes de host.
redis-master.conf: Arquivo de configuração principal do redis, a memória está configurada para 256M, a porta de configuração é 6379, a senha de configuração é redis#123 e o caminho de armazenamento é /data/redis.
redis.conf: No arquivo de configuração redis, configure a memória para 256M, configure a porta para 6380, configure a senha: redis#123, o caminho de armazenamento é /data/redis-2 e configure os dados a serem sincronizados a partir do redis principal.
run.sh: A função principal é determinar a função para executar diferentes arquivos de configuração, criar um diretório com base no nome do host e, em seguida, conectar-se suavemente ao diretório de armazenamento. Esta etapa serve principalmente para armazenar os dados redis de cada serviço em seu próprio diretório. Ao criar um novo redis, isso não causará conflitos de diretório no nó.

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