用于 StatefulSet Pod 子集的 Kubernetes 服务

Wil*_*iss 7 kubernetes

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

redis-0 (master)
redis-1 (replica)
redis-2 (replica)
Run Code Online (Sandbox Code Playgroud)

如何创建仅匹配 podredis-1和 的Kubernetes 服务redis-2?基本上我想要的服务仅指向充当副本的 Pod?

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

selector: app=redis-sts && statefulset.kubernetes.io/pod-name!=redis-0
Run Code Online (Sandbox Code Playgroud)

或者,选择所有相关的 Pod 也是可行的。再次用伪代码表示:

selector: statefulset.kubernetes.io/pod-name=redis-1 || statefulset.kubernetes.io/pod-name=redis-2
Run Code Online (Sandbox Code Playgroud)

以下是定义了选择器和服务的相关 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:
# ...
Run Code Online (Sandbox Code Playgroud)

Rak*_*pta 7

您可以使用Redis 有状态集的Pod 名称标签来创建访问特定只读副本 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
Run Code Online (Sandbox Code Playgroud)

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

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