kubernetes - 用于 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 服务,就好像你的主 pod 被杀手或重新启动的只读副本可以在 redis 集群中随时更改一样。
https://github.com/harsh4870/Redis-Rejson-HA-Helm-Chart
这是 helm 图表,它以相同的方式部署Redis一个 master和两个只读副本,但使用sentinel。
您的节点或 python 代码必须访问 Redis 的服务,作为回报,redis sentinel 将为您提供 Mater 和从属副本的所有 IP 地址。
使用该 IP,您始终可以根据需要连接到只读副本和主服务器。
如果您的集群重新启动或 POD 重新启动,主只读副本可能会随着时间而改变。
推荐阅读
- haskell - 基于约束的 Haskell 实例调度
- java - com.google.cloud.storage.StorageImpl 的 clojure java 互操作
- apache-spark - 检查 Spark Dataframe 行是否有任何列满足条件并在找到第一个此类列时停止
- javascript - Webrtc on 在没有 Internet 连接的本地网络上失败
- object-detection - YOLO 3 Assertion '0' failed 错误 - NOT CRLF 错误
- python - 带有moviepy和numpy的AWS Lambda错误
- javascript - Sailsjs 独立动作查看(Sailsjs V1.0.0)
- python - Python 脚本 NameError:在 Linux CentOS 上
- java - 如何通过 build.gradle 将属性和文本文件添加到 JAR 文件
- java - 从数据库读取文件内容