使用新的 kubernetes 集群使用现有磁盘创建时,Elasticsearch 数据被删除

标签 elasticsearch kubernetes google-cloud-platform google-kubernetes-engine data-persistence

我在 perisistance.yaml 文件中为 elasticsearch 创建了 PersistentVolume、PersistentVolumeClaim 和 StorageClass。

PersistentVolume、StorageClass、PersistentVolumeClaim 创建成功。绑定(bind)也成功了。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ssd
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
reclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-persistent-volume
spec:
  storageClassName: ssd
  capacity:
    storage: 30G
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: gke-webtech-instance-2-pvc-f5964ddc-d446-11e9-9d1c-42010a800076
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim
spec:
  storageClassName: ssd
  volumeName: pv-persistent-volume
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30G

pv-claim_bound_successful

我还在下面附上了 elasticsearch 的 deployment.yaml。

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    name: elasticsearch
spec:
  type: NodePort
  ports:
    - name: elasticsearch-port1
      port: 9200
      protocol: TCP
      targetPort: 9200
    - name: elasticsearch-port2
      port: 9300
      protocol: TCP
      targetPort: 9300
  selector:
    app: elasticsearch
    tier: elasticsearch
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elasticsearch-application
  labels:
    app: elasticsearch
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: elasticsearch
        tier: elasticsearch
    spec:
      hostname: elasticsearch
      containers:
        - image: gcr.io/xxxxxxx/elasticsearch:7.3.1 
          name: elasticsearch
          ports:
            - containerPort: 9200
              name: elasticport1
            - containerPort: 9300
              name: elasticport2
          env:
            - name: discovery.type
              value: single-node
          volumeMounts:
          - mountPath: "/usr/share/elasticsearch/html"
            name: pv-volume
      volumes:
        - name: pv-volume
          persistentVolumeClaim:
             claimName: pv-claim

我也创建了 deployment.yaml 文件。 Elastic 搜索应用程序成功运行,没有任何问题,我也能够访问 elasticsearch URL。我已经运行测试并在 elaticsearch 中填充了数据,我也能够查看数据。

删除 Kubernetes 中的集群后,我尝试连接具有持久性数据的同一磁盘。一切都很完美。但我无法获取已存储的数据。我的数据丢失了,我猜我的磁盘是空的。

最佳答案

Kubernetes 有用于持久卷的reclaimPolicy在大多数情况下默认为delete。您可以通过以下方式更改它:

kubectl patch pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

或者简单地在 persistentVolume.yaml 中添加 persistentVolumeReclaimPolicy: Retain

已编辑:如以下评论所述,此问题可能与数据丢失无关。在下面粘贴我的评论:

“我不认为你的数据丢失了。Elasticsearch 只需要索引现有数据,因为它不只是抓取现有存储的数据。你需要将数据重新摄取到 elasticsearch 或定期保存快照或使用 master、data、client架构。”

关于使用新的 kubernetes 集群使用现有磁盘创建时,Elasticsearch 数据被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57883782/

相关文章:

python - 为什么在Elastic Search中的聚合中实现分页时 'from'关键字变得无法识别

elasticsearch - Elasticsearch 将多个字段映射到单个字段

node.js - 从 Google Cloud Datastore 中删除实体

node.js - Feathers js - 如何通过谷歌登录

elasticsearch - 在嵌套文档中搜索多个字段,在 Elasticsearch 中用or子句分隔

java - Hivesever2 无法从 elasticsearch-hadoop 加载 EsStorageHandler 类

kubernetes - 在AWS Kubernetes上安装 super 集后无法登录

java - 在 AWS 上使用 Kubernetes 创建并运行 docker 容器集群

kubernetes - 在哪里可以找到 Prometheus 指标的描述?

kubernetes - 在 GCP 中使用 Cloud Shell 访问私有(private) Kubernetes 集群