在k8s中搭建elasticsearch高可用集群,并對數據進行持久化存儲

🐇明明跟你說過:個人主頁

🏅個人專欄:《洞察之眼: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 的一些主要特點和功能:

  1. 索引管理:Elasticsearch-Head 允許用戶查看和管理 Elasticsearch 集群中的索引。它可以顯示索引的狀態、文檔數量、存儲大小等信息,并提供索引的創建、刪除、優化等操作。
  2. 節點監控:用戶可以通過 Elasticsearch-Head 實時監控集群中的節點狀態。它可以顯示每個節點的健康狀況、負載情況、分片分布等信息,幫助用戶識別并解決潛在的問題。
  3. 分片管理:Elasticsearch-Head 提供了對分片的可視化管理功能。用戶可以查看每個索引的分片狀態,包括分片的分配情況、復制情況等,還可以手動執行重新分片、分片移動等操作。
  4. 查詢執行:用戶可以通過 Elasticsearch-Head 發送和執行查詢請求,以檢索和分析索引中的數據。它提供了一個簡單的查詢構建器,可以幫助用戶構建和調試 Elasticsearch 查詢語句。
  5. 集群狀態: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的文章能陪伴您走過技術的一段旅程,共同見證成長和進步!😺😺😺

🧨🧨🧨讓我們一起在技術的海洋中探索前行,共同書寫美好的未來!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13138.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13138.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git項目管理——提交項目和版本回退(二)

個人名片: 🎓作者簡介:嵌入式領域優質創作者🌐個人主頁:妄北y 📞個人QQ:2061314755 💌個人郵箱:[mailto:2061314755qq.com] 📱個人微信:Vir2025WB…

android繪制多個黑豎線條

本文實例為大家分享了android繪制多個黑豎線條展示的具體代碼,供大家參考,具體內容如下 1.寫一個LinearLayout的布局,將寬度寫成5dp將高度寫成match_parent. 2.在寫一個類繼承LinearLayout,用LayoutInflater實現子布局的在這個L…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源碼 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

三.使用HashiCorp Vault工具管理數據庫

三.ubuntu安裝使用HashiCorp Vault工具管理數據庫 HashiCorp Vault 是一個基于身份的秘密和加密管理系統。機密是您想要嚴格控制訪問的任何內容,例如 API 加密密鑰、密碼和證書。Vault 提供由身份驗證和授權方法門控的加密服務。使用 Vault 的 UI、CLI 或 HTTP API,可以安全…

深度優先搜索匯總

常用英文 最近公共祖先(Lowest Common Ancestor,簡稱LCA) posterity,英語單詞,主要用作名詞,作名詞時譯為“子孫,后裔;后代”。 什么是深度優先搜索 深度優先搜索,D…

[前端] vue2的/deep/轉化為vue3語法(筆記)

vue2語法示例 <style scoped lang"less">/deep/.el-carousel__button {width: 8px;height: 3px;border-radius: 3px;}/deep/.el-carousel__indicator.is-active button {width: 16px;} } </style>在 Vue 3 中&#xff0c;/deep/ 或 >>> 選擇器…

24 內核開發- Linux 內核各種設計模式

24 內核開發- Linux 內核各種設計模式 Linux 內核中使用了各種設計模式來組織和結構其龐大的代碼庫。以下是 Linux 內核中的一些常見設計模式&#xff1a; 1. 單例模式&#xff1a; 模塊&#xff1a; init 模塊 目的&#xff1a; 初始化內核并創建第一個進程 (init_task) 實現…

uni-app 實現下拉單選功能(六)

總體的設計思想是,一個輸入框在客戶點擊時,彈出需要選擇的下拉框選項,客戶選擇完后,隱藏下拉框選項內容;并將選擇的數據填充到輸入框內。話不多說直接上代碼: <template> <view class="dianjianInfo"> <view class="uni-form…

文心一言指令

文心一言 文心一言&#xff08;ERNIE Bot&#xff09;是百度公司研發的知識增強大語言模型&#xff0c;它可以根據用戶的指令和輸入&#xff0c;生成相應的回答或文本。以下是一些可能的指令示例&#xff0c;用于指導文心一言完成不同的任務&#xff1a; 知識問答&#xff1a…

