首页
学习
活动
专区
圈层
工具
发布
43 篇文章
1
干货 | Elasitcsearch7.X集群/索引备份与恢复实战
2
干货 | Elasticsearch 运维实战常用命令清单
3
腾讯云Elasticsearch集群运维常用命令详解一(集群篇)
4
腾讯云Elasticsearch集群运维常用命令详解二(节点篇)
5
腾讯云Elasticsearch集群运维常用命令详解三(索引篇)
6
如何系统的学习 Elasticsearch ?
7
Elasitcsearch 开发运维常用命令集锦
8
Elasticsearch集群数据备份与恢复 Snapshot & Restore
9
搭建ELFK日志采集系统
10
Kubernetes Helm3 部署 ElasticSearch & Kibana 7 集群
11
使用 Ansible 部署 Elasticsearch 集群
12
技术角 | 在CentOS 8上使用Elastic Stack: Elasticsearch/Kibana 7.8部署与认证配置
13
在CentOS 8上使用Elastic Stack: Elasticsearch/Kibana 7.8的部署与认证配置
14
Elasticsearch 生产环境集群部署最佳实践
15
ES 7.8 速成笔记(中)
16
ES 7.8 速成笔记(上)
17
如何在CentOS 7上设置生产Elasticsearch集群
18
kubernetes-2:helm实战-1:生产级别的elasticsearch集群部署
19
ElasticSearch 7集群部署
20
在CentOS 7安装ElasticSearch 7.x
21
zabbix 监控 es 集群
22
ELK 日志报警插件 ElastAlert
23
Elasticsearch集群规划最佳实践
24
kubernetes-7:elasticsearch容器化
25
Go Elasticsearch 增删改查(CRUD)快速入门
26
go操作elasticsearch示例
27
在 Kubernetes 上搭建 EFK 日志收集系统
28
一文彻底搞定 EFK 日志收集系统
29
TKE上搭建EFK日志采集系统
30
使用 EFKLK 搭建 Kubernetes 日志收集工具栈
31
腾讯云Elasticsearch集群规划及性能优化实践
32
【干货】Elasticsearch索引性能优化 (2)
33
让Elasticsearch飞起来!——性能优化实践干货
34
【干货】Elasticsearch的索引性能优化(3)
35
Elasticsearch性能优化实战指南
36
ElasticSearch性能优化官方建议
37
Elasticsearch 7.10.1集群压测报告(4核16G*3,AMD)
38
Elasticsearch压测之Esrally压测标准
39
通过 esrally 压测elasticsearch
40
Elasticsearch压测工具esrally部署之踩坑实录(上)
41
Elasticsearch压测工具Esrally部署之踩坑实录(下)
42
Elasticsearch压测工具Esrally部署指南
43
百亿架构之filebeat讲解

kubernetes-7:elasticsearch容器化

提供helm和yaml两种部署方式。

Helm部署步骤详见笔者git地址:

https://github.com/hepyu/k8s-app-config/tree/master/helm/min-cluster-allinone/es-min

yaml部署步骤详见笔者git地址:

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/es-min

目录

(1).容器化组件

(2).helm容器化方式

1.镜像准备

2.部署存储卷

3.helm部署master node

4.helm部署ingest node

5.helm部署data node

(3).yaml容器化方式

(4).yaml配置文件重点详解

1.pod亲和性

2.pod优雅关闭

3.pvc保护设置

正文

(1).容器化组件

容器化成功后的组件,因为是demo,所以replica=1,笔者的demo机器配置不高,需要节约。

(2).helm容器化方式

1.镜像准备

docker pull elasticsearch:6.4.3

重命名镜像为:docker.elastic.co/elasticsearch/elasticsearch:6.4.3

docker images |grep elasticsearch |awk '{print "docker tag ",1":"

增加helm仓库:

Add the elastic helm charts repo:

helm repo add elastic https://helm.elastic.co

2.部署存储卷

