代码之家  ›  专栏  ›  技术社区  ›  Simon Linder

在运行Kubernetes Pod时更改配置

  •  0
  • Simon Linder  · 技术社区  · 7 年前

    我已经写了 nifi.properties 变成一个 Kubernetes ConfigMap . 当我部署NiFi时(作为 StatefulSet )我想要这个 nifi.属性 刚部署的NiFi使用的文件。为此,我为 ConfigMap 把它装在容器里。相关的 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.属性 文件已被服务锁定。无法创建pod,我得到一个错误: ...Device or resource is busy . 我也试过 bootstrap.conf 文件,但我认为NiFi服务无法识别其中的更改,因为必须重新启动它。

    我在纯Docker上部署NiFi时也遇到了同样的问题,在这里我通过停止容器、复制文件和启动容器来解决这个问题;虽然不是很漂亮,但是可以工作。

    使用环境变量更改NiFi中的值 here 也不是一个选项,因为改变参数的可能性非常有限。

    这个问题不只是发生在NiFi身上。我认为有很多情况下,有人希望更改运行在 Kubernetes ,所以我希望有任何解决方案来处理这个问题。

    2 回复  |  直到 7 年前
        1
  •  3
  •   pepov    7 年前

    上述设置有两个问题:

    要解决第二个问题,只需将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'
    ...
    
        2
  •  0
  •   Simon Linder    7 年前

    我用这个解决了这个问题 helm file ,但改变了一点。实际上,这和佩波夫给出的答案几乎一样,但正如我在评论中所说的,我得到了一个 CrashLoopBackOff . 这也与映像版本无关,因为我使用了自己的映像,它基于NiFi 1.6.0,还包含一些自定义处理器。

    所以我的解决方案是使用 postStart 库伯内特斯的掌门人。问题是不能保证在入口点之前调用此处理程序( see ). 但在这种情况下,吊舱会崩溃并重新启动,最终得到正确的结果;现在我还没有遇到这个问题,所以现在看来是好的。
    我复制的内容 configMap 将其复制到专用文件夹中,并将其复制到 启动后 处理程序。

    所以这里是 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'
    ...