Redis集群的StatefulSet的Pod删除不会恢复Redis的集群状态

时间:2019-06-14 06:28:59

标签: azure-kubernetes redis-cluster kubernetes-statefulset

我在有状态集中使用过redis:5.0.1-alpine,有状态集有6个Pod,并且使用以下命令完成了redis集群的形成

redis-cli --cluster创建{IPlist位于此处} --cluster-副本1

现在,如果Pod被意外删除或AKS退出服务,那么AKS恢复后创建时的Pod将具有不同的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

issue description snapshot

Redis群集节点和插槽的相关数据如附件所示 redis cluster nodes and slots

1 个答案:

答案 0 :(得分:0)

重新启动单个Pod时,该Pod会带有一个新IP,然后将其发布到其他Pod,它们都会更新有关IP更改的配置。

如果所有Pod都在同一时间上下移动(例如,如果集群中的所有节点都已重新引导),则Pod无法互相通信,因为它们的node.conf中的IP错误。

一种可能的解决方案是更新所有正在运行的Pod上的node.conf中的IP,然后一次重新启动它们。

我是通过将此脚本植入每个吊舱中来做到这一点的:

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群集恢复健康状态。