【问题标题】:Expose every pod in Redis cluster in Kubernetes在 Kubernetes 中暴露 Redis 集群中的每个 pod
【发布时间】:2018-07-07 11:32:18
【问题描述】:

我正在尝试在 Kubernetes 中设置 Redis 集群。主要要求是 Redis 集群中的所有节点都必须在 Kubernetes 外部可用。因此客户端可以直接连接每个节点。但我不知道如何以这种方式配置服务。

现在集群的基本配置。服务进入 k8s 是可以的,但不能从外部完全访问。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-cluster
      labels:
        app: redis-cluster
    data:
      redis.conf: |+
        cluster-enabled yes
        cluster-require-full-coverage no
        cluster-node-timeout 15000
        cluster-config-file /data/nodes.conf
        cluster-migration-barrier 1
        appendonly no
        protected-mode no
    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.alpha.kubernetes.io/tolerate-unready-endpoints: "false"
      name: redis-cluster
      labels:
        app: redis-cluster
    spec:
      type: NodePort
      ports:
      - port: 6379
        targetPort: 6379
        name: client
      - port: 16379
        targetPort: 16379
        name: gossip
      selector:
        app: redis-cluster
    ---
    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
      name: redis-cluster
      labels:
        app: redis-cluster
    spec:
      serviceName: redis-cluster
      replicas: 6
      template:
        metadata:
          labels:
            app: redis-cluster
        spec:
          hostNetwork: true
          containers:
          - name: redis-cluster
            image: redis:4.0.10
            ports:
            - containerPort: 6379
              name: client
            - containerPort: 16379
              name: gossip
            command: ["redis-server"]
            args: ["/conf/redis.conf"]
            readinessProbe:
              exec:
                command:
                - sh
                - -c
                - "redis-cli -h $(hostname) ping"
              initialDelaySeconds: 15
              timeoutSeconds: 5
            livenessProbe:
              exec:
                command:
                - sh
                - -c
                - "redis-cli -h $(hostname) ping"
              initialDelaySeconds: 20
              periodSeconds: 3
            volumeMounts:
            - name: conf
              mountPath: /conf
              readOnly: false
          volumes:
          - name: conf
            configMap:
              name: redis-cluster
              items: 
              - key: redis.conf
                path: redis.conf

【问题讨论】:

  • 你知道会有多少个 Redis 节点,或者解决方案必须是动态的吗?
  • @ewramner 动态,但是对于一个测试用例,会有足够的固定量-6或8
  • 如果它是静态的,您可以为每个 pod 定义一个额外的服务,因为 pod 获得稳定的名称(-0、-1、...)。这些服务可以有稳定的外部 IP。这应该可以,但是如果您需要使其动态化,则必须编写脚本。

标签: redis kubernetes redis-cluster


【解决方案1】:

给定:

    spec:
      hostNetwork: true
      containers:
      - name: redis-cluster
        ports:
        - containerPort: 6379
          name: client 

根据 PodSpec 文档,您的 StatefulSet 似乎配置错​​误,因为如果 hostNetworktrue,您必须提供 hostPort,并且该值应与 containerPort 匹配:

hostPort integer - 在主机上公开的端口号。如果指定,则必须是有效的端口号,0

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#containerport-v1-core

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2020-12-17
    • 2021-05-13
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多