如何在多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能写入指定索引。
四、跨集群优化建议
- 减少公网暴露:若集群间有私网连通性,用Submariner或VPN打通集群网络,直接访问Elasticsearch的ClusterIP/内部域名,证书SAN仅需包含内部域名,降低公网攻击面。
- 统一证书生命周期:用cert-manager的ClusterIssuer跨集群共享CA,自动续签证书,避免手动维护证书的繁琐。
- 权限隔离:给每个集群的Fluent Bit创建独立Elasticsearch用户,仅分配对应索引的写入权限,便于审计和故障定位。
- 监控告警:在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
相关产品推荐
相关产品推荐

