我已经部署了2.0.0作为具有EBS卷持久性的Statefulset。我注意到,如果出于某种原因,pod被重新安排到其他节点,或者即使我们缩小statefulset pod副本=0然后再扩大,对持久数据的影响也是一样的:它们将丢失。
最初,如果pod被重新安排到其他节点,我认为问题出在EBS卷上,它没有被卸载,它们安装到正在运行pod副本的另一个节点,但事实并非如此。EBS卷存在,相同的pv/pvc存在,但数据丢失了。
为了弄清楚可能存在的问题,我特意进行了infxdb设置并添加了数据,然后这样做了:
kubectl scale statefulsets influxdb --replicas=0
...
kubectl scale statefulsets influxdb --replicas=1
效果就像重新安排infxdb pod时一样。数据丢失了。
为什么会发生这样的事情的具体原因?
我的环境:我正在使用EKS k8s环境与1.15 k8s版本的控制平面/工人。
幸运的是,这个问题是由于在持续保存实际数据的位置方面,在INDOXDB1. x和2.0.0 Beta版本之间发生了很大的变化。
在1. x版本中,数据被持久化:
/var/lib/influxdb
而在2. x版本上,数据默认保存在:
/root/.influxdbv2
我的EBS卷装载在1.x版本的位置上,每次重新启动pod时(无论是缩小规模还是调度到其他节点),EBS卷都会定期附加,但位置错误。这就是为什么没有数据的原因。
另外,我看到的一个区别是无法通过配置文件为 2.x 版本提供配置参数(就像在 1.x 上一样,我将配置文件作为 configmap 挂载到容器中)。我们必须内联提供额外的配置参数。此链接说明如何: https://v2.docs.influxdata.com/v2.0/reference/config-options/
最后,这是Statefulset的工作版本:
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: influxdb
name: influxdb
spec:
replicas: 1
selector:
matchLabels:
app: influxdb
serviceName: influxdb
template:
metadata:
labels:
app: influxdb
spec:
containers:
- image: quay.io/influxdb/influxdb:2.0.0-beta
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /ping
port: api
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: influxdb
ports:
- containerPort: 9999
name: api
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /ping
port: api
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: "800m"
memory: 1200Mi
requests:
cpu: 100m
memory: 256Mi
volumeMounts:
- mountPath: /root/.influxdbv2
name: influxdb-data
volumeClaimTemplates:
- metadata:
name: influxdb-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
volumeMode: Filesystem