(1).镜像准备
添加需要的Helm仓库:
helm repo add elastic https://helm.elastic.co
(2).pv准备
因为elasticsearch的data节点很明显是需要持久化保存数据的,很显然是stateful容器类型,但实际上我们会把master, ingest的也做成stateful,因为当master, ingest宕机重启后,我们需要看到连贯日志。
需要准备9个pv声明。
以data0举例:
如下图,注意一定要在NFS上建立对应的path目录,我这里是es-c1-skywalking-data0,否则建立PV不会报错,但是后边初始化容器时会有问题,无法创建POD。
相关配置参见:https://github.com/hepyu/k8s-app-config/tree/master/elasticsearch下的3个pv.yaml:
顺次执行创建pv:
kubectl apply -f ./pv-es-c1-skywalking-master.yaml
kubectl apply -f ./pv-es-c1-skywalking-ingest.yaml
kubectl apply -f ./pv-es-c1-skywalking-data.yaml
pv初始化完成后:
(3).使用helm部署生产级别的elasticsearch集群
elasticsearch集群有3类节点类型:master, ingest, data,都需要部署,每类部署3个节点,共部署9个节点。
最好顺序部署:master -> ingest -> data。
1.master node:
helm install --name es-c1-master --namespace biz elastic/elasticsearch --version 6.4.3 --set masterService=es-c1-master,nodeGroup=master,clusterName=es-c1,roles.data=false,roles.ingest=false,volumeClaimTemplate.resources.requests.storage=1Gi,volumeClaimTemplate.storageClassName=es-c1-skywalking,volumeClaimTemplate.accessModes[0]=ReadWriteMany,replicas=3,minimumMasterNodes=3
2.ingest node:
helm install --name es-c1-ingest --namespace coohua elastic/elasticsearch --version 6.4.3 --set masterService=es-c1-master,nodeGroup=ingest,clusterName=es-c1,roles.data=false,roles.master=false,volumeClaimTemplate.resources.requests.storage=1Gi,volumeClaimTemplate.storageClassName=es-c1-skywalking-ingest,volumeClaimTemplate.accessModes[0]=ReadWriteMany,replicas=3,minimumMasterNodes=3
3.data node:
helm install --name es-c1-data --namespace coohua elastic/elasticsearch --version 6.4.3 --set masterService=es-c1-master,nodeGroup=data,clusterName=es-c1,roles.master=false,roles.ingest=false,volumeClaimTemplate.resources.requests.storage=1Gi,volumeClaimTemplate.storageClassName=es-c1-skywalking-data,volumeClaimTemplate.accessModes[0]=ReadWriteMany,replicas=3,minimumMasterNodes=3
参数含义请参考官方git(结合上述命令和官方说明很容易明白):
https://github.com/elastic/helm-charts/tree/master/elasticsearch
关于本文:
其实官方git已经写的非常清楚了,但是为什么还会有这篇文章呢?因为如何使用还是需要付出一些成本的,比如如何分节点类型部署,如何指定数组类型的参数,如何避免网络问题不能pull Image等,会遇到很多细节问题需要解决。
(4).部署完成后的容器中的elasticsearch集群
(5).验证elasticsearch集群
装配ingress(还是相同的git地址):
执行kubectl apply -f ./ingress-es-c1-skywalking.yaml
执行kubectl get ingress --all-namespaces找到对应的域名和IP,配置本地访问HOST后,使用域名访问可以看到集群work:
http://es-c1-admin-skywalking.biz.com/_cluster/health?pretty
注意:
1.实际使用中,我们不会配置elasticsearch的ingress,因为ingress是容器内部和外部的通信,k8s集群里的app不需要通过ingress访问es,而是直接通过k8s的service访问。
2.更好的验证方式是通过kibana验证,下一篇聊。
(6).注意事项
1.拉取elasticsearch镜像失败
有可能存在网络问题,默认是从这里拉取elasticsearch镜像:
docker.elastic.co/elasticsearch/elasticsearch
有三个解决办法:
方法一:镜像重命名
docker pull elasticsearch:6.4.3
重命名镜像为:docker.elastic.co/elasticsearch/elasticsearch:6.4.3
docker images |grep elasticsearch |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#elasticsearch#docker\.elastic\.co\/elasticsearch\/elasticsearch#2' |sh -x
这个方法非常坑,没有实际价值,因为需要在每个k8s-worker-node执行一遍,生产环境是不可能使用这种操作的。
方法二:通过helm参数指定image拉取地址
这个方法凑合。
方法三:使用自有repo
将官方镜像打成自己的tag,然后上传到自有repo,这是生产级别的使用方法。
2.建立PV时,一定要在NFS(或者其他存储)先建立真实目录
我没有先建,后来忘了做这个操作,转了一个大弯,K8S并不提示你具体信息,而是提示"mount.nfs: access denied by server while mounting",一直误认为是权限问题。
3.helm install一定要指定nodeGroup
nodeGroup取值是master, ingest, data,对应不同es的不同角色;
nodeGroup=master时,需要roles.data=false,roles.ingest=false,其他角色类似。其他参数的使用可以参考本文样例和官方git说明。
4.建立pv时注意使用storageClasss
k8s默认是使用磁盘是声明大小来匹配pv和pvc的,需要stroageClass来特别指定用途,强制匹配。
5.要注意工程拓扑
默认情况下K8S是分配相对空闲的work node,但实际上这个策略在生产环境是行不通的,因为很有可能将es容器和线上高并发的app分配到同一个work node,而受限与硬件资源限制(如带宽等),会给服务造成很大波动(p99或者p999飙升)。
使用nodeSelector,配合work-node-label可以实现工程拓扑。
(7).参考资料:
1.elasticsearch官方git:
https://github.com/elastic/helm-charts/tree/master/elasticsearch
2.kubernetes官网。