k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案

k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案,第1张

k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案

目录

写在最前

支持版本环境准备 部署

ECKelasticsearch

创建配置文件部署验证 kibana

创建配置文件部署验证 踩坑及解决方案

elasticsearch pvc 配置不对导致无法正确启动elasticsearch 存储配置对了但无法启动,不配置存储能启动kibana 默认配置下不能访问

写在最前

本文中的流程思路大体上与 ECK 文档 相近,如果你已经在看这个文档,可以直接跳到踩坑及解决方案部分进行阅读。官方文档在 elasticsearch 存储相关设置,以及 kibana 配置公网可访问上有一些坑。
TODO: 后续补充 filebeat 安装步骤

支持版本

Kubernetes 1.18-1.22Google Kubernetes Engine (GKE), Azure Kubernetes Service (AKS), and Amazon Elastic Kubernetes Service (EKS)Elasticsearch, Kibana, APM Server: 6.8+, 7.1+ 环境准备

Kubernetes Cluster。能正确创建pvc,能正确创建 LoadBalancer (笔者使用 K8S 1.20 版本,Amazon EKS 服务,pvc 使用 AWS EBS块存储卷,LoadBalancer 使用 AWS 经典负载均衡器)Linux 运行环境,配置好 kubectl 部署 ECK

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 运行日志,没有异常:

查看运维工具,配置正常:

elasticsearch 创建配置文件

创建 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 创建配置文件

创建 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 pvc 配置不对导致无法正确启动

如果你是按照官方文档如下配置直接照抄,那 elasticsearch 无法正确启动。

原因是官方参考配置中的 storageClassName: standard 不存在,你可以选择删除这一行选择默认配置,也可以选择查看当前支持的 storageClass:

kubectl get sc -n elastic-system


可以发现,默认是 gp2,还有一个是我在 yaml 中自己定义的 aws-gp3,其实自己定义一个能确保一定存在,不容易出错。

elasticsearch 存储配置对了但无法启动,不配置存储能启动

检查是否 provisioner 是否能开相应的云资源

    官方的不支持 AWS gp3ebs csi driver 是否正常启动node 是否有权限控制云资源(我遇到的是 IAM role 没有创建设置 EBS 块存储的权限,增加相应的 IAM policy 权限后,就正常了)
kibana 默认配置下不能访问

应该修改为 LoadBalancer 或者 ingress,也可以选择把默认的 5601 端口映射为80,这样可以把公司的域名CNAME 到 external ip 上,方便直接访问。

...
http:
    service:
      spec:
        type: LoadBalancer # 默认是 ClusterIP,不能直接访问

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存