如何删除或忽略已安装卷中不需要的.snapshot?

时间:2019-06-26 16:35:21

标签: linux kubernetes snapshot graylog persistent-volumes

我正在使用NFS NAStorage运行kubernetes集群,并且在装载卷时,它们会在挂载点创建一个.snapshot目录。例如,这会在使用Helm Charts时引起问题,因为这些问题不会导致某些路径中的未知只读目录(例如chown ... <dir>可能会失败,从而使容器崩溃)。

在安装Graylog Helm Chart时,运行以下chown: ... Read-only file system行后,我注意到由于chown导致Graylog pod崩溃的initContainer:

chown -R 1100:1100 /usr/share/graylog/data/

安装以下卷的位置:

...
volumeMounts:
  - mountPath: /usr/share/graylog/data/journal
    name: journal
...

我尝试通过修改命令以使其在失败时运行:来“安静地”失败来解决此问题:

chown -fR 1100:1100 /usr/share/graylog/data/ || :

这使initContainer成功,但是现在主要容器崩溃了,这是由于仅存在.snapshot目录。

...
kafka.common.KafkaException: Found directory /usr/share/graylog/data/journal/.snapshot, '.snapshot' is not in the form of topic-partition
If a directory does not contain Kafka topic data it should not exist in Kafka's log directory
...

我也尝试过修改卷的安装点,将其上移一个级别,但这会引起新的问题:

...
volumeMounts:
  - mountPath: /usr/share/graylog/data
    name: data-journal
...
com.github.joschi.jadconfig.ValidationException: Parent path /usr/share/graylog/data/journal for Node ID file at /usr/share/graylog/data/journal/node-id is not a directory

我希望会有某种方法来禁用.snapshot目录的创建,理想情况下是一种首先将其卸载/从不装载的方法。这样,或以任何方式使容器完全忽略目录,以使其不干扰容器中的进程,因为它的存在似乎会严重破坏该目录。但是,我还没有找到任何类似的东西,而且似乎找不到任何有类似问题的人(至少可以这么说,在Kubernetes中引入了Volume Snapshots并没有使搜索变得容易)。

编辑1

我尝试(成功完成,得到上面的Parent path ... is not a directory错误)实现了subPath: journal,从而绕过了.snapshot目录(或者我认为是这样),但这仍然意味着可能编辑每个在我的集群中使用。希望可以找到更高级别的替代方法。

volumeMounts:
  - mountPath: /usr/share/graylog/data/journal
    name: data-journal
    subPath: journal

编辑2

我正在运行一个裸机集群,使用MetalLB和Nginx作为负载均衡器和入口控制器。 存储解决方案由第三方提供商提供,.snapshot目录是由他们的备份解决方案提供的。

我想像的解决方法

由于在使用Helm Charts或其他部署中或多或少会无法控制卷安装的其他部署中,这主要是一个问题,因此我将研究应用“ kustomization”,并在每个部署中添加一行volumeMount,添加

...
subPath: mount

或类似的东西。通过这样做,我应该将卷中的实际安装点和容器中实际要安装的目录分开一个级别,将.snapshot目录保留在抽象卷对象中。如果其他人遇到类似的问题,我将发表我的发现和可能的潜在误解。

如果有人想到了更简化的解决方案,它仍然非常受欢迎-我相信有可能对此进行改进。

1 个答案:

答案 0 :(得分:0)

在他们弄清楚需要应用哪种配置之后,我们终于由存储服务提供商解决了这个问题。如果有人遇到相同的问题并且需要知道哪种配置,请联系我们,我将询问我们的服务提供商。

在修复配置之前起作用的解决方法如下: (包括--namespace是可选的

  • 安装mongodb-replicaset和elasticsearch(v 6.8.1)
$ helm install --name mongodb-replicaset --namespace graylog stable/mongodb-replicaset

# We add the elastic repo since the 'stable' repo will be deprecated further on
$ helm repo add elastic https://helm.elastic.co
# We run elasticsearch version 6.8.1 since Graylog v3 currently is incompatible with later versions.
$ helm install elastic/elasticsearch --name elasticsearch --namespace graylog --set imageTag=6.8.1

# Wait for deployments to complete, then you can test to see all went well
$ helm test mongodb-replicaset
$ helm test elasticsearch
  • Extraxt Graylog部署模板
$ helm fetch --untar stable/graylog
$ helm dependency update graylog 
$ helm template graylog  -n graylog -f graylog-values.yaml > graylog-template.yaml
#graylog-values.yaml
tags:
  install-mongodb: false
  install-elasticsearch: false
graylog:
  mongodb:
    uri: "mongodb://mongodb-replicaset-0.mongodb-replicaset.graylog.svc.cluster.local:27017/graylog?replicaSet=rs0"
  elasticsearch:
    hosts: "http://elasticsearch-client.graylog.svc.cluster.local:9200"
# + any further values
  • namespace: graylog添加到graylog-template.yaml中的所有对象
  • subPath: mount添加到volumeMounts中使用持久卷(在这种情况下为name: journal)的所有graylog-template.yaml
...
        volumeMounts:
        - mountPath: /usr/share/graylog/data/journal
          name: journal
+         subPath: mount
...
        volumeMounts:
        - mountPath: /usr/share/graylog/data/journal
          name: journal
+         subPath: mount
...
  volumeClaimTemplates:
  - metadata:
      creationTimestamp: null
      name: journal

可以在Vim中通过键入:g/name: <volume-name>/norm osubPath: mount快速完成此操作。 请注意,“ o”和“ subPath”之间没有空格,并请注意,这也会将该行添加到volumeClaimTemplate中,需要删除该行。 “ mount”也可以称为其他名称。

  • 部署
$ kubectl apply -f graylog-template.yaml