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

目录

  • 写在最前
    • 支持版本
    • 环境准备
  • 部署
    • ECK
    • elasticsearch
      • 创建配置文件
      • 部署
      • 验证
    • kibana
      • 创建配置文件
      • 部署
      • 验证
  • 踩坑及解决方案
    • elasticsearch pvc 配置不对导致无法正确启动
    • elasticsearch 存储配置对了但无法启动,不配置存储能启动
    • kibana 默认配置下不能访问

写在最前

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

支持版本

  • Kubernetes 1.18-1.22
  • Google 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

返回如下结果:
k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第1张图片
查看 operator 运行日志,没有异常:
查看 ECK 日志
查看运维工具,配置正常:
k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第2张图片

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

获取 HEALTH

验证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"

k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第3张图片

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 到浏览器,打开输入账户密码,登录成功

k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第4张图片
k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第5张图片

踩坑及解决方案

elasticsearch pvc 配置不对导致无法正确启动

如果你是按照官方文档如下配置直接照抄,那 elasticsearch 无法正确启动。
k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第6张图片
原因是官方参考配置中的 storageClassName: standard 不存在,你可以选择删除这一行选择默认配置,也可以选择查看当前支持的 storageClass:

kubectl get sc -n elastic-system

k8s部署生产级elasticsearch+kibana 步骤、踩坑及解决方案_第7张图片
可以发现,默认是 gp2,还有一个是我在 yaml 中自己定义的 aws-gp3,其实自己定义一个能确保一定存在,不容易出错。

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

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

  1. 官方的不支持 AWS gp3
  2. ebs csi driver 是否正常启动
  3. node 是否有权限控制云资源(我遇到的是 IAM role 没有创建设置 EBS 块存储的权限,增加相应的 IAM policy 权限后,就正常了)

kibana 默认配置下不能访问

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

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

你可能感兴趣的:(kubernetes,aws,elasticsearch,kubernetes,kibana)