前言:

kubernetes1.16版本的时候安装了elastic on kubernetes(ECK)1.0版本。存储用了local disk文档跑了一年多了。elasticsearch对应版本是7.6.2。现在已完成了kubernetes 1.20.5 containerd cilium hubble 环境的搭建(https://blog.csdn.net/saynaihe/article/details/115187298)并且集成了cbs腾讯云块存储(https://blog.csdn.net/saynaihe/article/details/115212770)。eck也更新到了1.5版本(我能说我前天安装的时候还是1.4.0吗…..还好我只是简单应用没有太复杂的变化无非版本变了….那就再来一遍吧)
最早部署的kubernetes1.16版本的eck安装方式https://duiniwukenaihe.github.io/2019/10/21/k8s-efk/多年前搭建的eck1.0版本。

关于eck

elastic cloud on kubernetes是一种operator的安装方式,很大程度上简化了应用的部署。同样的还有promtheus-operator。
可参照https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-eck.html官方文档的部署方式。

1. 在kubernete集群中部署ECK

1. 安装自定义资源定义和操作员及其RBAC规则:

kubectl apply -f https://download.elastic.co/downloads/eck/1.5.0/all-in-one.yaml

2. 监视操作日志:

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
**
———————————-分隔符————————-
我是直接把yaml下载到本地了。

  1. ###至于all-in-one.yaml.1后面的1可以忽略了哈哈,第二次加载文件加后缀了。
  2. kubectl apply -f all-in-one.yaml
  3. kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

image.png

2. 部署elasticsearch集群

1. 定制化elasticsearch 镜像

增加s3插件,修改时区东八区,并添加腾讯云cos的秘钥,并重新打包elasticsearch镜像.

1. DockerFile如下

  1. FROM docker.elastic.co/elasticsearch/elasticsearch:7.12.0
  2. ARG ACCESS_KEY=XXXXXXXXX
  3. ARG SECRET_KEY=XXXXXXX
  4. ARG ENDPOINT=cos.ap-shanghai.myqcloud.com
  5. ARG ES_VERSION=7.12.0
  6. ARG PACKAGES="net-tools lsof"
  7. ENV allow_insecure_settings 'true'
  8. RUN rm -rf /etc/localtime && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  9. RUN echo 'Asia/Shanghai' > /etc/timezone
  10. RUN if [ -n "${PACKAGES}" ]; then yum install -y $PACKAGES && yum clean all && rm -rf /var/cache/yum; fi
  11. RUN \
  12. /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch repository-s3 && \
  13. /usr/share/elasticsearch/bin/elasticsearch-keystore create && \
  14. echo "XXXXXX" | /usr/share/elasticsearch/bin/elasticsearch-keystore add --stdin s3.client.default.access_key && \
  15. echo "XXXXXX" | /usr/share/elasticsearch/bin/elasticsearch-keystore add --stdin s3.client.default.secret_key

2. 打包镜像并上传到腾讯云镜像仓库,也可以是其他私有仓库

  1. docker build -t ccr.ccs.tencentyun.com/xxxx/elasticsearch:7.12.0 .
  2. docker push ccr.ccs.tencentyun.com/xxxx/elasticsearch:7.12.0

image.png

2. 创建elasticsearch部署yaml文件,部署elasticsearch集群

修改了自己打包 image tag ,使用了腾讯云cbs csi块存储。并定义了部署的namespace,创建了namespace logging.

1. 创建部署elasticsearch应用的命名空间

  1. kubectl create ns logging
  1. cat <<EOF > elastic.yaml
  2. apiVersion: elasticsearch.k8s.elastic.co/v1
  3. kind: Elasticsearch
  4. metadata:
  5. name: elastic
  6. namespace: logging
  7. spec:
  8. version: 7.12.0
  9. image: ccr.ccs.tencentyun.com/XXXX/elasticsearch:7.12.0
  10. http:
  11. tls:
  12. selfSignedCertificate:
  13. disabled: true
  14. nodeSets:
  15. - name: laya
  16. count: 3
  17. podTemplate:
  18. spec:
  19. containers:
  20. - name: elasticsearch
  21. env:
  22. - name: ES_JAVA_OPTS
  23. value: -Xms2g -Xmx2g
  24. resources:
  25. requests:
  26. memory: 4Gi
  27. cpu: 0.5
  28. limits:
  29. memory: 4Gi
  30. cpu: 2
  31. config:
  32. node.master: true
  33. node.data: true
  34. node.ingest: true
  35. node.store.allow_mmap: false
  36. volumeClaimTemplates:
  37. - metadata:
  38. name: elasticsearch-data
  39. spec:
  40. accessModes:
  41. - ReadWriteOnce
  42. storageClassName: cbs-csi
  43. resources:
  44. requests:
  45. storage: 200Gi
  46. EOF

image.png

2. 部署yaml文件并查看应用部署状态

  1. kubectl apply -f elastic.yaml
  2. kubectl get elasticsearch -n logging
  3. kubectl get elasticsearch -n logging
  4. kubectl -n logging get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=elastic'

image.png

3. 获取elasticsearch凭据

  1. kubectl -n logging get secret elastic-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo

image.png

4. 直接安装kibana了

修改了时区,和elasticsearch镜像一样都修改到了东八区,并将语言设置成了中文,关于selfSignedCertificate原因参照https://www.elastic.co/guide/en/cloud-on-k8s/1.4/k8s-kibana-http-configuration.html

  1. cat <<EOF > kibana.yaml
  2. apiVersion: kibana.k8s.elastic.co/v1
  3. kind: Kibana
  4. metadata:
  5. name: elastic
  6. namespace: logging
  7. spec:
  8. version: 7.12.0
  9. image: docker.elastic.co/kibana/kibana:7.12.0
  10. count: 1
  11. elasticsearchRef:
  12. name: elastic
  13. http:
  14. tls:
  15. selfSignedCertificate:
  16. disabled: true
  17. podTemplate:
  18. spec:
  19. containers:
  20. - name: kibana
  21. env:
  22. - name: I18N_LOCALE
  23. value: zh-CN
  24. resources:
  25. requests:
  26. memory: 1Gi
  27. limits:
  28. memory: 2Gi
  29. volumeMounts:
  30. - name: timezone-volume
  31. mountPath: /etc/localtime
  32. readOnly: true
  33. volumes:
  34. - name: timezone-volume
  35. hostPath:
  36. path: /usr/share/zoneinfo/Asia/Shanghai
  37. EOF
  1. kubectl apply kibana.yaml

5. 对外映射kibana 服务

对外暴露都是用traefik https 代理,命名空间添加tls secret。绑定内部kibana service.然后外部slb udp代理443端口。但是现在腾讯云slb可以挂载多个证书了,就把这层剥离了,直接http方式到80端口 。然后https 证书 都在slb负载均衡代理了。这样省心了证书的管理,还有一点是可以在slb层直接收集接入层日志到cos。并可使用腾讯云自有的日志服务。

  1. cat <<EOF > ingress.yaml
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: IngressRoute
  4. metadata:
  5. name: kibana-kb-http
  6. namespace: logging
  7. spec:
  8. entryPoints:
  9. - web
  10. routes:
  11. - match: Host(`kibana.XXXXX.com`)
  12. kind: Rule
  13. services:
  14. - name: elastic-kb-http
  15. port: 5601
  16. EOF
  17. kubectl apply -f ingress.yaml

输入 用户名elastic 密码为上面获取的elasticsearch的凭据,进入管理页面。新界面很是酷炫
image.png

6. now 要添加快照仓库了

image.png
创建快照仓库跟S3方式是一样的,具体的可以参考https://blog.csdn.net/ypc123ypc/article/details/87860583这篇博文

  1. PUT _snapshot/esbackup
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "endpoint":"cos.ap-shanghai.myqcloud.com",
  6. "region": "ap-shanghai",
  7. "compress" : "true",
  8. "bucket": "elastic-XXXXXXX"
  9. }
  10. }

image.png
OK 进行验证快照仓库是否添加成功
image.png
image.png
还原一个试试?
image.png
image.png
image.png
可还行?等待变绿
image.png
基本完成。正常可以使用了。使用过程中还有很多注意的。关键还是集群的设计规划。数据的预估增长还有报警。下次有时间列一下Elastalert在kubernetes中的部署应用。