K8S部署Elasticsearch时如何正确使用bin/elasticsearch-certutil ca生成证书
根因分析
- 路径权限问题:Elasticsearch 内置的Java安全管理器默认仅允许读取
/usr/share/elasticsearch/config目录下的SSL相关资源,你当前配置的证书路径不在允许范围内,触发了访问权限拒绝。 - 循环依赖问题:你需要进入运行中的ES Pod生成证书,但未配置证书的Pod启动直接失败,无法进入执行操作。
最优部署方案
1. 预生成证书文件
你可以在本地临时启动一个同版本的ES容器生成证书,无需提前部署集群:
- 拉取对应版本的ES镜像,启动临时容器:
docker run --rm -it docker.elastic.co/elasticsearch/elasticsearch:<你的ES版本号> bash - 容器内执行证书生成命令,这里设置为空密码适配测试/生产通用场景,需要密码可自行调整参数:
bin/elasticsearch-certutil ca --out elastic-stack-ca.p12 --pass "" bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ca-pass "" --out elastic-certificates.p12 --pass ""
- 新开一个本地终端窗口,将生成的证书拷贝到本地:
docker cp <临时容器ID>:/usr/share/elasticsearch/elastic-certificates.p12 ./
2. 将证书存入K8S Secret
将证书保存为K8S内置的Secret资源,避免证书明文写在配置文件中:kubectl create secret generic es-tls-cert --from-file=elastic-certificates.p12=./elastic-certificates.p12 -n <你的ES部署命名空间>
3. 调整StatefulSet配置
3.1 修改xpack证书路径配置
将原有配置中证书路径调整为config目录下:
- name: xpack.security.transport.ssl.keystore.path value: '/usr/share/elasticsearch/config/elastic-certificates.p12' - name: xpack.security.transport.ssl.truststore.path value: '/usr/share/elasticsearch/config/elastic-certificates.p12'
3.2 新增证书挂载配置
在StatefulSet的Pod模板中添加Secret挂载配置:
spec: template: spec: # 配置运行用户,适配ES默认非root启动的权限要求 securityContext: runAsUser: 1000 fsGroup: 1000 volumes: - name: es-tls-cert secret: secretName: es-tls-cert defaultMode: 0400 containers: - name: elasticsearch # 其他原有配置保持不变 volumeMounts: # 其他原有挂载配置保持不变 - name: es-tls-cert mountPath: /usr/share/elasticsearch/config/elastic-certificates.p12 subPath: elastic-certificates.p12 readOnly: true
4. 重新应用配置
执行kubectl apply -f <你的StatefulSet配置文件路径>即可正常启动ES集群。
内容的提问来源于stack exchange,提问作者Pablo Andrei
相关产品推荐
相关产品推荐

