【问题标题】:Pod deletion for StatefulSet of redis cluster doesn't restore the cluster-state of redisRedis 集群 StatefulSet 的 Pod 删除不会恢复 redis 的集群状态
【发布时间】:2019-06-14 06:28:59
【问题描述】:

我在 statefulset 中使用了 redis:5.0.1-alpine,stateful set 有 6 个 pod,redis 集群的形成是使用下面的命令完成的

redis-cli --cluster create {IPlist 放在这里} --cluster-replicas 1

现在,如果 Pod 被意外删除或 AKS 停止服务,那么在 AKS 恢复后创建的 Pod 将具有不同的 IP。

我尝试故意删除 pod,当重新创建 pod 时,集群状态更改为“失败”(最初创建集群时“正常”)

此外,当我尝试将旧数据集放入集群时,会出现一条消息,告知“集群已关闭”

我已经展示了用于创建集群的 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 Cluster Nodes and Slots 相关数据如附件 redis cluster nodes and slots

【问题讨论】:

  • 这似乎是一个 redis 问题,而不是 k8s
  • 您是否尝试在 pod 内执行命令?有什么区别吗?
  • 实际上没有区别,如果您查看快照,那么无论我从 pod 内部执行还是直接通过 kubectl 执行,都会出现相同的错误。问题是,一旦我删除了 Pod,statefulSet 实现生成的新 Pod 将导致不同的 IP,redis 只理解 IP。
  • 是的,这也是redis相关的问题,在一篇博客中提到kubernetes服务集群IP可以在redis的配置文件中提及,我也这样做了,但不起作用。

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


【解决方案1】:

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

如果所有 pod 同时关闭和启动(例如,集群中的所有节点都重新启动),则 pod 无法相互通信,因为它们的 node.conf 中的 IP 错误。

一种可能的解决方案是更新所有正在运行的 pod 上的 nodes.conf 中的 IP,并一个接一个地重新启动它们。

我通过在每个 pod 中植入这个脚本来做到这一点:

恢复-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 节点之一运行它:

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

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 2020-04-19
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多