> 技术文档 > k8s下离线搭建elasticsearch_elasticsearch helm chart 离线

k8s下离线搭建elasticsearch_elasticsearch helm chart 离线


前提

已经完成k8s安装

已经完成相关组件如helm的安装

下载es的chart包

如下地址

https://helm.elastic.co/helm/elasticsearch/elasticsearch-版本号.tgz

如6.8.10

https://helm.elastic.co/helm/elasticsearch/elasticsearch-6.8.10.tgz

修改配置

统一配置

打开value.yaml文件,修改service.type为NodePort,修改service.nodePort,指定一个30000-32767的端口号,为外部访问使用,如果准备使用其他方式如只在集群内部或使用ingress代理,也可不指定

修改template/statefulset.yaml文件

在volumeClaimTemplates.spec下增加storageClass

spec: storageClass: \"elasticsearch-storageclass\"
节点

打开value.yaml文件,修改replicas和minimumMasterNodes数量为1,roles下面的参数都为true

多节点

打开value.yaml文件,根据需求修改replicas为所需的节点数(多节点部署最少为3),minimumMasterNodes数量根据需求,一般为replicas/2+1(3节点为2),roles下面的参数都为true

创建存储部分

创建存储类文件sc.yaml:

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: elasticsearch-storageclassprovisioner: kubernetes.io/no-provisionervolumeBindingMode: WaitForFirstConsumer

执行命令 

kubectl apply -f sc.yaml

创建存储卷:

pv.yaml

apiVersion: v1kind: PersistentVolumemetadata: name: pv1spec: capacity: storage: 50Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: elasticsearch-storageclass local: path: /data/espv1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - ${k8s集群的主机,只能写一条}
  1. 其中values下的k8s主机只能有一条,虽然是个列表
  2. local.path指定路径必须提前创建好,否则会报错
  3. capacity下面的存储信息按照一个es节点的需求来
  4. 如果为多节点,请创建多个pv

执行命令:

kubectl apply -f pv.yaml

注意:这是创建了es一个节点的存储卷,如果es是集群方式搭建,需要多个节点,请将上面的apply -f pv.yaml执行对应次数,并且每次修改里面meta.name、并每次根据需求修改里面的k8s主机和存储路径

下载镜像

找个能连互联网的主机

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/elasticsearch:6.8.0docker save -o es.tar swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/elasticsearch:6.8.0

之后将es.tar上传到部署环境,使用docker load上传镜像,使用dokcer tag修改镜像名称,使用docker push传到本地镜像仓库

修改value.yaml文件,把里面的image参数改成实际的镜像地址

安装

把chart包使用helm package+cm push方式上传到仓库,方法可以参考:

helm与chartmuseum安装-CSDN博客

之后执行安装命令:

helm install elasticsearch -n ${命名空间} ${本地仓库名}/elasticsearch

使用命令查看安装效果:

kubect get pod -n${命名空间}

pod都起来就行了,接着使用:

kubect get svc -n${命名空间}

查看创建的es服务,主要是端口号

之后在其他pod里面就可以用下面地址访问:

elasticsearch-master.${空间名称}.svc.cluster.local:${端口号}

在外部使用集群任意节点ip+前面指定nodePort访问

增加使用用户名密码的http basic认证

如果需要增加认证,还要做一些改造

修改values.yaml文件,修改如下内容:

esConfig: elasticsearch.yml: | network.host: 0.0.0.0 xpack.security.enabled: true xpack.security.transport.ssl.enabled: true http.cors.enabled: true http.cors.allow-origin: \"*\" http.cors.allow-headers: AuthorizationextraEnvs: - name: ELASTIC_USERNAME value: elastic - name: ELASTIC_PASSWORD value: ${密码,自己根据需求指定}

如果是多节点方式,还要复杂一些,得做一些额外的工作:

首先要生成一个证书

执行下面的一系列命令:

#使用临时容器生成证书docker run --name elastic-helm-charts-certs -i -w /app \\$(ELASTICSEARCH_IMAGE) \\/bin/sh -c \" \\elasticsearch-certutil ca --out /app/elastic-stack-ca.p12 --pass \'\' && \\elasticsearch-certutil cert --name security-master --dns security-master --ca /app/elastic-stack-ca.p12 --pass \'\' --ca-pass \'\' --out /app/elastic-certificates.p12\"#拷贝证书elastic-certificates.p12到当前目录docker cp elastic-helm-charts-certs:/app/elastic-certificates.p12 ./#删除临时容器docker rm -f elastic-helm-charts-certs#使用p12证书生成pem证书openssl pkcs12 -nodes -passin pass:\'\' -in elastic-certificates.p12 -out elastic-certificate.pem#创建证书secretkubectl create secret generic elastic-certificates --from-file=elastic-certificates.p12kubectl create secret generic elastic-certificate-pem --from-file=elastic-certificate.pem

修改配置value.yaml,在上面单机的基础上修改:

esConfig: elasticsearch.yml: | network.host: 0.0.0.0 xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.pem http.cors.enabled: true http.cors.allow-origin: \"*\" http.cors.allow-headers: AuthorizationextraEnvs: - name: ELASTIC_USERNAME value: elastic - name: ELASTIC_PASSWORD value: ${密码,自己根据需求指定}secretMounts: - name: elastic-certificates secretName: elastic-certificates path: /usr/share/elasticsearch/config/certs - name: elastic-certificate-pem secretName: elastic-certificate-pem path: /usr/share/elasticsearch/config/certs

剩下的重新helm install就行。

自行es其他密码:

使用如下格式命令进入es的pod:

kubectl exec -it ${任意es的pod名称} -n${空间名} /bin/sh

在当前es目录中使用:

bin/elasticsearch-setup-passwords interactive

指定每个用户的密码,

之后exit退出pod,再使用kubectl get pod去查看,等所有pod都启动完成即成功