Kubernetes日志采集ELK|部署ElasticSearch存储
简介
在Kubernetes内搭建ES集群时,需要使用的技术如下:
1. k8s集群:需要先搭建一个k8s集群,用于部署和管理ES集群中的各种资源。
2. StatefulSet控制器:使用StatefulSet控制器来管理ES集群中的各个节点,它可以保证每个节点的数据不同,同时也可以自动重建被误删除的节点。
3. Service(NodePort)服务:使用Service来暴露ES节点的端口,使得其他节点可以访问它们。
4. PV、PVC:使用PV(持久卷)和PVC(持久卷声明)来管理ES集群中的存储卷,确保数据持久化。PVC可以申请PV并将其绑定到节点上,以便存储节点的数据。
5. volumeClaimTemplates(存储卷申请模板):使用volumeClaimTemplates来定义和管理PVC,以便在需要时自动创建和管理它们。
创建一个Kubernetes命令空间
在Kubernetes中,命名空间是用于隔离不同应用程序的一种机制。因此,需要创建一个新的Kubernetes命名空间来部署ElasticSearch。
vim namespace.yaml
# 注意,所有的Controller、service等都需要添加到elk命名空间中
# 在查询相关信息时需要命名空间(参数:-n elk)
apiVersion: v1
kind: Namespace
metadata:
name: elk
创建NFS用于ElasticSearch数据
在Kubernetes中,我采用的是NFS实现持久化存储。你现有的环境中没有NFS服务器的话,可以参考我之前的文章Linux下网络共享存储搭建与配置,如果您要在Kubernetes集群中使用NFS存储实现数据持久化可以看一下这篇文章Kubernetes基于NFS实现持久化存储
创建ElasticSearch服务
Service是一种机制,用于将应用程序暴露到集群内的其它组件。因此,需要一个Service来暴露ElasticSearch到集群内的其它组件。
vim service.yaml
apiVersion: v1
kind: Service
metadata:
namespace: elk
name: es-cluster-svc
spec:
externalTrafficPolicy: Cluster
# 设置服务类型
type: NodePort
ports:
- name: rest
protocol: TCP
# 服务端口
port: 9200
# 应用端口(Pod端口)
targetPort: 9200
# 映射到主机的端口
nodePort: 39200
- name: data
protocol: TCP
#ElasticSearch数据端口
port: 9300
selector:
# 注意一定要与"StatefulSet.yaml"中spec.selector.matchLabels相同
app: elasticsearch-app
创建一个ElasticSearch应用
StatefulSet是一种机制,用于部署有状态的应用程序。因此,需要创建一个StatefulSet来部署ElasticSearch
vim StatefulSet.yaml
apiVersion: apps/v1
# 设置控制器
kind: StatefulSet
metadata:
name: es-cluster
namespace: elk
spec:
# 必须设置
serviceName: es-cluster-svc
# 设置副本数
replicas: 3
# 设置选择器
selector:
# 设置标签
matchLabels:
app: elasticsearch-app
template:
metadata:
# 此处必须要与上面的matchLabels相同
labels:
app: elasticsearch-app
spec:
containers:
# 这里我是把镜像上传到了我的Harbor仓库内
- name: es-container
image: 192.168.82.111:80/elk/elasticsearch:8.6.0
ports:
# 容器内端口
- name: rest
containerPort: 9200
protocol: TCP
# 限制CPU数量
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
# 设置挂载目录
volumeMounts:
- name: es-valume
mountPath: /usr/share/elasticsearch/data
# 设置环境变量
env:
# 自定义集群名
- name: cluster.name
value: k8s-es
# 定义节点名,使用metadata.name名称
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
# 初始化集群时,ES从中选出master节点
- name: cluster.initial_master_nodes
# 对应metadata.name名称加编号,编号从0开始
value: "es-cluster-0,es-cluster-1,es-cluster-2"
# 发现节点的地址,discovery.seed_hosts的值应包括所有master候选节点
# 如果discovery.seed_hosts的值是一个域名,且该域名解析到多个IP地址,那么es将处理其所有解析的IP地址。
- name: discovery.seed_hosts
value: "es-cluster-svc"
# 配置内存
- name: ES_JAVA_OPTS
value: "-Xms1g -Xmx1g"
- name: network.host
value: "0.0.0.0"
- name: xpack.security.transport.ssl.enabled
value: "false"
- name: xpack.security.enabled
value: "false"
volumeClaimTemplates:
- metadata:
# 对应容器中volumeMounts.name
name: es-valume
namespace: elk
spec:
storageClassName: nfs-client
# 存储卷可以被单个节点读写
accessModes:
- ReadWriteMany
# 申请资源的大小
resources:
requests:
storage: 10Gi
访问一下ES看是否正常
总结
总的来说,搭建ES集群需要使用StatefulSet控制器、Service、PV、PVC、volumeClaimTemplates等技术,以便保证集群的高可用性和数据持久化。同时,需要注意使用StatefulSet时节点的编号规则和启动回收的顺序。
相关文章
- 微软为Windows 11带来新安全功能,提升系统防护!
- 微软专家示警:个人PC最大安全隐患在于日常使用管理员账户
- 外媒:微软将安全工作与员工绩效考核紧密联系
- 微软承认Win10/Win11家庭安全功能导致Chrome等浏览器崩溃
- 微软Azure云计算服务第四财季收入增长放缓
- 微软Azure AI落地印度Yotta云平台,加速本土AI发展
- 微软Azure再下一城:娱乐软件零售巨头GameStop
- 微软发布Azure Orbary,与亚马逊竞争卫星的云端接入
- 微软上线Azure H200 v5系列AI虚拟机:吞吐量提升35%
- 微软预览主权私有云服务Azure Local和Microsoft 365 Local