在Kubernetes容器中替换属性文件

9avjhtql  于 2024-01-06  发布在  Kubernetes
关注(0)|答案(1)|浏览(132)

在Azure Kubernetes服务上旋转Nifi集群时,我在使用configMap挂载nifi.properties文件时遇到问题。在使用以下配置挂载文件时,我收到以下错误。
sed: can't move '/opt/nifi/conf/nifi.propertiesnCjDfm' to '/opt/nifi/conf/nifi.properties': Resource busy
这个错误似乎是由于nifi示例在kubernetes有机会替换它之前已经使用了这个文件。
我正在寻找一种替代或更好的方式来配置nifi集群和管理其配置。目前我试图使用ConfigMap来存储nifi.properties或任何其他必要的文件。

  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4. name: nifi
  5. namespace: nifi-ns
  6. ...
  7. spec:
  8. template:
  9. spec:
  10. containers:
  11. - name: nifi
  12. image: xemuliam/nifi:1.9.1
  13. ...
  14. volumeMounts:
  15. ...
  16. - mountPath: /opt/nifi/conf/nifi.properties
  17. subPath: nifi.properties
  18. name: file
  19. volumes:
  20. - name: file
  21. configMap:
  22. name: nifi-properties-cm
  23. items:
  24. - key: nifi.properties
  25. path: nifi.properties

字符串
以下是我的Map:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: nifi-properties-cm
  5. namespace: nifi-ns
  6. data:
  7. nifi.properties: |
  8. # Core Properties #
  9. nifi.flow.configuration.file=./conf/flow.xml.gz
  10. ...


我试过像上面那样挂载文件,也试过挂载整个conf文件夹(我不喜欢这种方式,因为我真正想改变的唯一配置是nifi.properties)
我知道我总是可以自定义映像并给予自定义入口点来实现相同的效果,但我想尝试单独使用kubernetes解决这个问题。还有其他方法可以解决这个问题吗?有没有建议的最佳实践或解决这个问题的最佳方法?

更新:

根据下面提供的注解,我尝试创建一个init容器并将文件复制到共享卷,但这没有帮助,因为它覆盖了容器内的文件夹并使pod失败。
下面是使用的配置:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test
  5. labels:
  6. name: test
  7. spec:
  8. initContainers:
  9. - name: busybox
  10. image: busybox
  11. command: ["/bin/sh", "-c", "cp /usr/nifi.properties /opt/nifi/conf/nifi.properties"]
  12. volumeMounts:
  13. - mountPath: /usr/nifi.properties
  14. name: file
  15. subPath: nifi.properties
  16. - mountPath: /opt/nifi/conf
  17. name: config
  18. containers:
  19. - name: test
  20. image: xemuliam/nifi:1.9.1
  21. resources:
  22. limits:
  23. memory: "128Mi"
  24. cpu: "500m"
  25. ports:
  26. - containerPort: 80
  27. volumeMounts:
  28. - mountPath: /opt/nifi/conf
  29. name: config
  30. volumes:
  31. - name: file
  32. configMap:
  33. name: nifi-properties-cm
  34. - name: config
  35. emptyDir: {}


以下是我收到的应用程序日志:

  1. Exception in thread "main" java.io.FileNotFoundException: /opt/nifi/conf/bootstrap.conf (No such file or directory)
  2. at java.io.FileInputStream.open0(Native Method)
  3. at java.io.FileInputStream.open(FileInputStream.java:195)
  4. at java.io.FileInputStream.<init>(FileInputStream.java:138)
  5. at org.apache.nifi.bootstrap.RunNiFi.loadServices(RunNiFi.java:267)
  6. at org.apache.nifi.bootstrap.RunNiFi.<init>(RunNiFi.java:152)
  7. at org.apache.nifi.bootstrap.RunNiFi.main(RunNiFi.java:212)

lzfw57am

lzfw57am1#

您可以使用带有nifi.properties作为初始化值的初始化Map,并将此文件复制到文件系统中。

  1. initContainers:
  2. - name: copy
  3. image: busybox:1.28
  4. command: ["/bin/sh", "-c", "cp /config/configmap/nifi.properties /config/local/"]
  5. volumeMounts:
  6. - name: configmap
  7. mountPath: /config/configmap/
  8. - name: local
  9. mountPath: /config/local/

字符串
然后你的nifi pod可以使用复制的文件

相关问题