ECK簡介
https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html
Elastic Cloud on Kubernetes (ECK) 是一個官方提供的用於在 Kubernetes 叢集中簡化部署、管理和操作 Elastic Stack(包括 Elasticsearch 和 Kibana)的擴充套件。
ECK 是一個 Kubernetes Operator,它管理和自動化 Elastic Stack 的生命週期。透過使用 ECK,可以在 Kubernetes 環境中快速實現以下功能:
- 部署和管理 Elasticsearch 和 Kibana 例項,包括建立、刪除、擴充套件和升級。
- 配置和調整 Elastic Stack 元件以滿足特定需求。
- 自動處理故障檢測、恢復和備份。
- 保護 Elasticsearch 叢集,透過安全配置、證書管理和安全通訊來確保資料安全。
- 監控 Elastic Stack 的效能和資源使用,從而最佳化叢集效能。
支援的版本
- Kubernetes 1.26-1.30(ECK2.14.0,低版本可以支援低版本的K8S,請自行到官網檢視。)
- Elasticsearch, Kibana, APM Server: 6.8+, 7.1+, 8+
- Beats: 7.0+, 8+
- Logstash: 8.7+
部署 operator
kubectl create -f https://download.elastic.co/downloads/eck/2.14.0/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.14.0/operator.yaml
部署 ES
部署版本:
- 7.17.24
部署模式:
- 3master節點,master,data共用節點。
- HTTP模式
- basic認證
- hostNetwork
- local-path
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: casslogs
namespace: elastic-system
spec:
version: 7.17.24
http:
tls:
selfSignedCertificate:
disabled: true
nodeSets:
- name: data
count: 3
# 禁用認證需要增加以下配置
#config:
# xpack.security.authc:
# anonymous:
# username: anonymous
# roles: superuser
# authz_exception: false
podTemplate:
spec:
initContainers:
- name: sysctl
securityContext:
privileged: true
runAsUser: 0
command: ['sh', '-c', 'sysctl -w vm.max_map_count=262144']
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: "-Xms16g -Xmx16g"
- name: ES_SETTING_CLUSTER_MAX__SHARDS__PER__NODE
value: '90000'
- name: ES_SETTING_HTTP_MAX__CONTENT__LENGTH
value: 300MB
- name: ES_SETTING_HTTP_MAX__INITIAL__LINE__LENGTH
value: 20KB
- name: ES_SETTING_HTTP_MAX__HEADER__SIZE
value: 32KB
- name: ES_SETTING_THREAD__POOL_WRITE_QUEUE__SIZE
value: '2000'
- name: ES_SETTING_THREAD__POOL_SEARCH_QUEUE__SIZE
value: '2000'
- name: ES_SETTING_THREAD__POOL_GET_QUEUE__SIZE
value: '2000'
resources:
limits:
cpu: 8
memory: 32Gi
requests:
cpu: 500m
memory: 512Mi
volumeMounts:
- name: timezone-volume
mountPath: /etc/localtime
readOnly: true
volumes:
- name: timezone-volume
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
elasticsearch.k8s.elastic.co/cluster-name: casslogs
topologyKey: kubernetes.io/hostname
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3000Gi
storageClassName: local-path
部署Kibana
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: kibana
namespace: elastic-system
spec:
version: 7.17.24
count: 3
elasticsearchRef:
name: casslogs
namespace: elastic-system
# 禁用認證需要增加以下配置
#config:
# xpack.security.enabled: false
http:
service:
spec:
type: NodePort
tls:
selfSignedCertificate:
disabled: true
podTemplate:
spec:
containers:
- name: kibana
env:
- name: NODE_OPTIONS
value: "--max-old-space-size=2048"
- name: I18N_LOCALE
value: zh-CN
- name: SERVER_PUBLICBASEURL
value: "http://log.casstime.cn"
resources:
requests:
memory: 100Mi
cpu: 0.5
limits:
memory: 4Gi
cpu: 2
# 禁用認證需要修改健康檢查介面
#readinessProbe:
# failureThreshold: 3
# initialDelaySeconds: 10
# periodSeconds: 10
# successThreshold: 1
# timeoutSeconds: 5
# TCP健康檢查方式
# tcpSocket:
# port: 5601
# HTTP健康檢查方式
# httpGet:
# path: /
# port: 5601
# scheme: HTTP
volumeMounts:
- name: timezone-volume
mountPath: /etc/localtime
readOnly: true
volumes:
- name: timezone-volume
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
elasticsearch.k8s.elastic.co/name: kibana
topologyKey: kubernetes.io/hostname
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
使用者管理
方式1
# 解析: Secret: casslogs-es-elastic-user
# 獲取elastic的密碼
# 登入kibana在Stack Management,安全管理中進行使用者管理
http://10.1.0.26:5601/app/management/security/users
方式2
# 編輯部署ES的yaml檔案
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: casslogs
namespace: elastic-system
spec:
version: 7.17.24
# 增加賬號管理
auth:
fileRealm:
- secretName: es-users-secret
# 新增使用者es-users-secret,設定組為超級管理員
kind: Secret
apiVersion: v1
metadata:
name: es-users-secret
namespace: elastic-system
stringData:
# 格式是 賬號:密碼
# 可以同時增加多個使用者並設定對應的組
users: |-
casslogs:cfsa3fsdfs3s
users_roles: |-
superuser:casslogs
kibana配置最佳化
# 日期格式
MM-DD@HH:mm:ss.SSS
# 預設列
message
# 時間篩選速選範圍
[
{
"from": "now-15m",
"to": "now",
"display": "最近 15 分鐘"
},
{
"from": "now-30m",
"to": "now",
"display": "最近 30 分鐘"
},
{
"from": "now-1h",
"to": "now",
"display": "最近 1 小時"
},
{
"from": "now-3h",
"to": "now",
"display": "最近 3 小時"
},
{
"from": "now-5h",
"to": "now",
"display": "最近 5 小時"
},
{
"from": "now-9h",
"to": "now",
"display": "最近 9 小時"
},
{
"from": "now-25h",
"to": "now",
"display": "最近 25 小時"
},
{
"from": "now/d",
"to": "now/d",
"display": "今日"
},
{
"from": "now-3d",
"to": "now",
"display": "最近 3 天"
},
{
"from": "now/w",
"to": "now/w",
"display": "本週"
}
]
ES資料遷移
方案 | elasticsearch-dump | esm | reindex | logstash | snapshot |
---|---|---|---|---|---|
基本原理 | 邏輯備份,類似mysqldump將資料一條一條匯出後再執行匯入 | ESM 是 medcl 開源的派生自:Elasticsearch Dumper 的工具,基於 go 語言開發。 | reindex 是 Elasticsearch 提供的一個 API 介面,可以把資料從一個叢集遷移到另外一個叢集 | 從一個叢集中讀取資料然後寫入到另一個叢集 | 從源叢集透過Snapshot API 建立資料快照,然後在目標叢集中進行恢復 |
網路要求 | 無網路互通要求 | 無網路互通要求 | 網路需要互通 | 網路需要互通 | 無網路互通要求 |
遷移速度 | 最慢 | 很慢 | 一般 | 很快 | 最快 |
適合場景 | 適用於資料量小的離線場景 | 適用於資料量小的離線場景 | 適用於資料量中等,線上遷移資料的場景 | 適用於資料量很大,實時資料傳輸的場景 | 適用於資料量特大,離線資料遷移的場景 |
配置複雜度 | 簡單 | 簡單 | 中等 | 中等 | 複雜 |
缺點 | 速度全宇宙最慢,沒有之一 | 跨大版本不能遷移mapping,需要手動遷移 | 需要設定叢集白名單,重啟elasticsearch服務 | logstash對資源要求較高,建議單獨的一臺伺服器執行。 | 在快照還原過程中無法修改分片數,分片數取決於源叢集索引設定。 |
遷移時長(1100萬條資料) | 3小時 | 1小時10分鐘 | 15分鐘 | 8分鐘 | 2分鐘 |
reindex
設定索引模板,保證寫入速率最大化
# 完成遷移後在索引管理中將number_of_replicas和refresh_interval引數設定為合適的值即可。
PUT _template/hwprod
{
"index_patterns": [
"hwprod*"
],
"order": 999,
"settings": {
"refresh_interval": "-1",
"number_of_shards": "3",
"translog": {
"sync_interval": "60s",
"durability": "async"
},
"number_of_replicas": "0"
}
}
配置叢集白名單,新增源資料叢集es地址
# 修改配置檔案方式
vim /etc/elasticsearch/elasticsearch.yml
reindex.remote.whitelist: "10.1.72.33:9200"
systemctl restart elasticsearch.service
# K8S部署環境變數模式
- name: ES_SETTING_REINDEX_REMOTE_WHITELIST
value: 10.1.72.33:9200
執行reindex遷移
# 請求
# size: 每批次的資料量
# slice: 切片數量, 和節點數一致
# wait_for_completion=false: 非同步執行
POST _reindex?wait_for_completion=false
{
"source": {
"remote": {
"host": "http://10.1.72.33:9200",
"username": "elastic",
"password": "asdf1234"
},
"index": "hwprod-2024.9.1",
"size": 10000,
"slice": {
"id": 0,
"max": 3
}
},
"dest": {
"index": "hwprod-2024.9.1"
}
}
# 響應
{
"task": "PuSABDEeTsSXUiW7U--uAw:40193"
}
# 查詢非同步任務
GET _tasks/PuSABDEeTsSXUiW7U--uAw:40193