一、K8s 部署 elasticsearch-7.14.0 集群
安装规划
组件 | replicas | 类型 |
---|---|---|
es | 3 | StatefulSet |
kibana | 1 | Deployment |
使用 k8s
版本为:v1.18.0
。
本次使用 OpenEBS
来作为存储引擎,OpenEBS
是一个开源的、可扩展的存储平台,它提供了一种简单的方式来创建和管理持久化存储卷。它支持各种存储后端,包括但不限于 ZFS
、Btrfs
、XFS
等。同时,OpenEBS
具有高度的可扩展性和可配置性,可以满足不同的存储需求。
安装 OpenEBS
:
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
验证OpenEBS
是否正确安装:
kubectl get pods -n openebs
所有的 OpenEBS pods
都处于Running
状态表示正常。
1. 创建命名空间
vi es-ns.yml
apiVersion: v1
kind: Namespace
metadata:name: eslabels:name: es
kubectl apply -f es-ns.yml
查看命名空间:
kubectl get ns
2. 创建存储卷
使用 OpenEBS
本地存储模式:
vi es-local-storage.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: es-local-storageannotations:openebs.io/cas-type: localcas.openebs.io/config: |- name: StorageTypevalue: hostpath- name: BasePathvalue: /data/openebs/es
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
kubectl apply -f es-local-storage.yml
查看存储卷:
kubectl get sc
3. 创建 ConfigMap 配置
主要声明 elasticsearch.yml
配置文件:
vi es-config.yml
apiVersion: v1
kind: ConfigMap
metadata:name: es-confignamespace: eslabels:app: es-config
data:elasticsearch.yml: |+ #集群名称cluster.name: cluster-es#节点名称,每个节点的名称不能重复,这里不指定,使用当前主机的名称# node.name: #ip 地址,每个节点的地址不能重复network.host: 0.0.0.0#是不是有资格主节点node.master: truenode.data: truehttp.port: 9200# head 插件需要这打开这两个配置,解决跨域问题http.cors.allow-origin: "*"http.cors.enabled: truehttp.max_content_length: 200mb#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 mastercluster.initial_master_nodes: ["es-0"]#es7.x 之后新增的配置,节点发现discovery.seed_hosts: ["es-0.es-svc.es.svc.cluster.local:9300","es-1.es-svc.es.svc.cluster.local:9300","es-2.es-svc.es.svc.cluster.local:9300"]gateway.recover_after_nodes: 2network.tcp.keep_alive: truenetwork.tcp.no_delay: truetransport.tcp.compress: true#集群内同时启动的数据任务个数,默认是 2 个cluster.routing.allocation.cluster_concurrent_rebalance: 16#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个cluster.routing.allocation.node_concurrent_recoveries: 16#初始化数据恢复时,并发恢复线程的个数,默认 4 个cluster.routing.allocation.node_initial_primaries_recoveries: 16
注意这里的集群间的访问使用域名:es-X.es-svc.es.svc.cluster.local
,格式为:
(podname).(headless server name).(namespace).svc.cluster.local
所以注意下面创建 Headless Service
服务名字需要为 es-svc
,StatefulSet
中Pod
的名字需要为 es
。
kubectl apply -f es-config.yml
查看 ConfigMap:
kubectl get cm -n es
4. 创建 Service 服务
这里需要创建两个,一个用于集群建访问的 Headless Service
,一个用于外部访问的 NodePort Service
:
vi es-svc.yml
# headless service
apiVersion: v1
kind: Service
metadata:name: es-svcnamespace: eslabels:app: es-svc
spec:clusterIP: Noneports:- name: rest-portport: 9200- name: cluster-portport: 9300selector:app: es---
# NodePort service
apiVersion: v1
kind: Service
metadata:name: es-svc-nodeportnamespace: eslabels:app: es-svc
spec:clusterIP: ports:- name: rest-portport: 9200nodePort: 31920targetPort: 9200selector:app: estype: NodePorttarget-port:externalTrafficPolicy: Cluster # Local 只有所在node可以访问,Cluster 公平转发
kubectl apply -f es-svc.yml
查看创建的 Service
:
kubectl get svc -n es
5. 创建 StatefulSet 应用
vi es-sfe.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: esnamespace: es
spec:serviceName: "es-svc" #填写无头服务的名称replicas: 3selector: matchLabels: app: estemplate:metadata:labels:app: esspec:containers:- name: esimage: elasticsearch:7.14.0ports:- containerPort: 9200name: es-rest-port- containerPort: 9200name: es-cluster-portenv:- name: ES_JAVA_OPTSvalue: "-Xms1g -Xmx1g"volumeMounts: - name: es-config #挂载配置mountPath: /usr/share/elasticsearch/config/elasticsearch.ymlsubPath: elasticsearch.yml- name: es-data #挂载数据mountPath: /usr/share/elasticsearch/data volumes:- name: es-configconfigMap: name: es-configvolumeClaimTemplates:- metadata:name: es-dataspec:accessModes: ["ReadWriteOnce"]storageClassName: es-local-storageresources:requests:storage: 5Gi
这里使用 volumeClaimTemplates
动态创建 pv
和 pvc
。
kubectl apply -f es-sfe.yml
查看 statefulset :
kubectl get statefulset -n es
查看 pod:
kubectl get pods -n es
使用 http
请求验证 es
服务是否正常:
http://ip:31920/_cluster/health?pretty
从结果上可以看出 ES
启动正常。
二、K8s 部署 kibana 客户端
1. 创建 Service 服务
vi kibana-svc.yml
apiVersion: v1
kind: Service
metadata:name: kibana-svc-nodeportnamespace: eslabels:app: kibana-svc
spec:clusterIP: ports:- name: kibanaport: 5601nodePort: 31561targetPort: 5601selector:app: kibanatype: NodePorttarget-port:externalTrafficPolicy: Cluster # Local 只有所在node可以访问,Cluster 公平转发
kubectl apply -f kibana-svc.yml
2. 创建 Deployment 应用
vi kibana-dm.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: kibananamespace: es
spec:replicas: 1selector: matchLabels: app: kibanatemplate:metadata:labels:app: kibanaspec:containers:- name: kibanaimage: kibana:7.14.0ports:- containerPort: 5601name: ui-portenv:- name: ELASTICSEARCH_HOSTSvalue: http://es-0.es-svc.es.svc.cluster.local:9200
kubectl apply -f kibana-dm.yml
查看 pod :
kubectl get pods -n es
下面在浏览器访问 kibana 页面:
http://ip:31561/
三、测试
使用 kibana
创建一个 test_index
索引:
PUT /test_index
查看 test_index
索引信息:
GET /test_index
向 test_index
索引中添加数据:
PUT /test_index/user/1
{"name": "张三","age": 15,"sex": "男"
}
查询添加的数据:
GET /test_index/user/1