本文中的流程思路大体上与 ECK 文档 相近,如果你已经在看这个文档,可以直接跳到踩坑及解决方案部分进行阅读。官方文档在 elasticsearch 存储相关设置,以及 kibana 配置公网可访问上有一些坑。
补充 filebeat 部署步骤:k8s部署 filebeat 步骤、踩坑及解决方案
ECK 本质是一个elastic 家族的 operator,部署直接输入如下命令:
kubectl create -f https://download.elastic.co/downloads/eck/1.8.0/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/1.8.0/operator.yaml
返回如下结果:
查看 operator 运行日志,没有异常:
查看运维工具,配置正常:
创建 es.yml 配置文件
---
# 这一块是使用 EBS csi driver 创建性能更好的 gp3 块存储,详见下方注释
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: aws-gp3
namespace: elastic-system
provisioner: ebs.csi.aws.com # EBS csi driver 需要提前部署,也可以使用官方的 kubernetes.io/aws-ebs,官方的不支持 gp3
parameters:
type: gp3 # 官方的这里填 gp2
reclaimPolicy: Delete # 当pod被回收,存储是否需要删除,Delete是删除,Retain是保留
allowVolumeExpansion: true # 是否允许存储卷扩展大小
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: es
namespace: elastic-system
spec:
version: 7.14.1 # 这里填自己要用的版本
nodeSets:
- name: default
count: 1 # 测试环境1节点就够了,生产 >= 3
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data # 这里不要修改,进阶用法参考 ECK 官方文档
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi # 配置默认大小,allowVolumeExpansion为true后续可以扩展
storageClassName: aws-gp3 # StorageClass 名称
StorageClass 参考 官方文档,官方 provisioner 默认支持 gp2、io1 等,高性能 gp3 暂未支持(截止到2022/01/13)。
kubectl apply -f es.yml
验证健康状态,Health 需要是 green
kubectl get elasticsearch -n elastic-system
验证pod状态,需都为 Ready,STATUS 为 Running
kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=es' -n elastic-system
验证能否调用 API (需要用户名密码)
PASSWORD=$(kubectl get secret es-es-elastic-user -n elastic-system -o go-template='{{.data.elastic | base64decode}}')
kubectl port-forward service/es-es-http 9200 -n elastic-system # 另一个窗口运行
curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
创建 kibana.yml 配置文件
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: kibana
namespace: elastic-system
spec:
version: 7.14.1
count: 1
elasticsearchRef:
name: es # 填上面 elasticsearch 的名称,需要完全一致
http:
service:
spec:
type: LoadBalancer # 默认是 ClusterIP,不能直接访问
ports:
- port: 80 # 这里是把原有的 5601 端口 映射为 80 端口,方便访问以及使用域名解析
targetPort: 5601
tls:
selfSignedCertificate:
disabled: true # 如果是生产环境,建议设置 tls 的配置,这样才能加密数据
kubectl apply -f kibana.yml
验证健康状态,Health 需要是 green
kubectl get kibana-n elastic-system
验证pod状态,需都为 Ready,STATUS 为 Running
kubectl get pod --selector='kibana.k8s.elastic.co/name=kibana' -n elastic-system
登录验证
kubectl get secret kibana-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic-system | base64 --decode; echo # 获取密码,用户名默认为 elastic
kubectl get service kibana-kb-http -n elastic-system # 复制 external ip 到浏览器,打开输入账户密码,登录成功
如果你是按照官方文档如下配置直接照抄,那 elasticsearch 无法正确启动。
原因是官方参考配置中的 storageClassName: standard 不存在,你可以选择删除这一行选择默认配置,也可以选择查看当前支持的 storageClass:
kubectl get sc -n elastic-system
可以发现,默认是 gp2,还有一个是我在 yaml 中自己定义的 aws-gp3,其实自己定义一个能确保一定存在,不容易出错。
检查是否 provisioner 是否能开相应的云资源
应该修改为 LoadBalancer 或者 ingress,也可以选择把默认的 5601 端口映射为80,这样可以把公司的域名CNAME 到 external ip 上,方便直接访问。
...
http:
service:
spec:
type: LoadBalancer # 默认是 ClusterIP,不能直接访问