Когда вы перезапускаете один модуль, модуль запускается с новым IP-адресом, публикует его для других модулей и все они обновляют свою конфигурацию, касающуюся изменения IP-адреса.
В случае, если все модули отключаются и включаютсяВ то же время (например, в случае перезагрузки всех узлов в кластере) модули не могут общаться друг с другом, поскольку IP-адреса в их узлах.conf неверны.
Возможное решение заключается в обновлении IP-адресов вnode.conf на всех запущенных модулях и перезапустите их один за другим.
Я сделал это, внедрив этот скрипт в каждый модуль:
recover-pod.sh
#!/bin/sh
set -e
REDIS_NODES_FILE="/data/nodes.conf"
for redis_node_ip in "$@"
do
redis_node_id=`redis-cli -h $redis_node_ip -p 6379 cluster nodes | grep myself | awk '{print $1}'`
sed -i.bak -e "/^$redis_node_id/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${redis_node_ip}/" ${REDIS_NODES_FILE}
done
И запуск его с одного из узлов Kubernetes:
recover-cluster.sh
#!/bin/bash
for i in {0..5}
do
echo "Updating the correct IPs in nodes.conf on redis-cluster-redis-cluster-statefulset-$i"
kubectl exec -it redis-cluster-redis-cluster-statefulset-$i /readonly-config/recover-pod.sh $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP} ' )
done
kubectl patch statefulset redis-cluster-redis-cluster-statefulset --patch '{"spec": {"template": {"metadata": {"labels": {"date": "'`date +%s`'" }}}}}'
Это приводит к тому, что кластер Redis возвращается в работоспособное состояние.