【oracle】圖片轉為字節、base64編碼等形式批量插入oracle數據庫并查詢

1.熟悉、梳理、總結下Oracle相關知識體系 2.歡迎批評指正&#xff0c;跪謝一鍵三連&#xff01; 資源下載&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3個資源文件資源下載&#xff1a; Instant Client Setup.exe資源下載&#xff1a; oci.dll、oraocci11.dll、oraoc…

LangChain_Tools

1、Tools 可以被Agent、Chain、LLM所使用。 2、tool 的必備屬性有&#xff1a;name、description、JSON schema &#xff08;tool輸入&#xff09;、調用的函數、工具的結果是否應直接返回給用戶。其中name、description和 JSON schema 可用于提示 LLM、寫入在LLM的system pro…

初識C語言——第二十一天

猜數字小游戲的實現&#xff1a; 學會了之后可以自己制作彩票抽獎&#xff0c;哈哈&#xff01; 代碼實現&#xff1a; #include <stdlib.h> #include <time.h>void menu()//無返回值函數 {printf("**************************\n");printf("****…

Linux:退出vim編輯模式

一、使用快捷鍵進行退出 1、按“Esc”鍵進入命令模式 當我們在vim編輯模式下輸入完畢需要進行退出操作時&#xff0c;首先需要按下“Esc”鍵&#xff0c;將vim編輯器從插入模式或者替換模式切換到命令模式。 ESC 2、輸入“:wq”保存并退出 在命令模式下&#xff0c;輸入“:…

在kubernetes中配置Ingress

目錄 1. 安裝Nginx Ingress Controller2. 準備TLS證書3. 編寫Ingress資源定義4. 應用Ingress配置5. 驗證配置 1. 安裝Nginx Ingress Controller 首先&#xff0c;確保你的Kubernetes集群已經準備好。你可以使用Helm或者直接通過yaml文件來安裝Nginx Ingress Controller。這里給…

云原生 初識Kubernetes的理論基礎

一、k8s 的由來及其技術運用 1.1 k8s的簡介 Kubernetes&#xff0c;詞根源于希臘語的 舵手、飛行員。在國內又稱k8s&#xff08;因為k和s之間有8個字母&#xff0c;所以得名。“國內程序員的幽默”&#xff09;。 作用&#xff1a; 用于自動部署、擴展和管理“容器化&#x…

利用遠程控制軟件FinalShell遠程連接虛擬機上的Linux系統(Windows)

一. VMware Workstation 安裝CentOS Linux操作系統 傳送門&#xff1a;VMware Workstation 安裝CentOS Linux操作系統 1.右鍵打開終端 2.輸入ifconfig 找到ens33對應 inet的id&#xff0c;這個就是虛擬機的ip地址圖中所示為&#xff1a;192.168.5.128 3.打開finalshell 如…

如何使用 PuTTY 創建 SSH 密鑰以連接到 VPS

公鑰和私鑰 SSH 密鑰的好處 如果您的無頭或遠程 VPS 可以通過互聯網訪問&#xff0c;您應該盡可能使用公鑰身份驗證而不是密碼。這是因為與僅使用密碼相比&#xff0c;SSH 密鑰提供了一種更安全的登錄方式。雖然密碼最終可以通過暴力破解攻擊破解&#xff0c;但 SSH 密鑰幾乎不…

C++ | Leetcode C++題解之第92題反轉鏈表II

題目&#xff1a; 題解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 設置 dummyNode 是這一類問題的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…

抽象類介紹

抽象類 【一】什么是抽象 # 將某幾個具體的生物&#xff0c;根據特征總結成一個類&#xff0c;逐層向上總結 # 唐老鴨 肉鴨 北京烤鴨 ---> 鴨子 # 北極熊 黑熊 --> 熊 # 貓 老虎 --> 貓科 # 鴨子 熊 貓科 --> 動物 【二】什么是繼承 # 動物 ---> 熊 --->…

【刷題篇】二分查找(二)

文章目錄 1、山脈數組的峰頂索引2、尋找峰值3、尋找旋轉排序數組中的最小值4、LCR 點名 1、山脈數組的峰頂索引 符合下列屬性的數組 arr 稱為 山脈數組 &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] &l…