如下地址有存储卷的yaml配置,依次执行:

https://github.com/hepyu/k8s-app-config/tree/master/helm/min-cluster-allinone/es-min

代码语言:javascript
复制
kubectl apply -f es-min-data0-pv-local.yaml
kubectl apply -f es-min-data-storageclass-local.yaml
kubectl apply -f es-min-ingest0-pv-local.yaml
kubectl apply -f es-min-ingest-storageclass-local.yaml
kubectl apply -f es-min-master0-pv-local.yaml
kubectl apply -f es-min-master-storageclass-local.yaml

3.helm部署master node

helm install --name es-min-master --namespace es-min elastic/elasticsearch --version 6.4.3 --set masterService=es-min-master,nodeGroup=master,clusterName=es-min,roles.data=false,roles.ingest=false,volumeClaimTemplate.resources.requests.storage=1Gi,volumeClaimTemplate.storageClassName=es-min-master-pv-local,volumeClaimTemplate.accessModes[0]=ReadWriteOnce,replicas=1,minimumMasterNodes=1

--name:指定安装的helm套件的名称

--namespace:要部署到容器中哪个namespace

--version 6.4.3:指定要部署的es版本

--set:指定容器化的详细参数

masterService:指定es在k8s容器内部的service负载均衡的名字;代理后端的POD。

nodeGroup:因为master生产环境是不说多个节点,所以对这些节点分组,指定这个分组名字;

clusterName:指定elasticsearch集群的名字;

roles.data:指定容器是否开启data功能;

roles.ingest:指定容器是否开启ingest功能;

volumeClaimTemplate.resources.requests.storage:指定存储空间大小;

volumeClaimTemplate.storageClassName:指定存储空间的storageClassName;

volumeClaimTemplate.accessModes[0]:指定存储空间的访问模式,ReadWriteOnce表示PV只能被一个POD读写;

replicas:标识创建几个POD。

minimumMasterNodes:标识elasticsearch集群最少需要几个存活的master;

4.helm部署ingest node

helm install --name es-min-ingest --namespace es-min elastic/elasticsearch --version 6.4.3 --set masterService=es-min-master,nodeGroup=ingest,clusterName=es-min,roles.data=false,roles.master=false,volumeClaimTemplate.resources.requests.storage=1Gi,volumeClaimTemplate.storageClassName=es-min-ingest-pv-local,volumeClaimTemplate.accessModes[0]=ReadWriteOnce,replicas=1,minimumMasterNodes=1

5.helm部署data node

helm install --name es-min-data --namespace es-min elastic/elasticsearch --version 6.4.3 --set masterService=es-min-master,nodeGroup=data,clusterName=es-min,roles.master=false,roles.ingest=false,volumeClaimTemplate.resources.requests.storage=1Gi,volumeClaimTemplate.storageClassName=es-min-data-pv-local,volumeClaimTemplate.accessModes[0]=ReadWriteOnce,replicas=1,minimumMasterNodes=1

(3).yaml容器化方式

笔者github提供elasticsearch的yaml配置文件:

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/es-min

提供了一个deploy.sh,可以直接运行sh deploy.sh完成容器化;

或者依次执行命令:

代码语言:javascript
复制
kubectl apply -f es-min-data-storageclass-local.yaml
kubectl apply -f es-min-ingest-storageclass-local.yaml
kubectl apply -f es-min-master-storageclass-local.yaml


kubectl apply -f es-min-data0-pv-local.yaml
kubectl apply -f es-min-ingest0-pv-local.yaml
kubectl apply -f es-min-master0-pv-local.yaml


kubectl apply -f es-min-data-statefulset.yaml
kubectl apply -f es-min-ingest-statefulset.yaml
kubectl apply -f es-min-master-statefulset.yaml


kubectl apply -f es-min-pvc.yaml
kubectl apply -f es-min-service.yaml

(4).yaml配置文件重点详解

