kubenetes 使用elasticsearch operator 部署集群

使用 Elasticsearch Operator 快速部署 Elasticsearch 集群

随着 kubernetes 的快速发展,很多应用都在往 kubernetes 上面迁移,现阶段对于无状态应用的迁移是非常容易做到的,但是对于有状态应用的迁移还是有一定门槛的,主要是有状态应用的运行方式各有不同,比如 MySQL、MongoDB、Redis 这些应用运行的方式方法都不太相同,特别是对于线上环境需要高可用的集群模式的时候,则差别就更大了,这就导致了有状态应用向 Kubernetes 的迁移必然进度会很慢。现在比较好的解决方案就是针对有状态应用开发对应的 Operator 应用,比如 prometheus-operator、etcd-operator 等等,关于 Operator 的开发,可以查看前面的一篇入门文章:https://www.elastic.co/guide/en/cloud-on-k8s/current/index.html 以了解更多信息。

同样的,对于 Elasticsearch 应用,现在官方也推出了基于 Kubernetes Operator 的应用:Elastic Cloud on Kubernetes (ECK),用户可使用该产品在 Kubernetes 上配置、管理和运行 Elasticsearch 集群。

Elastic Cloud on Kubernetes

ElasticCloudonKubernetes(ECK)是一个 Elasticsearch Operator,但远不止于此。ECK 使用 Kubernetes Operator 模式构建而成,需要安装在您的 Kubernetes 集群内,其功能绝不仅限于简化 Kubernetes 上 Elasticsearch 和 Kibana 的部署工作这一项任务。ECK 专注于简化所有后期运行工作,例如:

  • 管理和监测多个集群
  • 轻松升级至新的版本
  • 扩大或缩小集群容量
  • 更改集群配置
  • 动态调整本地存储的规模(包括 Elastic Local Volume(一款本地存储驱动器))
  • 备份

ECK 不仅能自动完成所有运行和集群管理任务,还专注于简化在 Kubernetes 上使用 Elasticsearch 的完整体验。ECK 的愿景是为 Kubernetes 上的 Elastic 产品和解决方案提供 SaaS 般的体验。

在 ECK 上启动的所有 Elasticsearch 集群都默认受到保护,这意味着在最初创建的那一刻便已启用加密并受到默认强密码的保护。

从 6.8 和 7.1 版本开始,Elasticsearch 核心安全功能(TLS 加密、基于角色的访问控制,以及文件和原生身份验证)会免费提供。

通过 ECK 部署的所有集群都包括强大的基础(免费)级功能,例如可实现密集存储的冻结索引、Kibana Spaces、Canvas、Elastic Maps,等等。您甚至可以使用 Elastic Logs 和 Elastic Infrastructure 应用监测 Kubernetes 日志和基础设施。您可以获得在 Kubernetes 上使用 Elastic Stack 完整功能的体验。

ECK 内构建了 Elastic Local Volume,这是一个适用于 Kubernetes 的集成式存储驱动器。ECK 中还融入了很多最佳实践,例如在缩小规模之前对节点进行 drain 操作,在扩大规模的时候对分片进行再平衡,等等。从确保在配置变动过程中不会丢失数据,到确保在规模调整过程中实现零中断。

安装 ECK

当然前提是你要有一个已经可运行的 kubernetes 集群(1.11版本以上),最好确保你的每个节点上至少有4GB内存可以使用,因为我们知道 Elasticsearch 是比较消耗资源的。

首先在集群中安装 ECK 对应的 Operator 资源对象:

kubectl create -f https://download.elastic.co/downloads/eck/2.2.0/crds.yaml

安装成功后,会自动创建一个 elastic-system 的 namespace 以及一个 operator 的 Pod:

[root@-k8s-master-1 ~]# kubectl get pods -n elastic-system
NAME READY STATUS RESTARTS AGE
elastic-operator-0 1/1 Running 0 85m

