在k8s中部署elasticsearch集群
文章目錄
- 在k8s中部署elasticsearch集群
- 1.部署分析
- 2.準備鏡像并推送至Harbor倉庫
- 3.創建StorageClass動態PV資源
- 4.撰寫es集群configmap資源
- 5.撰寫es集群statfulset資源
- 6.撰寫es集群svc資源
- 7.創建所有資源
- 8.查看資源的狀態
- 8.1.查看es的資源狀態
- 8.2.查看es每個節點使用的pv和pvc資訊
- 9.查看es集群資訊
- 9.1.查看集群狀態
- 9.2.查看集群的節點資訊
- 10.創建索引并在es-head查看集群
1.部署分析
elasticsearch集群節點規劃為3臺
elasticsearch采用statefulset控制器部署無狀態的應用,配合StorageClass將每個Pod的資料進行持久化
elasticsearch由于是3個節點,每個節點的組態檔都需要寫上三個節點的ip,但是我們是k8s里跑es集群,pod的ip是無法固定的,但是我們使用了statfulset之后,pod的的名稱就是固定的,因此我們可以在組態檔里寫好pod的名稱,通過服務發現的方式就可以識別到3個pod
elasticsearch資料存盤采用StorageClass PV動態供給的方式實作每個Pod都使用自己的PVC,進行資料持久化存盤
2.準備鏡像并推送至Harbor倉庫
1.拉取鏡像
[root@k8s-master1 EFK]# docker pull elasticsearch:7.4.2
7.4.2: Pulling from library/elasticsearch
d8d02d457314: Pull complete
f26fec8fc1eb: Pull complete
8177ad1fe56d: Pull complete
d8fdf75b73c1: Pull complete
47ac89c1da81: Pull complete
fc8e09b48887: Pull complete
367b97f47d5c: Pull complete
Digest: sha256:543bf7a3d61781bad337d31e6cc5895f16b55aed4da48f40c346352420927f74
Status: Downloaded newer image for elasticsearch:7.4.2
docker.io/library/elasticsearch:7.4.2
2.添加harbor倉庫
#所有節點都按如下操作
1)增加harbor倉庫地址
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://7lhvut0q.mirror.aliyuncs.com"],
"insecure-registries": [
"harbor.jiangxl.com"
]
}
2)添加hosts決議
vim /etc/hosts
192.168.16.106 harbor.jiangxl.com
3)重啟docker
systemctl restart docker
4)登陸Harbor
docker login harbor.jiangxl.com
Username: admin
Password: admin
3.推送鏡像到harbor
[root@k8s-master1 EFK]# docker tag elasticsearch:7.4.2 harbor.jiangxl.com/efk/elasticsearch:7.4.2
[root@k8s-master1 EFK]# docker push elasticsearch:7.4.2
3.創建StorageClass動態PV資源
[root@k8s-master1 elasticsearch]# vim es-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: es-storageclass
provisioner: nfs-storage-01
reclaimPolicy: Retain
[root@k8s-master1 elasticsearch]# kubectl create -f es-storageclass.yaml
storageclass.storage.k8s.io/es-storageclass created
4.撰寫es集群configmap資源
無法對每個Pod設定單獨組態檔,因此組態檔中每個節點不同的配置都以POD內部變數來實作
[root@k8s-master1 elasticsearch]# vimelasticsearch-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: es-cluster-config
namespace: elasticsearch
data:
elasticsearch.yml: |-
cluster.name: es-cluster #設定集群的名稱
node.name: ${POD_NAME} #設定節點的名稱,無法為每個POD單獨設定組態檔,因此采用POD環境變數來設定
path.data: /data/elasticsearch/data #資料存盤路徑
http.port: 9200
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["es-cluster-0.es-cluster", "es-cluster-1.es-cluster","es-cluster-2.es-cluster"] #集群節點串列,我們利用k8s的coredns通過域名來找到對應的pod,格式:pod名稱.svc名稱
cluster.initial_master_nodes: ["es-cluster-0.es-cluster", "es-cluster-1.es-cluster","es-cluster-2.es-cluster"]
node.data: true
node.master: true
node.max_local_storage_nodes: 3
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s
http.cors.enabled: true
http.cors.allow-origin: "*"
5.撰寫es集群statfulset資源
elasticsearch部署采用statfulset資源,并結合StorageClass為每個Pod提供資料持久化
[root@k8s-master1 elasticsearch]# vim elasticsearch-statfulset.yaml
apiVersion: apps/v1 #api版本號
kind: StatefulSet #控制器型別為statfulset
metadata: #定義元資料
labels: #定義標簽
k8s-app: es-cluster
version: v7.4.2
name: es-cluster #指定控制器名稱
namespace: elasticsearch #指定資源所在的命名空間
spec: #定義屬性
replicas: 3 #設定副本數
selector: #定義標簽選擇器,指定去管理哪些pod
matchLabels:
k8s-app: es-cluster
version: v7.4.2
serviceName: es-cluster #指定servicename,也就是容器的主機名,第一個pod就是es-cluster-0以此類推
template: #定義pod模板資訊
metadata: #定義元資料
labels: #定義標簽
k8s-app: es-cluster
version: v7.4.2
spec: #定義pod的屬性
containers: #定義容器
- name: es-cluster #容器的名稱
image: harbor.jiangxl.com/efk/elasticsearch:7.4.2 #鏡像的版本號
ports: #定義容器開放的埠號
- containerPort: 9200
name: db
protocol: TCP
- containerPort: 9300
name: transport
protocol: TCP
env: #定義環境變數
- name: ES_JAVA_OPTS #ES_JAVA_OPTS變數會替換對應組態檔中的內容
value: "-Xms512m -Xmx512m"
- name: POD_NAME #定義一個POD名稱的環境變數,用于configmap呼叫
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_IP #定義一個PODIP的環境變數,用于configmap呼叫
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts: #定義存盤卷掛載
- name: es-cluster-data #掛載卷的名稱
mountPath: /data/elasticsearch/data #掛載到容器的指定路徑
- name: es-cluster-config #掛載卷的名稱
mountPath: /usr/share/elasticsearch/config/elasticsearch.yml #掛載到容器的指定路徑
subPath: elasticsearch.yml #由于是只掛載一個檔案,而不是覆寫整個目錄,因此需要宣告掛載的檔案名稱
initContainers: #定義初始化容器,初始化容器在主容器啟動執行進行系統調優
- name: es-cluster-init #初始化容器的名稱
image: harbor.jiangxl.com/efk/alpine:3.6 #初始化容器的版本號
command: ["/sbin/sysctl","-w","vm.max_map_count=262144"] #初始化容器執行的命令,整個目錄就是調整一個內核引數
securityContext: #開啟特權模式,如果不開啟特權模式,容器將無權限執行命令
privileged: true
- name: es-cluster-permissions #定義第二個初始化容器的名稱
image: harbor.jiangxl.com/efk/alpine:3.6 #初始化容器的版本號
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"] #執行命令,這個命令主要是將主容器掛載的資料路徑權限進行調整,否則主容器啟動后無權限在里面寫入資料
securityContext: #開啟特權模式
privileged: true
volumeMounts: #定義存盤卷掛載,這里主要是將主容器掛載的存盤首先掛載到初始化容器,權限調整后,主容器方可使用
- name: es-cluster-data
mountPath: /usr/share/elasticsearch/data
volumes: #定義存盤卷
- name: es-cluster-config #定義存盤卷的名稱
configMap: #存盤卷的型別為configMap
name: es-cluster-config #指定的configMap名稱
volumeClaimTemplates: #定義pvc模板,由于es是有狀態的服務,每個pod都需要單獨存盤資料,因此需要使用StorageClass動態創建pv
- metadata: #定義元資料
name: es-cluster-data #定義pvc的名稱,容器掛載pvc的名稱要與這里的名稱保持一致
spec: #定義屬性
storageClassName: es-storageclass #指定使用哪個StorageClass動態創建pv
accessModes: #訪問模式為多主機可讀可寫
- ReadWriteMany
resources: #設定存盤卷的容量
requests:
storage: 10Gi
6.撰寫es集群svc資源
也可以通過ingress實作,其實es暴露在外部的意義并不大,畢竟也是專案程式呼叫的,我暴露在外面主要為了方便使用es-head插件觀察es集群上的資料
[root@k8s-master1 elasticsearch]# vim elasticsearch-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: es-cluster
name: es-cluster
namespace: elasticsearch
spec:
ports:
- port: 9200
protocol: TCP
targetPort: 9200
nodePort: 19200 #對外暴露的埠
selector:
k8s-app: es-cluster
type: NodePort #型別采用Nodeport方式
7.創建所有資源
[root@k8s-master1 elasticsearch]# kubectl apply -f ./
configmap/es-cluster-config created
statefulset.apps/es-cluster created
service/es-cluster created
storageclass.storage.k8s.io/es-storageclass created
8.查看資源的狀態
8.1.查看es的資源狀態
[root@k8s-master1 elasticsearch]# kubectl get all -n elasticsearch
NAME READY STATUS RESTARTS AGE
pod/es-cluster-0 1/1 Running 0 27m
pod/es-cluster-1 1/1 Running 0 27m
pod/es-cluster-2 1/1 Running 0 27m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/es-cluster NodePort 10.99.141.102 <none> 9200:19200/TCP 27m
NAME READY AGE
statefulset.apps/es-cluster 3/3 27m
、
8.2.查看es每個節點使用的pv和pvc資訊
每個pod都是一個es節點,每個節點都一個pvc將資料持久化
[root@k8s-master1 elasticsearch]# kubectl get pvc -n elasticsearch
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
es-cluster-data-es-cluster-0 Bound pvc-f64c0a56-573f-49f1-9684-78b05ba3e649 10Gi RWX es-storageclass 60m
es-cluster-data-es-cluster-1 Bound pvc-0144dcce-a6d7-4c38-b1b4-6c99ecd178dc 10Gi RWX es-storageclass 60m
es-cluster-data-es-cluster-2 Bound pvc-b3083e23-64c6-4a8d-ac94-d677b66d94b8 10Gi RWX es-storageclass 60m
[root@k8s-master1 elasticsearch]# kubectl get pv | grep ^pvc
pvc-0144dcce-a6d7-4c38-b1b4-6c99ecd178dc 10Gi RWX Retain Bound elasticsearch/es-cluster-data-es-cluster-1 es-storageclass 60m
pvc-b3083e23-64c6-4a8d-ac94-d677b66d94b8 10Gi RWX Retain Bound elasticsearch/es-cluster-data-es-cluster-2 es-storageclass 60m
pvc-f64c0a56-573f-49f1-9684-78b05ba3e649 10Gi RWX Retain Bound elasticsearch/es-cluster-data-es-cluster-0 es-storageclass 60m