笔者的yaml配置文件中做了详细注释,可以直接进入github去阅读相关yaml配置文件,这里只罗列其中的重点:

1.pod亲和性

作为elasticsearch集群,data/ingest/master节点都是多个,相同类型的节点如master是不能工程拓扑到相同的workNode上的,防止一台workNode宕机后将部分数据不能访问(部分数据的primary和复本恰好都在这台宕机的workNode上)。

代码语言:javascript
复制
affinity:
        #用于规定pod不可以和哪些pod部署在同一拓扑结构下
        #因为我只有一台机器,所以只能部署1个data容器/节点,如果部署大于1的data容器,只能部署到相同的work-node节点上,违反了pod反亲和性规则。
        podAntiAffinity:
          #目前有两种主要的 node affinity:
          #requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution。
          #前者表示 pod 必须部署到满足条件的节点上,如果没有满足条件的节点,就不断重试;后者表示优先部署在满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - es-min-data
            #在 Kubernetes 1.4 版本中引入了 Pod 间的亲和性和反亲和性。
            #Pod 间的亲和性和反亲和性允许根据已经在 node 上运行的 pod 的标签 来限制 pod 调度在哪个 node 上,而不是基于 node 上的标签。
            #这些规则的形式是 “如果 X 已经运行一个或多个符合规则 Y 的 pod,那么这个 pod 应该(如果是反亲和性,则是不应该)运行在 X 上”。
            #这里 Y 指具有关联命名空间列表的 LabelSelector(或者关联 “all” 命名空间);
            #和 node 不同,由于 pod 都是有命名空间的(因此 pod 上的标签都隐式具有命名空间),
            #所以基于 pod 标签的标签选择器(label selector)必须指定命名空间。
            #概念上,X 是一个拓扑域,类似于 node、rack、cloud provider zone 和 cloud provider region 等等。您可以使用 topologyKey 来表示这个 X,topologyKey 是系统用来表示这个拓扑域的 node 标签,
            #K8S 默认支持如下 topology domain。
            #kubernetes.io/hostname
            #failure-domain.beta.kubernetes.io/zone
            #failure-domain.beta.kubernetes.io/region
            #既然 topologyKey 是拓扑域,那 Pod 之间怎样才是属于同一个拓扑域?
            #如果使用 k8s.io/hostname,
            #则表示拓扑域为 Node 范围,那么 k8s.io/hostname 对应的值不一样就是不同的拓扑域。
            #比如 Pod1 在 k8s.io/hostname=node1 的 Node 上,Pod2 在 k8s.io/hostname=node2 的 Node 上,Pod3 在 k8s.io/hostname=node1 的 Node 上,则 Pod2 和 Pod1、Pod3 不在同一个拓扑域,而Pod1 和 Pod3在同一个拓扑域。
            #如果使用 failure-domain.k8s.io/zone ,
            #则表示拓扑域为一个区域。同样,Node 的标签 failure-domain.k8s.io/zone 对应的值不一样也不是同一个拓扑域,
            #比如 Pod1 在 failure-domain.k8s.io/zone=beijing 的 Node 上,Pod2 在 failure-domain.k8s.io/zone=hangzhou 的 Node 上,则 Pod1 和 Pod2 不属于同一个拓扑域。
            topologyKey: kubernetes.io/hostname

2.pod优雅关闭

代码语言:javascript
复制
      #如果您的Pod通常需要超过30秒才能关闭,请确保增加优雅终止宽限期。可以通过在Pod YAML中设置terminationGracePeriodSeconds选项来实现.
      #如果容器在优雅终止宽限期后仍在运行,则会发送SIGKILL信号并强制删除。与此同时,所有的Kubernetes对象也会被清除。
      terminationGracePeriodSeconds: 120

3.pvc保护设置

防止误删除了PVC,如果发现PVC还有POD使用,即使执行了delete pvc的操作,依然不会删除,只有当pod也被杀掉后才会删除掉pvc。

下一篇
举报
领券