ArgoCD部署Bitnami RabbitMQ时,如何从Secret读取敏感SSO配置?
针对使用Bitnami RabbitMQ Chart配置Azure AD SSO时,不想将敏感值明文存入版本控制的需求,结合ArgoCD部署环境,提供以下可行方案:
方案1:通过Helm lookup函数直接读取集群内Secret值
利用Helm的lookup函数在模板渲染阶段读取已存在的K8s Secret中的敏感值,避免在values文件中明文存储:
创建存储敏感值的Secret
在RabbitMQ部署的命名空间下创建Secret,存储PROVIDER_ID、CLIENT_ID、CLIENT_SECRET:apiVersion: v1 kind: Secret metadata: name: rabbitmq-oauth-secrets namespace: your-namespace type: Opaque stringData: PROVIDER_ID: "your-provider-id" CLIENT_ID: "your-client-id" CLIENT_SECRET: "your-client-secret"可通过ArgoCD单独部署这个Secret,或用加密工具处理后存入版本控制。
修改values.yaml中的advancedConfiguration
在advancedConfiguration中使用lookup函数读取Secret值:advancedConfiguration: |- [ {rabbit, [ {auth_backends, [rabbit_auth_backend_oauth2, rabbit_auth_backend_internal]} ]}, {rabbitmq_auth_backend_oauth2, [ {resource_server_id, <<"{{ (lookup "v1" "Secret" .Release.Namespace "rabbitmq-oauth-secrets").data.CLIENT_ID | b64dec }}">>}, {extra_scopes_source, <<"roles">>}, {key_config, [ {jwks_url, <<"https://login.microsoftonline.com/{{ (lookup "v1" "Secret" .Release.Namespace "rabbitmq-oauth-secrets").data.PROVIDER_ID | b64dec }}/discovery/v2.0/keys">>} ]} ]}, {rabbitmq_management, [ {oauth_enabled, true}, {oauth_client_id, "{{ (lookup "v1" "Secret" .Release.Namespace "rabbitmq-oauth-secrets").data.CLIENT_ID | b64dec }}"}, {oauth_client_secret, "{{ (lookup "v1" "Secret" .Release.Namespace "rabbitmq-oauth-secrets").data.CLIENT_SECRET | b64dec }}"}, {oauth_provider_url, "https://login.microsoftonline.com/{{ (lookup "v1" "Secret" .Release.Namespace "rabbitmq-oauth-secrets").data.PROVIDER_ID | b64dec }}"} ]} ].由于Chart中会通过
common.tplvalues.render渲染advancedConfiguration,这些模板语法会被正确解析。
方案2:使用ArgoCD的Values from Secret功能
ArgoCD支持直接从Secret中加载Helm Values参数,将敏感值与配置文件分离:
创建存储敏感值的Secret
在ArgoCD命名空间(或指定命名空间)创建存储敏感值的Secret:apiVersion: v1 kind: Secret metadata: name: rabbitmq-oauth-values namespace: argocd type: Opaque stringData: PROVIDER_ID: "your-provider-id" CLIENT_ID: "your-client-id" CLIENT_SECRET: "your-client-secret"配置ArgoCD Application引用Secret值
在ArgoCD Application的Helm配置中,通过valueFrom引用Secret中的值,并在values模板中使用变量:apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: rabbitmq namespace: argocd spec: destination: namespace: your-namespace server: https://kubernetes.default.svc source: chart: rabbitmq repoURL: https://charts.bitnami.com/bitnami targetRevision: 12.x.x helm: values: | advancedConfiguration: |- [ {rabbit, [ {auth_backends, [rabbit_auth_backend_oauth2, rabbit_auth_backend_internal]} ]}, {rabbitmq_auth_backend_oauth2, [ {resource_server_id, <<"{{ .Values.CLIENT_ID }}">>}, {extra_scopes_source, <<"roles">>}, {key_config, [ {jwks_url, <<"https://login.microsoftonline.com/{{ .Values.PROVIDER_ID }}/discovery/v2.0/keys">>} ]} ]}, {rabbitmq_management, [ {oauth_enabled, true}, {oauth_client_id, "{{ .Values.CLIENT_ID }}"}, {oauth_client_secret, "{{ .Values.CLIENT_SECRET }}"}, {oauth_provider_url, "https://login.microsoftonline.com/{{ .Values.PROVIDER_ID }}"} ]} ]. valueFrom: - secretKeyRef: name: rabbitmq-oauth-values key: PROVIDER_ID - secretKeyRef: name: rabbitmq-oauth-values key: CLIENT_ID - secretKeyRef: name: rabbitmq-oauth-values key: CLIENT_SECRET project: defaultArgoCD会自动将Secret中的值注入到Helm Values中,完成渲染替换。
方案3:使用Sealed Secrets加密敏感值存入版本控制
如果需要将敏感值相关资源存入版本控制,可使用Sealed Secrets工具对Secret加密:
安装Sealed Secrets控制器
在集群中部署Sealed Secrets控制器,用于解密SealedSecret资源。加密Secret为SealedSecret
使用kubeseal工具将包含敏感值的Secret加密为SealedSecret:kubectl create secret generic rabbitmq-oauth-secrets --namespace your-namespace --from-literal=PROVIDER_ID=your-provider-id --from-literal=CLIENT_ID=your-client-id --from-literal=CLIENT_SECRET=your-client-secret --dry-run=client -o yaml | kubeseal --format=yaml > sealed-rabbitmq-oauth-secrets.yaml部署SealedSecret并结合方案1使用
将生成的sealed-rabbitmq-oauth-secrets.yaml存入版本控制,通过ArgoCD部署。集群中的控制器会自动将其解密为普通Secret,之后即可使用方案1中的lookup函数读取值。
方案4:自定义Chart补丁修改配置逻辑
如果需要长期定制,可fork原Bitnami RabbitMQ Chart,修改config Secret的模板逻辑,直接从指定Secret中读取敏感值并拼接成完整的advanced.config内容:
fork原Chart并修改模板
修改templates/secrets/config.yaml中的advanced.config部分,将固定配置与从Secret读取的敏感值拼接:{{- define "rabbitmq.advanced.config" }} [ {rabbit, [ {auth_backends, [rabbit_auth_backend_oauth2, rabbit_auth_backend_internal]} ]}, {rabbitmq_auth_backend_oauth2, [ {resource_server_id, <<"{{ (lookup "v1" "Secret" .Release.Namespace .Values.oauth.secretName).data.CLIENT_ID | b64dec }}">>}, {extra_scopes_source, <<"roles">>}, {key_config, [ {jwks_url, <<"https://login.microsoftonline.com/{{ (lookup "v1" "Secret" .Release.Namespace .Values.oauth.secretName).data.PROVIDER_ID | b64dec }}/discovery/v2.0/keys">>} ]} ]}, {rabbitmq_management, [ {oauth_enabled, true}, {oauth_client_id, "{{ (lookup "v1" "Secret" .Release.Namespace .Values.oauth.secretName).data.CLIENT_ID | b64dec }}"}, {oauth_client_secret, "{{ (lookup "v1" "Secret" .Release.Namespace .Values.oauth.secretName).data.CLIENT_SECRET | b64dec }}"}, {oauth_provider_url, "https://login.microsoftonline.com/{{ (lookup "v1" "Secret" .Release.Namespace .Values.oauth.secretName).data.PROVIDER_ID | b64dec }}"} ]} ]. {{- end }} data: rabbitmq.conf: |- {{- include "common.tplvalues.render" (dict "value" .Values.configuration "context" $) | b64enc | nindent 4 }} {{- if .Values.oauth.enabled }} advanced.config: |- {{- include "rabbitmq.advanced.config" . | b64enc | nindent 4 }} {{- end }}添加values配置项
在values.yaml中添加oauth相关配置项:oauth: enabled: true secretName: rabbitmq-oauth-secrets使用自定义Chart部署
将修改后的Chart存入版本控制,通过ArgoCD引用该Chart进行部署。
内容的提问来源于stack exchange,提问作者FranAguiar

