如何在Helm模板中读取Elasticsearch TLS证书Secret并挂载到Kafka Pod
解决方案
Kubernetes 默认禁止跨命名空间直接引用 Secret 资源,因此无法直接在其他命名空间的 Deployment 中直接挂载 elasticsearch 命名空间下的证书 Secret,可选择以下两种方案实现需求:
方案一:同步 Secret 到 Kafka 部署的命名空间(推荐,维护成本低)
操作步骤如下:
- 手动将 Elasticsearch 命名空间下的证书 Secret 同步到 Kafka 部署的目标命名空间(示例中目标命名空间为
kafka,可替换为你实际使用的命名空间):
# 导出原Secret配置并替换命名空间后导入 kubectl get secret -n elasticsearch elasticsearch-coordinating-only-crt -o yaml \ | yq eval 'del(.metadata.creationTimestamp, .metadata.resourceVersion, .metadata.uid, .metadata.ownerReferences)' - \ | sed "s/namespace: elasticsearch/namespace: kafka/" \ | kubectl apply -f -
如果没有安装yq工具,也可以手动导出Secret配置后删除不需要的元信息,修改命名空间后再导入。
- 修改
kafka-connect.yamlDeployment 配置,新增证书卷和挂载配置,修改后的完整配置如下:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "kafka.fullname" . }}-connect labels: {{- include "common.labels.standard" . | nindent 4 }} app.kubernetes.io/component: connector spec: replicas: 1 selector: matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} app.kubernetes.io/component: connector template: metadata: labels: {{- include "common.labels.standard" . | nindent 8 }} app.kubernetes.io/component: connector spec: containers: - name: connect image: REDACTED.dkr.ecr.REDACTED.amazonaws.com/kafka-connect-elasticsearch imagePullPolicy: Always command: - /bin/bash - -ec - bin/connect-standalone.sh custom-config/connect-standalone-custom.properties custom-config/elasticsearch.properties ports: - name: connector containerPort: 8083 volumeMounts: - name: configuration mountPath: /opt/bitnami/kafka/custom-config # 新增ES CA证书挂载 - name: es-ca-cert mountPath: /etc/ssl/certs/elasticsearch-ca.crt subPath: elasticsearch-ca.crt readOnly: true imagePullSecrets: - name: regcred volumes: - name: configuration configMap: name: {{ include "kafka.fullname" . }}-connect # 新增ES CA证书卷,引用同步后的Secret - name: es-ca-cert secret: secretName: elasticsearch-coordinating-only-crt items: - key: ca.crt path: elasticsearch-ca.crt
完成修改后重新升级 Helm Release 即可生效。
方案二:将CA证书作为Helm参数传入(无需跨命名空间同步Secret)
如果不想维护Secret同步逻辑,可以将证书内容作为值传入Helm,自动生成当前命名空间下的证书Secret,操作步骤如下:
- 在
values.yaml中新增配置项,用于接收CA证书内容:
elasticsearch: caCrt: ""
- 在templates目录下新增 Secret 模板
kafka-connect-es-ca.yaml:
apiVersion: v1 kind: Secret metadata: name: {{ include "kafka.fullname" . }}-es-ca labels: {{- include "common.labels.standard" . | nindent 4 }} app.kubernetes.io/component: connector type: Opaque data: ca.crt: {{ .Values.elasticsearch.caCrt | b64enc | quote }}
- 修改
kafka-connect.yaml的 volumes 配置,将Secret名称替换为新生成的Secret:
- name: es-ca-cert secret: secretName: {{ include "kafka.fullname" . }}-es-ca items: - key: ca.crt path: elasticsearch-ca.crt
volumeMounts配置和方案一完全一致。
- 部署/升级Helm Release时传入CA证书内容:
helm upgrade --install kafka ./your-kafka-chart-path \ --set elasticsearch.caCrt="$(kubectl get secret -n elasticsearch elasticsearch-coordinating-only-crt -o jsonpath="{.data.ca\.crt}" | base64 -d)"
注意事项
两种方案都不需要修改已有的ConfigMap配置,证书挂载路径和你配置的elastic.https.ssl.truststore.location完全匹配,部署后连接器会自动读取证书完成SSL校验。
内容的提问来源于stack exchange,提问作者Brad Solomon
相关产品推荐
相关产品推荐

