基於K8S部署生產高可用的ES叢集(附遷移方案)

StarsL發表於2024-11-03

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 環境中快速實現以下功能:

  1. 部署和管理 Elasticsearch 和 Kibana 例項,包括建立、刪除、擴充套件和升級。
  2. 配置和調整 Elastic Stack 元件以滿足特定需求。
  3. 自動處理故障檢測、恢復和備份。
  4. 保護 Elasticsearch 叢集,透過安全配置、證書管理和安全通訊來確保資料安全。
  5. 監控 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

相關文章