【问题标题】:Replacing a properties file within a kubernetes container替换 kubernetes 容器中的属性文件
【发布时间】:2020-11-19 17:05:49
【问题描述】:

在 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 或任何其他必要的文件。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nifi
  namespace: nifi-ns
  ...
spec:
  template:
    spec:
      containers:
      - name: nifi
        image: xemuliam/nifi:1.9.1
        ...
        volumeMounts:
        ...
        - mountPath: /opt/nifi/conf/nifi.properties
          subPath: nifi.properties
          name: file
      volumes:
      - name: file
        configMap:
            name: nifi-properties-cm
            items:
            - key: nifi.properties
              path: nifi.properties

以下是我的 configMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nifi-properties-cm
  namespace: nifi-ns
data:
  nifi.properties: |
    # Core Properties #
    nifi.flow.configuration.file=./conf/flow.xml.gz
    ...

我已经尝试像上面那样安装文件也尝试安装整个 conf 文件夹(我不喜欢这种方式,因为我真正想要更改的唯一配置是 nifi.properties)

我知道我总是可以自定义图像并提供自定义入口点来实现相同的效果,但我想尝试单独使用 kubernetes 来解决问题。有没有其他方法可以解决这个问题?是否有任何建议的最佳实践或解决此问题的最佳方法?

更新:

根据下面提供的 cmets,我尝试创建一个 init 容器并将文件复制到共享卷,但这无济于事,因为它会覆盖容器内的文件夹并使 pod 失败。

这是使用的配置:

apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    name: test
spec:
  initContainers:
  - name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "cp /usr/nifi.properties /opt/nifi/conf/nifi.properties"]
    volumeMounts:
    - mountPath: /usr/nifi.properties
      name: file
      subPath: nifi.properties
    - mountPath: /opt/nifi/conf
      name: config
  containers:
  - name: test
    image: xemuliam/nifi:1.9.1
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
    - containerPort: 80
    volumeMounts:
      - mountPath: /opt/nifi/conf
        name: config
  volumes:
  - name: file
    configMap:
        name: nifi-properties-cm
  - name: config
    emptyDir: {}

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

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

【问题讨论】:

  • 提到的文件夹 /opt/nifi/conf 已经有一些文件。 authorizers.xml、bootstrap.conf、login-identity-providers.xml、state-management.xml、bootstrap-notification-services.xml、logback.xml、nifi.properties、zookeeper.properties。但是我真的只想从这些文件中更改一个文件。

标签: kubernetes apache-nifi azure-aks


【解决方案1】:

您可以使用带有 nifi.properties 的 configmap 作为初始值,并将此文件复制到您的文件系统中。在你的 pod 中使用一个 init 容器,你可以复制它,如下例所示

initContainers:
- name: copy
 image: busybox:1.28
 command: ["/bin/sh", "-c", "cp /config/configmap/nifi.properties /config/local/"]
 volumeMounts:
 - name: configmap
   mountPath: /config/configmap/
 - name: local
   mountPath: /config/local/
      

那么你的 nifi pod 就可以使用复制的文件了

【讨论】:

  • 文件夹中还有其他文件。主容器带有路径 /opt/nifi/conf/ 中的 nifi.properties 和其他文件。如果我将 nifi 属性复制到 /opt/nifi/conf/ 文件夹,它会被覆盖并且我会丢失文件夹中的其他配置吗?
  • 使用您需要共享的属性初始化配置映射并将它们复制到 nifi 容器
  • 好的,这样做时我不会在该文件夹中保留其他文件。我已经发布了用于运行单个测试节点的配置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2014-09-02
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多