首页 > 解决方案 > 用于 StatefulSet Pod 子集的 Kubernetes 服务

问题描述

我有一个有 3 个 pod 的 StatefulSet。第一个分配给主角色,其余的具有只读副本角色。

redis-0 (master)
redis-1 (replica)
redis-2 (replica)

如何创建仅匹配 podredis-1和的 Kubernetes 服务redis-2?基本上,我只想为充当副本的 pod 提供服务?

从逻辑上讲,我想要的是选择 STS 中的每个 pod,除了第一个。在伪代码中:

selector: app=redis-sts && statefulset.kubernetes.io/pod-name!=redis-0

或者,选择所有相关的 pod 可能是可行的。再次在伪代码中:

selector: statefulset.kubernetes.io/pod-name=redis-1 || statefulset.kubernetes.io/pod-name=redis-2

这是定义了选择器和服务的相关 YAML。完整的 YAML

apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  ports:
  - port: 6379
  clusterIP: None
  selector:
    app: redis-sts
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  selector:
    matchLabels:
      app: redis-sts
  serviceName: redis-service
  replicas: 3
  template:
    metadata:
      labels:
        app: redis-sts
    spec:
# ...

标签: kubernetes

解决方案


我建议不要依赖于 Kubernetes 服务,就好像你的主 pod 被杀手或重新启动的只读副本可以在 redis 集群中随时更改一样。

https://github.com/harsh4870/Redis-Rejson-HA-Helm-Chart

这是 helm 图表,它以相同的方式部署Redis一个 master两个只读副本,但使用sentinel

您的节点或 python 代码必须访问 Redis 的服务,作为回报,redis sentinel 将为您提供 Mater 和从属副本的所有 IP 地址。

使用该 IP,您始终可以根据需要连接到只读副本和主服务器。

如果您的集群重新启动或 POD 重新启动,主只读副本可能会随着时间而改变。


推荐阅读