You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Graylog 5.1部署:ConfigMap配置文件只读问题求助

解决方案:Graylog 5.1 配置文件可写挂载问题

问题核心:Kubernetes中ConfigMap挂载的文件默认是只读的,而Graylog需要修改graylog.conf和log4j2.xml(比如自动生成node-id文件),因此必须通过emptyDir中转,将ConfigMap的内容复制到可写目录后再挂载给主容器。

原配置的错误点

  • initContainer的复制方向完全搞反,应该是从ConfigMap挂载的路径复制到可写目录,而非反向操作
  • 未定义emptyDir类型的卷来存储可写的配置文件
  • 主容器仍直接挂载只读的ConfigMap卷

修改后的完整StatefulSet配置

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: graylog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: graylog
  template:
    metadata:
      labels:
        app: graylog
    spec:
      volumes:
      # 1. 定义只读的ConfigMap源卷
      - name: graylog-config-original
        configMap:
            name: graylog-config
      # 2. 定义可写的emptyDir卷,用于存储复制后的配置文件
      - name: graylog-config-writable
        emptyDir: {}
      initContainers:
      - name: copy-config-files
        image: alpine
        command: ["/bin/sh", "-c"]
        args:
        - |
          # 复制ConfigMap中的配置文件到可写目录
          cp /config-original/* /config-writable/
          # 给配置文件添加可写权限
          chmod -R 0664 /config-writable/
          # 提前创建node-id文件(Graylog启动时需要写入该文件)
          touch /config-writable/node-id
          chmod 0664 /config-writable/node-id
        volumeMounts:
        - name: graylog-config-original
          mountPath: /config-original
        - name: graylog-config-writable
          mountPath: /config-writable
      containers:
      - name: graylog
        image: graylog/graylog:5.1
        ports:
        - containerPort: 9000
        - containerPort: 1514
        - containerPort: 12201
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "1"
        env:
        - name: GRAYLOG_MONGODB_URI
          value: "mongodb://mongodb:27017/graylog"
        - name: GRAYLOG_ELASTICSEARCH_HOSTS
          value: "http://elasticsearch:9200"
        - name: GRAYLOG_ROOT_PASSWORD_SHA2
          value: ****
        volumeMounts:
        - name: graylog-claim
          mountPath: /usr/share/graylog/data
        # 3. 挂载可写的emptyDir到Graylog的配置目录
        - name: graylog-config-writable
          mountPath: /usr/share/graylog/data/config
  volumeClaimTemplates:
  - metadata:
      name: graylog-claim
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: microk8s-hostpath
      resources:
        requests:
          storage: 2Gi

关键修改说明

  1. 新增可写卷:graylog-config-writable作为emptyDir,提供可写的存储介质,解决ConfigMap只读的问题
  2. 调整initContainer逻辑:从ConfigMap挂载的只读目录复制文件到emptyDir,并提前创建node-id文件(Graylog启动时会自动写入节点ID,避免因目录只读导致创建失败)
  3. 替换主容器挂载卷:主容器挂载可写的emptyDir卷,而非原ConfigMap卷,确保Graylog能正常修改配置文件

验证步骤

  1. 应用修改后的配置:kubectl apply -f graylog-deployment.yaml
  2. 检查Pod状态:kubectl get pods -l app=graylog,确认initContainer执行完成且主容器正常启动
  3. 进入容器验证权限:kubectl exec -it graylog-0 -- ls -l /usr/share/graylog/data/config,确认文件具备可写权限

内容的提问来源于stack exchange,提问作者Shdow89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:38:09