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。
這一叢集的特點是:
- ES 叢集分為 Master/Client/Data 三組,各司其職,各自可以設定自己的資源使用,引數配置等。
- 提供了 StatefulSet 形式的資料節點,便於資料持久化的支援。
- 採用 Curator 的 CronJob,用於資料的清理。
- 自定義的 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 及其配置有著相當豐富的功能,例如使用者和角色的管理等。
- 證書也是可以使用合法證書進行替代的,不一定需要使用自這個過程中生成的自簽名證書。