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

支持版本 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,部署直接输入如下命令:

1
2
3
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 块存储,详见下方注释

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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)。

  mian.yml

  ```
  apiVersion: elasticsearch.k8s.elastic.co/v1
  kind: Elasticsearch
    metadata:
      name: quickstart
      namespace: elastic-cluster
    spec:
      version: 7.17.5
      nodeSets:
      - name: master-nodes
        count: 1
        config:
          node.master: true
          node.data: false
          node.store.allow_mmap: false
        podTemplate:
          spec:
            initContainers:
            - name: sysctl
              securityContext:
                privileged: true
              command: ['sh', '-c', 'sysctl -w vm.max_map_count=262144']
            containers:
            - name: elasticsearch
              env:
              - name: ES_JAVA_OPTS
                value: -Xms1g -Xmx1g
              resources:
                requests:
                  memory: 2Gi
                limits:
                  memory: 2Gi
        volumeClaimTemplates:
        - metadata:
            name: elasticsearch-data
          spec:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 5Gi
            storageClassName:   monitor-grafa
      - name: data-nodes
        count: 3
        config:
          node.master: false
          node.data: true
        podTemplate:
          spec:
            initContainers:
            - name: sysctl
              securityContext:
                privileged: true
              command: ['sh', '-c', 'sysctl -w vm.max_map_count=262144']
            containers:
            - name: elasticsearch
              env:
              - name: ES_JAVA_OPTS
                value: -Xms1g -Xmx1g
              resources:
                requests:
                  memory: 2Gi
                limits:
                  memory: 2Gi
        volumeClaimTemplates:
        - metadata:
            name: elasticsearch-data
          spec:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 10Gi
            storageClassName:  monitor-grafa

    ```

部署 kubectl apply -f main.yml 验证健康状态,Health 需要是 green

1
2
3
4
5
kubectl get elasticsearch -n elastic-cluster

[root@k8s-5-m1 elastic-cluster]# kubectl get elasticsearch -n elastic-cluster
NAME         HEALTH   NODES   VERSION   PHASE   AGE
quickstart   green    4       7.17.5    Ready   3h27m

验证 pod 状态,需都为 Ready,STATUS 为 Running

kubectl get pods –selector=‘elasticsearch.k8s.elastic.co/cluster-name=es’ -n elastic-system 1 验证能否调用 API (需要用户名密码)

1
2
3
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

image-20220802144316745

创建配置文件 创建 kibana.yml 配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.17.5
  count: 1
  elasticsearchRef:
    name: quickstart
  http:
    tls:
      selfSignedCertificate:
        disabled: true
  podTemplate:
    metadata:
      labels:
        foo: bar
    spec:
      containers:
      - name: kibana
        resources:
          limits:
            memory: 1Gi
            cpu: 1

部署

1
kubectl apply -f kibana.yml -n elastic-cluster

验证 验证健康状态,Health 需要是 green

1
2
3
4

[root@k8s-5-m1 elastic-cluster]# kubectl get kibana -n elastic-cluster
NAME         HEALTH   NODES   VERSION   AGE
quickstart   green    1       7.17.5    24m

验证 pod 状态,需都为 Ready,STATUS 为 Running

1
2
3
[root@k8s-5-m1 elastic-cluster]# kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart' -n elastic-cluster
NAME                            READY   STATUS    RESTARTS   AGE
quickstart-kb-c776fb9b5-jpl6q   1/1     Running   0          24m

登录验证

1
2
3
kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic-cluster | base64 --decode; echo   # 获取密码,用户名默认为 elastic
[root@k8s-5-m1 elastic-cluster]# kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic-cluster | base64 --decode; echo
910d92KoL517qA88FLpddMImEL

复制 external ip 到浏览器,打开输入账户密码,登录成功

踩坑及解决方案 elasticsearch pvc 配置不对导致无法正确启动 如果你是按照官方文档如下配置直接照抄,那 elasticsearch 无法正确启动。

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

1
kubectl get sc -n elastic-system

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

elasticsearch 存储配置对了但无法启动,不配置存储能启动 检查是否 provisioner 是否能开相应的云资源

官方的不支持 AWS gp3 ebs csi driver 是否正常启动 node 是否有权限控制云资源(我遇到的是 IAM role 没有创建设置 EBS 块存储的权限,增加相应的 IAM policy 权限后,就正常了) kibana 默认配置下不能访问 应该修改为 LoadBalancer 或者 ingress,也可以选择把默认的 5601 端口映射为 80,这样可以把公司的域名 CNAME 到 external ip 上,方便直接访问。

1
2
3
4
5
...
http:
    service:
      spec:
        type: LoadBalancer # 默认是 ClusterIP,不能直接访问

elastic 的 docker 相关镜像

1
https://www.docker.elastic.co/r/elasticsearch/elasticsearch:7.17.5
Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up