这个时候会安装上若干个 CRD 对象,当然这些 CRD 资源的控制器就在上面的 elastic-operator-0 这个 Pod 中:

[root@k8s-master-1 ~]# kubectl get crd | grep elastic
agents.agent.k8s.elastic.co 2022-06-01T07:35:32Z
apmservers.apm.k8s.elastic.co 2022-06-01T07:35:32Z
beats.beat.k8s.elastic.co 2022-06-01T07:35:33Z
elasticmapsservers.maps.k8s.elastic.co 2022-06-01T07:35:33Z
elasticsearches.elasticsearch.k8s.elastic.co 2022-06-01T07:35:33Z
enterprisesearches.enterprisesearch.k8s.elastic.co 2022-06-01T07:35:33Z
kibanas.kibana.k8s.elastic.co 2022-06-01T07:35:33Z

然后我们可以利用 CRD 对象来创建一个非常简单的单个 Elasticsearch 集群:(elastic.yaml)

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: elasticsearch
namespace: test03
spec:
version: 7.17.4
updateStrategy:
changeBudget:
maxSurge: 3
maxUnavailable: 1
http:
tls:
selfSignedCertificate:
#去掉https
disabled: true
nodeSets:
- name: default
count: 3
podTemplate:
spec:
initContainers:
- name: sysctl
securityContext:
privileged: true
command: ['sh', '-c', 'sysctl -w vm.max_map_count=262144']
containers:
- name: elasticsearch
env:
#jvm性能,起止堆大小必须一致,否则报错
- name: ES_JAVA_OPTS
value: -Xms2g -Xmx2g
resources:
requests:
memory: 2Gi
cpu: 0.5
limits:
#内存要略大于jvm配置,否则造成OOMKill
memory: 3Gi
cpu: 2
config:
node.master: true
node.data: true
node.ingest: true
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: managed-nfs-storage
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: kibana
namespace: test03
spec:
version: 7.17.4
count: 1
podTemplate:
spec:
containers:
- name: kibana
env:
- name: NODE_OPTIONS
value: "--max-old-space-size=2048"
resources:
requests:
memory: 1Gi
cpu: 0.5
limits:
memory: 2.5Gi
cpu: 2
elasticsearchRef:
name: elasticsearch

启动成功后如下:

[root@k8s-master-1 ~]# kubectl -n test03 get pods,svc | grep -E "elastic|kibana"
pod/elasticsearch-es-default-0 1/1 Running 0 48m
pod/elasticsearch-es-default-1 1/1 Running 0 48m
pod/elasticsearch-es-default-2 1/1 Running 0 48m
pod/kibana-kb-58bcd9dc6d-zkvft 1/1 Running 0 17m
service/elasticsearch-es-default ClusterIP None <none> 9200/TCP 48m
service/elasticsearch-es-http ClusterIP 10.2.166.102 <none> 9200/TCP 48m
service/elasticsearch-es-internal-http ClusterIP 10.0.20.86 <none> 9200/TCP 48m
service/elasticsearch-es-transport ClusterIP None <none> 9300/TCP 48m
service/kibana-kb-http ClusterIP 10.1.245.85 <none> 5601/TCP 43m
service/kibana-out NodePort 10.2.125.7 <none> 5601:30601/TCP 33m
[root@kubeoperator-k8s-master-1 ~]#

用户名默认为elastic,获取默认密码:

[root@k8s-master-1 ~]# kubectl -n test03 get secret elasticsearch-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode
qXhPOrFykxg8GJzWMcm7jRB

创建外部访问service

kind: Service
apiVersion: v1
metadata:
name: kibana-out
namespace: test03
spec:
ports:
- name: kibana
protocol: TCP
port: 5601
targetPort: 5601
nodePort: 30601
selector:
common.k8s.elastic.co/type: kibana
kibana.k8s.elastic.co/name: kibana
clusterIP:
type: NodePort

https://ip:30601 登陆访问

posted @   蒲公英PGY  阅读(269)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示