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
关键修改说明
- 新增可写卷:
graylog-config-writable作为emptyDir,提供可写的存储介质,解决ConfigMap只读的问题 - 调整initContainer逻辑:从ConfigMap挂载的只读目录复制文件到emptyDir,并提前创建
node-id文件(Graylog启动时会自动写入节点ID,避免因目录只读导致创建失败) - 替换主容器挂载卷:主容器挂载可写的emptyDir卷,而非原ConfigMap卷,确保Graylog能正常修改配置文件
验证步骤
- 应用修改后的配置:
kubectl apply -f graylog-deployment.yaml - 检查Pod状态:
kubectl get pods -l app=graylog,确认initContainer执行完成且主容器正常启动 - 进入容器验证权限:
kubectl exec -it graylog-0 -- ls -l /usr/share/graylog/data/config,确认文件具备可写权限
内容的提问来源于stack exchange,提问作者Shdow89
相关产品推荐
相关产品推荐

