1. 程式人生 > >Kubernetes 中 Elastic Search 叢集的通訊加密、認證和清理_Kubernetes中文社群

Kubernetes 中 Elastic Search 叢集的通訊加密、認證和清理_Kubernetes中文社群

Kubernetes 的 Release 檔案包中,一直包含了使用 Elastic Search 方案進行日誌處理的簡單例子,這個例子非常簡陋外加版本較舊,處於“能用”的狀態而已。

而近期的版本中這一情況發生了變化,原來的elasticsearch中新增了一個子目錄:

production_cluster,README.md中的介紹是:

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

這個聽起來就厲害了,關鍵字:robuts,best-practice。

這一叢集的特點是:

  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 叢集進行加固。

環境準備

映象的構建

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/shset -xeexport 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 及其配置有著相當豐富的功能,例如使用者和角色的管理等。
  • 證書也是可以使用合法證書進行替代的,不一定需要使用自這個過程中生成的自簽名證書。