【问题标题】:How to pass extra configuration to RabbitMQ with Helm?如何使用 Helm 将额外的配置传递给 RabbitMQ?
【发布时间】:2019-12-01 17:25:52
【问题描述】:

我正在使用此图表:https://github.com/helm/charts/tree/master/stable/rabbitmq 在 Kubernetes 上部署一个由 3 个 RabbitMQ 节点组成的集群。我的目的是将所有队列镜像到集群中的 2 个节点内。

这是我用来运行 Helm 的命令:helm install --name rabbitmq-local -f rabbitmq-values.yaml stable/rabbitmq

这是rabbitmq-values.yaml的内容:

persistence:
  enabled: true

resources:
  requests:
    memory: 256Mi
    cpu: 100m

replicas: 3

rabbitmq:
  extraConfiguration: |-
    {
      "policies": [
        {
          "name": "queue-mirroring-exactly-two",
          "pattern": "^ha\.",
          "vhost": "/",
          "definition": {
            "ha-mode": "exactly",
            "ha-params": 2
          }
        }
      ]
    }

但是,由于某些解析错误,节点无法启动,并且它们处于崩溃循环中。这是kubectl logs rabbitmq-local-0的输出:

BOOT FAILED
===========

Config file generation failed:
=CRASH REPORT==== 23-Jul-2019::15:32:52.880991 ===
  crasher:
    initial call: lager_handler_watcher:init/1
    pid: <0.95.0>
    registered_name: []
    exception exit: noproc
      in function  gen:do_for_proc/2 (gen.erl, line 228)
      in call from gen_event:rpc/2 (gen_event.erl, line 239)
      in call from lager_handler_watcher:install_handler2/3 (src/lager_handler_watcher.erl, line 117)
      in call from lager_handler_watcher:init/1 (src/lager_handler_watcher.erl, line 51)
      in call from gen_server:init_it/2 (gen_server.erl, line 374)
      in call from gen_server:init_it/6 (gen_server.erl, line 342)
    ancestors: [lager_handler_watcher_sup,lager_sup,<0.87.0>]
    message_queue_len: 0
    messages: []
    links: [<0.90.0>]
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 610
    stack_size: 27
    reductions: 228
  neighbours:

15:32:53.679 [error] Syntax error in /opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.conf after line 14 column 1, parsing incomplete
=SUPERVISOR REPORT==== 23-Jul-2019::15:32:53.681369 ===
    supervisor: {local,gr_counter_sup}
    errorContext: child_terminated
    reason: killed
    offender: [{pid,<0.97.0>},
               {id,gr_lager_default_tracer_counters},
               {mfargs,{gr_counter,start_link,
                                   [gr_lager_default_tracer_counters]}},
               {restart_type,transient},
               {shutdown,brutal_kill},
               {child_type,worker}]
=SUPERVISOR REPORT==== 23-Jul-2019::15:32:53.681514 ===
    supervisor: {local,gr_param_sup}
    errorContext: child_terminated
    reason: killed
    offender: [{pid,<0.96.0>},
               {id,gr_lager_default_tracer_params},
               {mfargs,{gr_param,start_link,[gr_lager_default_tracer_params]}},
               {restart_type,transient},
               {shutdown,brutal_kill},
               {child_type,worker}]

如果我删除 rabbitmq.extraConfiguration 部分,节点会正常启动,因此我在策略中输入的方式一定有问题。知道我做错了什么吗?

谢谢。

【问题讨论】:

    标签: kubernetes rabbitmq kubernetes-helm bitnami


    【解决方案1】:

    根据https://github.com/helm/charts/tree/master/stable/rabbitmq#load-definitions,可以将JSON 配置链接为extraConfiguration。所以我们最终得到了这个可行的设置:

    rabbitmq-values.yaml:

    rabbitmq:
      loadDefinition:
        enabled: true
        secretName: rabbitmq-load-definition
      extraConfiguration:
        management.load_definitions = /app/load_definition.json
    

    rabbitmq-secret.yaml:

    apiVersion: v1
    kind: Secret
    metadata:
      name: rabbitmq-load-definition
    type: Opaque
    stringData:
      load_definition.json: |-
        {
          "vhosts": [
            {
              "name": "/"
            }
          ],
          "policies": [
            {
              "name": "queue-mirroring-exactly-two",
              "pattern": "^ha\.",
              "vhost": "/",
              "definition": {
                "ha-mode": "exactly",
                "ha-params": 2
              }
            }
          ]
        }
    

    必须在播放 Helm 图表之前将密钥加载到 Kubernetes,如下所示:kubectl apply -f ./rabbitmq-secret.yaml

    【讨论】:

      【解决方案2】:

      您可以使用 HelmChart 的配置默认值

      如果需要,您可以使用 extraSecrets 让图表为您创建密钥。这样,您无需在部署版本之前手动创建它。例如:

      extraSecrets:
        load-definition:
          load_definition.json: |
            {
              "vhosts": [
                {
                  "name": "/"
                }
              ]
            }
      rabbitmq:
        loadDefinition:
          enabled: true
          secretName: load-definition
        extraConfiguration: |
          management.load_definitions = /app/load_definition.json
      

      https://github.com/helm/charts/tree/master/stable/rabbitmq

      【讨论】:

        【解决方案3】:

        不要使用extraConfiguration,而是使用advancedConfiguration,你应该把所有这些信息放在这个部分,因为它是经典配置格式(erlang)

        【讨论】:

        • 这是正确的答案。但是,我必须注意,用户添加的配置看起来像 JSON,而不是 erlang 配置格式。您可以在两个不同的地方添加配置选项: - extraConfiguration,使用 sysctl 格式 - advancedConfiguration,使用 erlang 配置格式。用户提供的格式无效。
        • 感谢两位的回答。但是,我试图将配置加载为 JSON。我在下面发布的答案在这方面有效。
        • 是否可以通过一个工作示例来扩展您的答案,说明如何使用您建议的高级配置选项来呈现 OP 的配置?
        • @PawanKumar 如果可以的话,请在您的回答中添加一些信息
        猜你喜欢
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 2012-06-19
        • 2023-01-26
        • 2012-09-01
        • 1970-01-01
        • 2019-09-20
        • 2020-03-15
        相关资源
        最近更新 更多