【问题标题】:Kubernetes Service for a Subset of StatefulSet Pods用于 StatefulSet Pod 子集的 Kubernetes 服务
【发布时间】:2021-09-08 10:05:38
【问题描述】:

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

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

如何创建仅匹配 pod redis-1redis-2 的 Kubernetes 服务?基本上,我只想为充当副本的 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。 Full 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


    【解决方案1】:

    您可以使用您的 redis 状态集的 pod name labels 创建服务以访问特定的只读副本 pod。

    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
    

    然后使用 pod 的服务名称来访问特定的 pod。

    externalTrafficPolicy: Local 只会将流量代理到具有您的 pod 实例的节点。

    【讨论】:

      【解决方案2】:

      Service v1 API in 1.21 不支持基于newer "set"LabelSelectormatchLabelsmatchExpressions

      您可以将controller to apply labels 写入有状态集,然后可以满足服务选择器的简单相等逻辑。可能已经有 Redis 操作员在做这种事情。

      this stateful set label question 的一个想法是使用具有 pod 写入权限的 initContainer 来添加标签。

      【讨论】:

        【解决方案3】:

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

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

        这里是部署 Redis 的掌舵图,以 一个主两个只读副本 相同的方式部署,但使用 sentinel强>。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-20
          • 1970-01-01
          • 2015-12-25
          • 1970-01-01
          • 2020-09-02
          • 2020-10-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多