Kubernetes 如何通过Helm将额外配置传递给RabbitMQ?

Kubernetes 如何通过Helm将额外配置传递给RabbitMQ?,kubernetes,rabbitmq,kubernetes-helm,bitnami,Kubernetes,Rabbitmq,Kubernetes Helm,Bitnami,我使用这个图表:在Kubernetes上部署一个由3个RabbitMQ节点组成的集群。我的目的是在集群中的2个节点内镜像所有队列 下面是我用来运行Helm的命令:Helm install--name rabbitmq local-f rabbitmq-values.yaml stable/rabbitmq 下面是rabbitmq值的内容。yaml: persistence: enabled: true resources: requests: memory: 256Mi

我使用这个图表:在Kubernetes上部署一个由3个RabbitMQ节点组成的集群。我的目的是在集群中的2个节点内镜像所有队列

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

下面是
rabbitmq值的内容。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日志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}]
启动失败
===========
配置文件生成失败:
=事故报告===2019年7月23日::15:32:52.880991===
撞车者:
初始调用:lager\u handler\u watcher:init/1
pid:
注册名称:[]
异常退出:noproc
在功能gen:do_for_proc/2(gen.erl,第228行)
来自gen_事件的调用中:rpc/2(gen_event.erl,第239行)
来自lager\u handler\u watcher的调用:install\u handler2/3(src/lager\u handler\u watcher.erl,第117行)
来自lager\u handler\u watcher的in调用:init/1(src/lager\u handler\u watcher.erl,第51行)
来自gen_服务器的in调用:init_it/2(gen_server.erl,第374行)
来自gen_服务器的in调用:init_it/6(gen_server.erl,第342行)
祖先:[啤酒处理工(lager\u handler\u watcher\u sup,lager\u sup,]
消息队列:0
信息:[]
链接:[]
字典:[]
陷阱_出口:错误
状态:正在运行
堆大小:610
堆栈大小:27
减少:228
邻居:
15:32:53.679[error]第14行第1列之后/opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.conf中的语法错误,解析不完整
=主管报告===2019年7月23日::15:32:53.681369===
主管:{本地,gr_counter_sup}
errorContext:已终止子项
原因:被杀
罪犯:[{pid,},
{id,gr\u lager\u default\u tracer\u counters},
{mfargs,{gr_计数器,启动_链接,
[gr\U lager\U default\U tracer\U counters]},
{restart_type,transient},
{关闭,残暴的杀戮},
{child_type,worker}]
=主管报告===2019年7月23日::15:32:53.681514===
主管:{local,gr_param_sup}
errorContext:已终止子项
原因:被杀
罪犯:[{pid,},
{id,gr_lager_default_tracer_params},
{mfargs,{gr_param,start_link,[gr_lager_default_tracer_params]},
{restart_type,transient},
{关闭,残暴的杀戮},
{child_type,worker}]
如果删除
rabbitmq.extraConfiguration
部分,节点将正确启动,因此我在策略中键入的方式肯定有问题。知道我做错了什么吗


谢谢。

不要使用extraConfiguration,而是使用advancedConfiguration,您应该将所有这些信息放在本节中,就像经典配置格式(erlang)一样。

根据,可以将
JSON
配置链接为
extraConfiguration
。因此,我们最终采用了这种有效的设置:

rabbitmq值。yaml:

rabbitmq:
  loadDefinition:
    enabled: true
    secretName: rabbitmq-load-definition
  extraConfiguration:
    management.load_definitions = /app/load_definition.json
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
          }
        }
      ]
    }
rabbitmq secret.yaml:

rabbitmq:
  loadDefinition:
    enabled: true
    secretName: rabbitmq-load-definition
  extraConfiguration:
    management.load_definitions = /app/load_definition.json
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
          }
        }
      ]
    }

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

您可以使用头盔图表的配置默认值

如果需要,您可以使用extraSecrets让图表为您创建秘密。这样,您就不需要在部署发布之前手动创建它。例如:

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

这是正确的答案。但是,我必须注意,用户添加的配置看起来像JSON,而不是erlang配置格式。您可以在两个不同的位置添加配置选项:-
extraConfiguration
,使用sysctl格式-
advancedConfiguration
,使用erlang config格式。用户提供的格式无效。谢谢你们的回答。但是,我试图将配置加载为JSON。我在下面发布的答案在这方面起作用。是否可以用一个工作示例来扩展您的答案,说明如何使用您建议的AdvancedConfiguration选项显示OP的配置?