Skip to main content

Command Palette

Search for a command to run...

K8S 上 Elastic Search 集群的通信加密、认证和清理

Updated
2 min read

Kubernetes 的 Release 文件包中,一直包含了使用 Elastic Search 方案进行日志处理的简单例子, 这个例子非常简陋外加版本较旧,处于“能用”的状态而已。

而近期的版本中这一情况发生了变化,原来的 elasticsearch 中新增了一个子目录: production_clusterREADME.md中的介绍是:

A more robust example that follows Elasticsearch best-practices of separating nodes concern is also available.

这个听起来就厉害了,关键字:robuts,best-practice。

顺藤摸瓜找到了作者的 github 地址:https://github.com/pires/

这一集群的特点是:

  1. ES 集群分为 Master/Client/Data 三组,各司其职,各自可以设置自己的资源使用,参数配置等。
  2. 提供了 StatefulSet 形式的数据节点,便于数据持久化的支持。
  3. 采用 Curator 的 CronJob,用于数据的清理。
  4. 自定义的 Elastic Search 镜像。

这一些功能自然是极好的,然而因为 X-Pack 的授权问题,使得两个重要的功能: https 通信和认证落了空,还好发现了一个替代方案:Search Guard, 简单说来,这一方案提供了免费的认证和 https 通信方案,并且提供了更多的商业支持特性。具体能力范围可以参看官网,下面基于 Pries 的 ES 5.6.3 版本,来把假设在 Kubernetes 集群上的 ES 集群进行加固。

环境准备

  • Kubernetes 集群:1.7.x
    • kube-apiserver启动参数中加入--runtime-config=batch/v2alpha1=true用于支持后面的 CronJob 对象
    • 集群存储,用于满足 PVC 需求(可选)
  • Docker:用于自定义镜像的构建
  • 源代码:
    • https://github.com/pires/kubernetes-elasticsearch-cluster
    • https://github.com/fluent/fluentd-kubernetes-daemonset.git

镜像的构建

Search Guard 的安装分为插件安装、初始化和集群设置三个步骤,Pries 镜像中推荐的插件安装方式仅能完成第一步骤,因此这里做一些定制,将前两个步骤在镜像中直接完成。

这里我们使用 Pries 镜像为基础:

Dockerfile

FROM quay.io/pires/docker-elasticsearch-kubernetes:5.6.3
COPY prepare.sh /tmp
RUN sh /tmp/prepare.sh

prepare.sh

#!/bin/sh
set -xe
export NODE_NAME="MASTER" # 占位符
# 插件安装
bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.6.3-16

# 初始化
chmod a+x plugins/search-guard-5/tools/install_demo_configuration.sh
plugins/search-guard-5/tools/install_demo_configuration.sh -y

# 清理不必要的配置
sed -i  's/network.host.*0$//' config/elasticsearch.yml
sed -i  's/cluster.name.*demo$//' config/elasticsearch.yml

运行 ES 集群

运行集群之前,注意三处需要修改:

  • 镜像名称。
  • 环境变量加入:
- name: "NETWORK_HOST"
  value: "_eth0_"
  • 因为 Search Guard 的加入,Client 的可用检测是失效的,因此需要删除。
kubectl apply -f es-discovery-svc.yaml
kubectl apply -f es-svc.yaml
kubectl apply -f es-master.yaml
kubectl apply -f es-client.yaml
kubectl apply -f es-data.yaml

集群启动之后会处于不可用状态,需要进行 Search guard 设置,使用 kubectl 命令进入任意一个 Master 节点的 Shell,编辑如下文件:

#!/bin/bash
/elasticsearch/plugins/search-guard-5/tools/sgadmin.sh \
-cd /elasticsearch/plugins/search-guard-5/sgconfig \
-ks /elasticsearch/config/kirk.jks  -arc \
-ts /elasticsearch/config/truststore.jks -nhnv -icl \
-h 172.200.62.7
  • -icl 参数用于禁止证书 CN 的检查。
  • -h 指定该 Pod 的地址。
  • -arc 接受状态为 RED 的集群操作。

这样就完成了 ES 集群的初始化设置,并且开始运行。 这时我们如果访问其服务,例如:https://node.port:9200,如果弹出安全警告,在选择不检查证书之后,会弹出验证窗口,输入预置的:admin/admin 就能看到正常的 API 页面了。

Fluentd

因为我们的 Fluentd 需要访问 https 协议的有认证要求的 ES 集群,所以这里使用 ConfigMap 的方式,为 Fluentd 加载修改好的配置文件。

首先使用 docker cp 命令,或者直接从源码中获取 fluent.conf 和 kubernetes.conf 两个文件。

在 fluent.conf 的 es 配置中加入 ssl_verify false 一行。

--from-file 开关将上文中的两个配置文件加入 ConfigMap。

修改 DaemonSet 的源码:

...
# 接入配置
- name: FLUENT_ELASTICSEARCH_SCHEME
  value: "https"
- name: FLUENT_ELASTICSEARCH_USER
  value: "admin"
- name: FLUENT_ELASTICSEARCH_PASSWORD
  value: "admin"
...
# 配置文件

volumeMounts:
...
- name: etc
  mountPath: /fluentd/etc
terminationGracePeriodSeconds: 30
volumes:
...
- name: etc
configMap:
  name: fluentd-config

这样,Fluentd 就能成功连接 es 并发送日志了。

Kibana

和 Fluentd 的情况类似,也需要创建他的配置文件,并在 kibana.yml 原有内容基础上增加几行:

elasticsearch.username: "admin"
elasticsearch.password: "admin"
elasticsearch.ssl.verificationMode: none

另外在他的 Deployment 描述中,需要将 ES 集群接口地址改为 https 协议。

启用后,打开 Kibana 页面,就会弹出认证要求。

Curator

编辑 es-curator-config.yml,修改:

use_ssl: True
ssl_no_validate: True
http_auth: admin:admin

然后创建 ConfigMap 和 Cronjob 对象即可。

补充

  • sgadmin 及其配置有着相当丰富的功能,例如用户和角色的管理等。

  • 证书也是可以使用合法证书进行替代的,不一定需要使用自这个过程中生成的自签名证书。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts