问题描述
在尝试在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
卷,导致了额外的磁盘空间占用。
解决方法
要解决这个问题,你可以考虑以下几个步骤:
-
删除额外的卷声明:在你的StatefulSet定义中,移除
volumeClaimTemplates
部分,或者仅保留一个持久性卷声明。这样每个Pod只会有一个data
卷。 -
减小持久性卷的大小:如果你认为每个Pod都不需要5Gi的存储空间,你可以通过修改
resources.requests.storage
的值来减小持久性卷的大小。 -
检查资源请求和限制:确保你的容器资源请求和限制与持久性卷的大小相匹配。如果容器的资源请求过大,可能会导致额外的卷空间被分配。
下面是一个修改后的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集群时附加额外卷的问题。记得根据你的需求来调整持久性卷的大小和资源请求。
正文完