在运行Kubernetes Pod中更改配置

时间:2018-08-10 12:03:33

标签: configuration kubernetes apache-nifi kubernetes-helm configmap

我已经将nifi.properties写入了Kubernetes ConfigMap。部署NiFi(作为StatefulSet)时,我想让此nifi.properties文件供刚部署的NiFi使用。为此,我为ConfigMap添加了一个卷并将其安装在Container中。关联的statefulset.yaml如下所示:

...
containers:
- name: 'myName'
  image: 'apache/nifi:latest'
  ports:
    - name: http
      containerPort: 8080
      protocol: TCP
    - name: http-2
      containerPort: 1337
      protocol: TCP
  volumeMounts:
    - name: 'nifi-config'
      mountPath: /opt/nifi/nifi-1.6.0/conf/nifi.properties
volumes:
- name: 'nifi-config'
  configMap:
    name: 'nifi-config'
...

我认为这是行不通的,因为NiFi已在运行并且nifi.properties文件已被服务锁定。无法创建广告连播,我收到错误消息:...Device or resource is busy。我也使用bootstrap.conf文件进行了尝试,该文件可以工作,但是我认为NiFi服务无法识别其中的更改,因为必须重新启动它。

我已经在纯Docker上部署NiFi时遇到了相同的问题,在该问题中,我通过停止容器,复制文件并启动容器来解决此问题;不是很漂亮,但是可以工作。

here所述,使用环境变量来更改NiFi中的值也不是一种选择,因为在那里更改参数的可能性非常有限。

仅NiFi不会发生此问题。我认为在很多情况下,有人希望更改在Kubernetes内运行的系统的配置,因此我希望有解决此问题的解决方案。

2 个答案:

答案 0 :(得分:2)

上述设置存在两个问题:

要解决第二个问题,您可以简单地将configmap项挂载为单独的文件(nifi.properties.tmp),然后通过使用自定义命令包装容器入口点,将其复制到目标位置。

...
containers:
- name: 'myName'
  image: 'apache/nifi:latest'
  ports:
    - name: http
      containerPort: 8080
      protocol: TCP
    - name: http-2
      containerPort: 1337
      protocol: TCP
  volumeMounts:
    - name: 'nifi-config'
      mountPath: /opt/nifi/nifi-1.6.0/conf/nifi.properties.tmp
      subPath: nifi.properties
  command:
  - bash
  - -c
  - |
    cat "${NIFI_HOME}/conf/nifi.properties.tmp" > "${NIFI_HOME}/conf/nifi.properties"
    exec "${NIFI_BASE_DIR}/scripts/start.sh
    # or you can do the property edits yourself and skip the helper script:
    # exec bin/nifi.sh run
volumes:
- name: 'nifi-config'
  configMap:
    name: 'nifi-config'
...

答案 1 :(得分:0)

我在helm file的帮助下解决了这个问题,但是做了一点改动。实际上,它与pepov给出的答案几乎相同,但是正如我的评论中所述,我得到了CrashLoopBackOff。这也与映像版本无关,因为我使用了自己的基于NiFi 1.6.0的映像,该映像还包含一些自定义处理器。

所以我的解决方案是使用Kubernetes的postStart处理程序。问题是不能保证在ENTRYPOINT(see)之前调用此处理程序。但是在这种情况下,广告连播会崩溃并重新启动,最终使其正确运行。现在我还没有这个问题,所以现在看来​​很好。
我将configMap的内容复制到一个专用文件夹中,并将它们复制到postStart处理程序中的关联NiFi文件夹中。

这是statefulset.yaml

...
containers:
- name: 'myName'
  image: 'apache/nifi:latest'
  ports:
    - name: http
      containerPort: 8080
      protocol: TCP
    - name: http-2
      containerPort: 1337
      protocol: TCP
  volumeMounts:
    - name: 'nifi-config'
      mountPath: /opt/nifi/nifi-1.6.0/kubeconfig
  lifecycle:
    postStart:
      exec:
        command:
          - bash
          - -c
          - |
            cp -a /opt/nifi/nifi-1.6.0/kubeconfig/. /opt/nifi/nifi-1.6.0/conf
volumes:
- name: 'nifi-config'
  configMap:
    name: 'nifi-config'
...