🐇明明跟你說過:個人主頁
🏅個人專欄:《洞察之眼:ELK監控與可視化》🏅
🔖行路有良友,便是天堂🔖
目錄
一、引言
1、Elasticsearch簡介
2、k8s簡介
二、環境準備?
1、k8s集群搭建
2、存儲準備
三、搭建es集群
1、編寫YAML文件
2、創建es集群?
3、創建Service?
4、訪問測試?
四、安裝elasticsearch-head工具?
1、elasticsearch-head介紹
2、安裝Elasticsearch-Head
3、訪問測試
一、引言
1、Elasticsearch簡介
Elasticsearch 是一個開源的分布式搜索和分析引擎,最初由 Elasticsearch N.V. 公司開發,并于 2010 年首次發布。它建立在 Apache Lucene 基礎之上,提供了分布式的實時搜索和分析功能,被廣泛應用于各種場景,包括日志分析、全文搜索、監控和可視化等。
以下是 Elasticsearch 的一些重要特點和功能:
1. 分布式架構:
- Elasticsearch 是一個分布式系統,數據可以水平擴展到多個節點上存儲和處理。
- 數據被分割成多個分片(Shard),每個分片可以被復制到多個副本(Replica),以提高數據的可用性和容錯性。
2. 實時搜索:
- Elasticsearch 提供了快速的實時搜索功能,可以在大規模數據集上快速地進行搜索、過濾和排序。
- 支持復雜的搜索查詢語法和全文搜索功能,可以滿足各種搜索需求。
3. 多種數據類型:
- Elasticsearch 支持多種數據類型的存儲和索引,包括文本、數字、日期、地理位置等。
- 支持結構化數據和非結構化數據的索引和查詢。
4. 強大的聚合和分析:
- Elasticsearch 提供了豐富的聚合(Aggregation)功能,可以對數據進行統計、分組、計算等操作。
- 支持各種聚合函數和桶(Bucket)操作,可以生成復雜的數據分析報表和可視化。
5. RESTful API:
- Elasticsearch 提供了基于 RESTful API 的接口,支持各種 HTTP 請求和 CRUD 操作。
- 開發者可以使用各種編程語言和工具與 Elasticsearch 進行交互,實現數據的索引、搜索和分析。
6. 可擴展性和靈活性:
- Elasticsearch 提供了豐富的插件和擴展機制,可以根據需求定制和擴展功能。
- 支持與其他開源工具和系統集成,如 Logstash、Kibana、Beats 等,構建完整的日志分析和監控解決方案。
2、k8s簡介
Kubernetes單詞起源于希臘語, 是“舵手”或者“領航員、飛行員”的意思。
Kubernetes(簡稱K8s)的前世今生可以追溯到谷歌(Google)內部的一個項目,它起源于2003年,當時谷歌正面臨著不斷增長的應用程序和服務的管理挑戰。這個項目最初被稱為"Borg",是一個早期的容器編排系統。Borg 的成功經驗成為 Kubernetes 開發的契機。
?有關k8s起源的介紹,請參考《初識K8s之前世今生、架構、組件、前景》這篇文章
???
?
Kubernetes的優點包括可移植性、可伸縮性和擴展性。它使用輕型的YAML清單文件實現聲明性部署方法,對于應用程序更新,無需重新構建基礎結構。管理員可以計劃和部署容器,根據需要擴展容器并管理其生命周期。借助Kubernetes的開放源代碼API,用戶可以通過首選編程語言、操作系統、庫和消息傳遞總線來構建應用程序,還可以將現有持續集成和持續交付(CI/CD)工具集成。
二、環境準備?
1、k8s集群搭建
如果還未搭建k8s集群,請參考《在Centos中搭建 K8s 1.23 集群超詳細講解》?
2、存儲準備
在K8s中,創建一個存儲類,用于持久化存儲es集群的數據,保證node節點重啟后數據不會丟失
存儲類搭建,請參考《k8s 存儲類(StorageClass)創建與動態生成PV解析,(附帶鏡像)》這篇文章
三、搭建es集群
1、編寫YAML文件
apiVersion: v1
kind: Namespace
metadata:name: es
---
#創建ConfigMap用于掛載配置文件
apiVersion: v1
kind: ConfigMap
metadata:name: sirc-elasticsearch-confignamespace: eslabels:app: elasticsearch
data: #具體掛載的配置文件elasticsearch.yml: |+ cluster.name: "es-cluster"network.host: 0.0.0.0http.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.allow-headers: "*"bootstrap.system_call_filter: falsexpack.security.enabled: falseindex.number_of_shards: 5index.number_of_replicas: 1
#創建StatefulSet,ES屬于數據庫類型的應用,此類應用適合StatefulSet類型
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: elasticsearchnamespace: es
spec:serviceName: "elasticsearch-cluster" #填寫無頭服務的名稱replicas: 5selector: matchLabels: app: elasticsearchtemplate:metadata:labels:app: elasticsearchspec:initContainers:- name: fix-permissionsimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]securityContext:privileged: truevolumeMounts:- name: es-datamountPath: /usr/share/elasticsearch/data- name: increase-vm-max-mapimage: busyboximagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true- name: increase-fd-ulimitimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "ulimit -n 65536"]securityContext:privileged: truecontainers:- name: elasticsearchimage: elasticsearch:7.17.18imagePullPolicy: Neverresources:requests:memory: "1000Mi"cpu: "1000m"limits:memory: "2000Mi"cpu: "2000m"ports:- containerPort: 9200name: elasticsearchenv:- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name #metadata.name獲取自己pod名稱添加到變量MY_POD_NAME,status.hostIP獲取自己ip等等可以自己去百度- name: discovery.typevalue: zen- name: cluster.namevalue: elasticsearch- name: cluster.initial_master_nodesvalue: "elasticsearch-0,elasticsearch-1,elasticsearch-2,elasticsearch-3,elasticsearch-4"- name: discovery.zen.minimum_master_nodesvalue: "3"- name: discovery.seed_hostsvalue: "elasticsearch-0.elasticsearch-cluster.es,elasticsearch-1.elasticsearch-cluster.es,elasticsearch-2.elasticsearch-cluster.es,elasticsearch-3.elasticsearch-cluster.es,elasticsearch-4.elasticsearch-cluster.es"- name: network.hostvalue: "0.0.0.0"- name: "http.cors.allow-origin"value: "*"- name: "http.cors.enabled"value: "true"- name: "number_of_shards"value: "5"- name: "number_of_replicas"value: "1"- name: path.datavalue: /usr/share/elasticsearch/datavolumeMounts: - name: es-data #掛載數據mountPath: /usr/share/elasticsearch/data volumes:- name: elasticsearch-configconfigMap: #configMap掛載name: sirc-elasticsearch-configvolumeClaimTemplates: #這步自動創建pvc,并掛載動態pv- metadata:name: es-dataspec:accessModes: ["ReadWriteMany"]storageClassName: nfsresources:requests:storage: 10Gi
#創建Service
---
apiVersion: v1
kind: Service
metadata:name: elasticsearch-cluster #無頭服務的名稱,需要通過這個獲取ip,與主機的對應關系namespace: eslabels:app: elasticsearch
spec:ports:- port: 9200name: elasticsearchclusterIP: Noneselector:app: elasticsearch
?
- Namespace 定義:這個部分定義了一個 Kubernetes Namespace,命名為 es,用于將所有的資源組織在同一個命名空間下。
- ConfigMap 定義:這個部分創建了一個 ConfigMap,其中包含了 Elasticsearch 的配置文件 elasticsearch.yml 的內容。這些配置將被掛載到 Elasticsearch 容器中。
- StatefulSet 定義:這個部分定義了一個 StatefulSet,用于管理 Elasticsearch 的部署。它指定了多個副本數、鏡像版本、資源請求、容器端口以及其他的配置。還包括了一些 initContainers,用于初始化容器環境,以及 volumeClaimTemplates,用于動態創建持久化存儲。
- Service 定義:這個部分創建了一個 Headless Service,用于為 StatefulSet 中的 Elasticsearch Pods 提供服務發現。它沒有 ClusterIP,意味著它不會暴露端口到集群內部,而是用于在集群內部進行通信。
這個 YAML 文件通過使用 Kubernetes 的各種資源對象來定義了一個完整的 Elasticsearch 部署方案
2、創建es集群?
[root@master es]# kubectl apply -f es.yaml
查看pod狀態
?
?
3、創建Service?
為es集群創建nodeport類型的service,以便在k8s集群外部訪問使用es
編寫YAML文件
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-0namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-0ports:- protocol: TCPport: 80 # Service 暴露的端口targetPort: 9200 # Pod 中容器的端口nodePort: 30000 # NodePort 類型的端口范圍為 30000-32767,可以根據需要調整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-1namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-1ports:- protocol: TCPport: 80 # Service 暴露的端口targetPort: 9200 # Pod 中容器的端口nodePort: 30001 # NodePort 類型的端口范圍為 30000-32767,可以根據需要調整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-2namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-2ports:- protocol: TCPport: 80 # Service 暴露的端口targetPort: 9200 # Pod 中容器的端口nodePort: 30002 # NodePort 類型的端口范圍為 30000-32767,可以根據需要調整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-3namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-3ports:- protocol: TCPport: 80 # Service 暴露的端口targetPort: 9200 # Pod 中容器的端口nodePort: 30003 # NodePort 類型的端口范圍為 30000-32767,可以根據需要調整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-4namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-4ports:- protocol: TCPport: 80 # Service 暴露的端口targetPort: 9200 # Pod 中容器的端口nodePort: 30004 # NodePort 類型的端口范圍為 30000-32767,可以根據需要調整
1. Service 元數據:定義了服務的元數據,包括名稱和命名空間。這個服務的名稱為 my-nodeport-service-0,命名空間為 es。
2. Service 規范:規定了服務的類型、選擇器和端口設置。
- type: NodePort:指定了這個服務的類型為 NodePort,這意味著服務將通過每個節點上的指定端口(nodePort)暴露給外部客戶端。
- selector:定義了服務所匹配的 Pod 選擇器。在這里,它使用了一個特殊的標簽 statefulset.kubernetes.io/pod-name,以匹配名為 elasticsearch-0 的 StatefulSet 中的 Pod。
- ports:定義了服務所使用的端口配置。
- protocol: TCP:指定了服務使用的協議為 TCP。
- port: 80:指定了服務暴露的端口號為 80,這是外部客戶端可以連接的端口。
- targetPort: 9200:指定了服務轉發到 Pod 中容器的端口號為 9200,這是 Elasticsearch Pod 中運行的實際服務的端口。
- nodePort: 30000:指定了 NodePort 類型的端口號為 30000,這個端口將被每個節點使用來暴露服務。
創建svc
[root@master es]# kubectl apply -f service.yaml
?查看svc
?
4、訪問測試?
在瀏覽器輸入node節點IP加30000端口
?
四、安裝elasticsearch-head工具?
1、elasticsearch-head介紹
Elasticsearch-Head 是一個基于瀏覽器的開源工具,用于可視化和管理 Elasticsearch 集群。它提供了一個直觀的用戶界面,可以幫助用戶輕松地監控和管理 Elasticsearch 集群中的索引、節點、分片等。
以下是 Elasticsearch-Head 的一些主要特點和功能:
- 索引管理:Elasticsearch-Head 允許用戶查看和管理 Elasticsearch 集群中的索引。它可以顯示索引的狀態、文檔數量、存儲大小等信息,并提供索引的創建、刪除、優化等操作。
- 節點監控:用戶可以通過 Elasticsearch-Head 實時監控集群中的節點狀態。它可以顯示每個節點的健康狀況、負載情況、分片分布等信息,幫助用戶識別并解決潛在的問題。
- 分片管理:Elasticsearch-Head 提供了對分片的可視化管理功能。用戶可以查看每個索引的分片狀態,包括分片的分配情況、復制情況等,還可以手動執行重新分片、分片移動等操作。
- 查詢執行:用戶可以通過 Elasticsearch-Head 發送和執行查詢請求,以檢索和分析索引中的數據。它提供了一個簡單的查詢構建器,可以幫助用戶構建和調試 Elasticsearch 查詢語句。
- 集群狀態:Elasticsearch-Head 顯示了整個集群的狀態和健康狀況。它可以顯示集群中的節點數量、主節點數量、分片數量等信息,并提供了實時的集群健康指標。
?
總的來說,Elasticsearch-Head 是一個非常有用的工具,可以幫助用戶更加輕松地管理和監控 Elasticsearch 集群。它的直觀界面和豐富功能使得用戶可以更加高效地進行索引管理、節點監控、分片管理等操作。
2、安裝Elasticsearch-Head
編寫YAML文件
apiVersion: apps/v1
kind: Deployment
metadata:name: elasticsearchheadnamespace: es
spec:replicas: 1selector:matchLabels:app: elasticsearchheadtemplate:metadata:labels:app: elasticsearchheadspec:containers:- name: elasticsearchheadimage: mobz/elasticsearch-head:5ports:- containerPort: 9100
---
apiVersion: v1
kind: Service
metadata:name: elasticsearchhead-servicenamespace: es
spec:type: NodePortports:- port: 9100targetPort: 9100nodePort: 30910 # 可根據需要選擇合適的端口號selector:app: elasticsearchhead
部署?elasticsearchhead
[root@master es]# kubectl apply -f elasticsearch-head.yaml
3、訪問測試
在瀏覽器輸入node節點IP加30910端口
💕💕💕每一次的分享都是一次成長的旅程,感謝您的陪伴和關注。希望這些關于Kubernetes的文章能陪伴您走過技術的一段旅程,共同見證成長和進步!😺😺😺
🧨🧨🧨讓我們一起在技術的海洋中探索前行,共同書寫美好的未來!!!