我在我的statefulset中使用了redis:5.0.1-alpine,有状态集有6个pod,redis集群的形成是使用以下命令完成的
redis-cli --集群创建{IPlist放在这里}--集群副本1
现在,如果pods被意外删除或AKS停止服务,那么在AKS恢复创建时,pods将具有不同的IP。
我试着故意删除pod,当pod重新创建时,集群状态变为"fail“(集群最初创建时是"ok”)。
同样,当我尝试将旧数据集放入集群时,会出现一条消息,告诉我“集群已关闭”。
我已经展示了用于创建集群的redis.conf文件的代码
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-cluster
namespace: redis
data:
update-node.sh: |
#!/bin/sh
REDIS_NODES="/data/nodes.conf"
sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-
9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
exec "$@"
redis.conf: |+
cluster-enabled yes
cluster-require-full-coverage no
cluster-node-timeout 15000
cluster-config-file /data/nodes.conf
cluster-migration-barrier 1
appendonly yes
protected-mode no与redis cluster nodes and slots 群集节点和插槽相关的数据作为连接的Redis
发布于 2019-07-23 23:22:47
当您重新启动单个pod时,pod将使用新的IP启动,并将其发布到其他pod,它们都会根据IP更改更新其配置。
当所有pod同时关闭和打开时(例如集群中所有节点重启),pod之间无法通信,因为它们的nodes.conf中的IP是错误的。
一种可能的解决方案是更新所有正在运行的实例的nodes.conf中的is,并逐个重启它们。
我通过在每个pod中植入这个脚本来做到这一点:
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集群恢复健康状态。
https://stackoverflow.com/questions/56592603
复制相似问题