9.查看es集群資訊
9.1.查看集群狀態
[root@k8s-master1 ~]# curl http://192.168.16.106:19200/_cluster/health?pretty{ "cluster_name" : "es-cluster", "status" : "green", #集群狀態為green "timed_out" : false, "number_of_nodes" : 3, #3個節點 "number_of_data_nodes" : 3, #3個資料節點 "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0}
9.2.查看集群的節點資訊
[root@k8s-master1 ~]# curl http://192.168.16.106:19200/_cat/nodes100.64.169.155 20 96 14 1.29 1.16 0.93 dilm - es-cluster-1100.111.156.74 24 92 8 0.08 0.24 0.50 dilm * es-cluster-0100.111.156.80 19 92 8 0.08 0.24 0.50 dilm - es-cluster-2
10.創建索引并在es-head查看集群
curl -XPUT 'http://192.168.16.106:19200/index1?pretty' -H 'Content-Type: application/json' -d '{"settings": { "number_of_shards":3, "number_of_replicas": 2}}'curl -XPUT 'http://192.168.16.106:19200/index2?pretty' -H 'Content-Type: application/json' -d '{"settings": { "number_of_shards":5, "number_of_replicas": 2}}'curl -XPUT 'http://192.168.16.106:19200/es-cluster-successful?pretty' -H 'Content-Type: application/json' -d '{"settings": { "number_of_shards":7, #分片數 "number_of_replicas": 2 #副本數,一般是集群節點個數-1}}'

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294897.html
標籤:其他
上一篇:Flink
