在GKE上从redis:5.0.1-alpine启动Redis集群时附加了巨大的卷

64次阅读
没有评论

问题描述

在尝试在GKE集群中创建Redis集群时遇到了一个问题。他们按照collabnix上的教程和代码示例进行操作,但是在GKE中,每个节点都附加了一个100GB的卷。这个资源在Kubernetes配置或服务声明中从未显式请求过。用户想要知道在Kubernetes中这个卷的大小是怎么来的。

以下是他们提供的StatefulSet配置:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 3
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
        - name: redis
          image: redis:5.0.1-alpine
          ports:
            - containerPort: 6379
              name: client
            - containerPort: 16379
              name: gossip
          command: ["/conf/update-node.sh", "redis-server", "/conf/redis.conf"]
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - name: conf
              mountPath: /conf
              readOnly: false
            - name: data
              mountPath: /data
              readOnly: false
      volumes:
        - name: conf
          configMap:
            name: redis-cluster
            defaultMode: 0755
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 5Gi

以及提供的Service配置:

apiVersion: v1
kind: Service
metadata:
  name: redis-cluster
spec:
  type: ClusterIP
  ports:
    - port: 6379
      targetPort: 6379
      name: client
    - port: 16379
      targetPort: 16379
      name: gossip
  selector:
    app: redis-cluster

解决方案

原因分析

在你提供的配置中,每个Redis容器都有一个名为data的持久性卷(Persistent Volume)附加到/data路径。根据StatefulSet的定义,每个Pod都会附加一个该名称的持久性卷。因此,当你创建3个Pod的StatefulSet时,每个Pod都会有一个data卷,导致了额外的磁盘空间占用。

解决方法

要解决这个问题,你可以考虑以下几个步骤:

  1. 删除额外的卷声明:在你的StatefulSet定义中,移除volumeClaimTemplates部分,或者仅保留一个持久性卷声明。这样每个Pod只会有一个data卷。

  2. 减小持久性卷的大小:如果你认为每个Pod都不需要5Gi的存储空间,你可以通过修改resources.requests.storage的值来减小持久性卷的大小。

  3. 检查资源请求和限制:确保你的容器资源请求和限制与持久性卷的大小相匹配。如果容器的资源请求过大,可能会导致额外的卷空间被分配。

下面是一个修改后的StatefulSet配置示例,只保留一个持久性卷声明并减小了卷的大小:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 3
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
        - name: redis
          image: redis:5.0.1-alpine
          ports:
            - containerPort: 6379
              name: client
            - containerPort: 16379
              name: gossip
          command: ["/conf/update-node.sh", "redis-server", "/conf/redis.conf"]
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - name: data
              mountPath: /data
              readOnly: false
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: data-pvc
            # 可选:修改资源请求
  volumeClaimTemplates:
    - metadata:
        name: data-pvc
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 1Gi # 可以根据需求进行调整

通过采取上述步骤,你应该能够解决在GKE上启动Redis集群时附加额外卷的问题。记得根据你的需求来调整持久性卷的大小和资源请求。

正文完