You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多Kubernetes集群环境中配置Elasticsearch与Fluent Bit的mTLS?

Kubernetes下Elasticsearch与Fluent Bit的mTLS配置方案

一、证书准备(基于cert-manager)

在Elasticsearch所在的西集群部署cert-manager后,按以下步骤生成所需证书:

1. 创建根CA签发器

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: es-ca-issuer
spec:
  selfSigned: {}

2. 生成Elasticsearch服务端证书

证书需包含LoadBalancer的IP/域名、集群内部服务域名作为SAN,确保内外访问都能通过证书验证:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: es-server-cert
  namespace: default
spec:
  secretName: es-server-cert-secret
  issuerRef:
    name: es-ca-issuer
    kind: ClusterIssuer
  commonName: elasticsearch
  dnsNames:
    - elasticsearch
    - elasticsearch.default.svc
    - elasticsearch.default.svc.cluster.local
    - <你的LoadBalancer域名/公网IP>
  usages:
    - server auth
    - client auth

3. 生成Fluent Bit客户端证书

可生成跨集群通用的客户端证书(或给每个集群单独生成,只要用同一CA签名即可),生成后同步到东、北、南集群:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: fluentbit-client-cert
  namespace: default
spec:
  secretName: fluentbit-client-cert-secret
  issuerRef:
    name: es-ca-issuer
    kind: ClusterIssuer
  commonName: fluentbit-client
  usages:
    - client auth

同步命令示例:kubectl get secret fluentbit-client-cert-secret -o yaml | kubectl apply -f - --context=<目标集群上下文名>

二、Elasticsearch开启mTLS

修改Elasticsearch的StatefulSet配置,挂载证书并启用HTTP层双向认证:

1. 挂载证书到Pod

在StatefulSet的volumes和volumeMounts中添加:

volumes:
  - name: es-server-cert
    secret:
      secretName: es-server-cert-secret
volumeMounts:
  - name: es-server-cert
    mountPath: /usr/share/elasticsearch/config/certs
    readOnly: true

2. 配置Elasticsearch SSL参数

通过ConfigMap或环境变量设置elasticsearch.yml:

xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: /usr/share/elasticsearch/config/certs/tls.key
xpack.security.http.ssl.certificate: /usr/share/elasticsearch/config/certs/tls.crt
xpack.security.http.ssl.certificate_authorities: /usr/share/elasticsearch/config/certs/ca.crt
xpack.security.http.ssl.client_authentication: required  # 强制客户端提供证书

重启Elasticsearch Pod,验证服务端mTLS生效。

三、Fluent Bit客户端配置(东/北/南集群)

1. 挂载客户端证书到Fluent Bit Pod

在Fluent Bit的DaemonSet/Deployment中添加:

volumes:
  - name: fluentbit-client-cert
    secret:
      secretName: fluentbit-client-cert-secret
volumeMounts:
  - name: fluentbit-client-cert
    mountPath: /fluent-bit/certs
    readOnly: true

2. 配置Elasticsearch输出插件

在Fluent Bit的ConfigMap中修改[OUTPUT]段:

[OUTPUT]
    Name            es
    Match           *
    Host            <西集群Elasticsearch的LoadBalancer IP/域名>
    Port            9200
    Index           fluentbit-logs
    TLS             On
    TLS_Verify      On
    TLS_CA_File     /fluent-bit/certs/ca.crt
    TLS_Cert_File   /fluent-bit/certs/tls.crt
    TLS_Key_File    /fluent-bit/certs/tls.key
    HTTP_User       <Elasticsearch授权用户名>
    HTTP_Passwd     <Elasticsearch用户密码>

注意:必须配置用户名密码,mTLS仅完成身份认证,Elasticsearch仍需权限控制确保Fluent Bit能写入指定索引。

四、跨集群优化建议

  1. 减少公网暴露:若集群间有私网连通性,用Submariner或VPN打通集群网络,直接访问Elasticsearch的ClusterIP/内部域名,证书SAN仅需包含内部域名,降低公网攻击面。
  2. 统一证书生命周期:用cert-manager的ClusterIssuer跨集群共享CA,自动续签证书,避免手动维护证书的繁琐。
  3. 权限隔离:给每个集群的Fluent Bit创建独立Elasticsearch用户,仅分配对应索引的写入权限,便于审计和故障定位。
  4. 监控告警:在Kibana中添加mTLS握手成功率、连接数监控;Fluent Bit开启Log_Level debug,快速排查连接失败问题。

五、常见问题排查

  • 证书SAN不匹配:执行openssl x509 -in /fluent-bit/certs/tls.crt -text | grep -A 3 "Subject Alternative Name",检查是否包含Elasticsearch的访问地址。
  • 客户端证书不被信任:确保Fluent Bit配置的TLS_CA_File是Elasticsearch服务端证书的根CA文件。
  • 权限不足:用curl --cacert ca.crt --cert tls.crt --key tls.key -u <user>:<pass> https://<es-host>:9200/_cat/indices测试索引访问权限。
  • 网络不通:在Fluent Bit Pod中执行nc -zv <es-host> 9200验证端口连通性。

内容的提问来源于stack exchange,提问作者Md. Nasir Uddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:19