2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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.
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.
Nome do nó | Papel | Rótulo |
---|---|---|
k8s-trabalhador-120-81 | hospedar | seletor de armazenamento=nó-mestre |
k8s-trabalhador-120-82 | hospedar | seletor de armazenamento=node-b-master |
k8s-trabalhador-120-83 | hospedar | seletor de armazenamento=node-c-master |
k8s-trabalhador-120-84 | Preparar | seletor de armazenamento=nó-a-slve |
k8s-trabalhador-120-85 | Preparar | seletor de armazenamento=nó-a-slve |
k8s-trabalhador-120-86 | Preparar | seletor 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ó.
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