我有一个有三个豆荚的StatefulSet。第一个角色被分配给主角色,其余角色有一个读副本角色。
redis-0 (master)
redis-1 (replica)
redis-2 (replica)如何创建一个只与redis-1和redis-2匹配的Kubernetes服务?基本上,我想要的服务,只指向作为复制品的豆荚?
从逻辑上讲,我想要的是选择STS中的每一个吊舱,除了第一个。伪码:
selector: app=redis-sts && statefulset.kubernetes.io/pod-name!=redis-0另外,选择所有相关的吊舱也是可行的。同样在psuedocode中:
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:
# ...发布于 2021-06-25 02:47:10
您可以使用redis状态集的豆荚名称标签来创建服务,以访问特定的读取副本荚。
apiVersion: v1
kind: Service
metadata:
name: redis-1
spec:
type: LoadBalancer
externalTrafficPolicy: Local
selector:
statefulset.kubernetes.io/pod-name: redis-1
ports:
- protocol: TCP
port: 6379
targetPort: 6379然后使用豆荚的服务名称来访问特定的吊舱。
externalTrafficPolicy:本地只将流量代理到具有pod实例的节点。
发布于 2021-06-25 04:38:57
1.21中的服务v1 API不支持基于较新“集”的LabelSelector (matchLabels或matchExpressions)
您可以将一个控制器可应用标签写入有状态集,然后满足服务选择器的简单相等逻辑。可能已经有Redis操作符在做这种事情了。
这个有状态集标签问题的一个想法是使用具有pod写访问权限的initContainer添加标签。
发布于 2021-06-25 07:23:03
我建议不要依赖Kubernetes服务,就像你的主荚被杀死或重新启动一样,read副本可以随时在redis集群中得到更改。
https://github.com/harsh4870/Redis-Rejson-HA-Helm-Chart
下面是舵图,它部署Redis,就像1、主和2读取副本一样,但使用sentinel。
您的节点或python代码必须访问Redis的服务,作为回报,redis哨兵将为您提供Mater和从副本的所有IP地址。
使用该IP,您可以随时根据需要连接到读取副本和主服务器。
如果您的集群重新启动或POD重新启动,主读取副本可能会随着时间的推移而改变。
https://stackoverflow.com/questions/68123751
复制相似问题