在Kubernetes(K8S)集群中部署ELK(Elasticsearch、Logstash、Kibana)是一种常见的做法,可以帮助我们实现集中化的日志收集、存储和可视化。本文将介绍如何在K8S集群内部署ELK,并提供相应的代码示例。

整体流程如下:

| 步骤 | 操作 |
| ------ | ------ |
| 1 | 创建Elasticsearch StatefulSet |
| 2 | 创建Logstash Deployment |
| 3 | 创建Kibana Deployment |
| 4 | 配置Logstash和Kibana的访问 |

以下是每个步骤的具体操作及相关代码示例:

## 步骤1:创建Elasticsearch StatefulSet

Elasticsearch是用于存储日志数据的核心组件,我们将使用StatefulSet来进行部署和管理。

首先,创建一个elasticsearch.yaml文件,并添加以下内容:

```yaml
apiVersion: apps/v1
kind: StatefulSet # 定义StatefulSet资源类型
metadata:
name: elasticsearch # StatefulSet的名称
spec:
replicas: 1 # 副本数
serviceName: elasticsearch # Headless Service的名称
selector:
matchLabels:
app: elasticsearch # 选择器标签
template:
metadata:
labels:
app: elasticsearch # Pod标签
spec:
containers:
- name: elasticsearch # 容器名称
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0 # Elasticsearch镜像名称及版本
env:
- name: discovery.type
value: single-node # 单节点模式
ports:
- name: http
containerPort: 9200 # 容器内部暴露的端口
- name: transport
containerPort: 9300 # 用于节点间通信的端口
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data # 挂载目录,用于存储数据
volumes:
- name: data
emptyDir: {} # 空目录,存储数据
```

然后,使用kubectl命令创建Elasticsearch StatefulSet:

```bash
kubectl apply -f elasticsearch.yaml
```

## 步骤2:创建Logstash Deployment

Logstash用于收集日志数据,并将其发送给Elasticsearch进行存储和索引。

首先,创建一个logstash.yaml文件,并添加以下内容:

```yaml
apiVersion: apps/v1
kind: Deployment # 定义Deployment资源类型
metadata:
name: logstash # Deployment的名称
spec:
replicas: 1 # 副本数
selector:
matchLabels:
app: logstash # 选择器标签
template:
metadata:
labels:
app: logstash # Pod标签
spec:
containers:
- name: logstash # 容器名称
image: docker.elastic.co/logstash/logstash:7.12.0 # Logstash镜像名称及版本
ports:
- name: tcp
containerPort: 5044 # 用于接收日志数据的TCP端口
volumeMounts:
- name: config
mountPath: /usr/share/logstash/config # 挂载目录,用于存储配置文件
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumes:
- name: config
configMap:
name: logstash-config # ConfigMap的名称
```

然后,创建一个logstash-config.yaml文件,并添加以下内容:

```yaml
apiVersion: v1
kind: ConfigMap # 定义ConfigMap资源类型
metadata:
name: logstash-config # ConfigMap的名称
data:
logstash.conf: | # Logstash的配置文件
input {
tcp {
port => 5044
}
}

output {
elasticsearch {
hosts => ["elasticsearch.default.svc.cluster.local:9200"] # Elasticsearch的访问地址
index => "logs"
}
}
```

接下来,使用kubectl命令创建Logstash Deployment和ConfigMap:

```bash
kubectl create configmap logstash-config --from-file=logstash-config.yaml
kubectl apply -f logstash.yaml
```

## 步骤3:创建Kibana Deployment

Kibana用于可视化展示Elasticsearch中的日志数据。

首先,创建一个kibana.yaml文件,并添加以下内容:

```yaml
apiVersion: apps/v1
kind: Deployment # 定义Deployment资源类型
metadata:
name: kibana # Deployment的名称
spec:
replicas: 1 # 副本数
selector:
matchLabels:
app: kibana # 选择器标签
template:
metadata:
labels:
app: kibana # Pod标签
spec:
containers:
- name: kibana # 容器名称
image: docker.elastic.co/kibana/kibana:7.12.0 # Kibana镜像名称及版本
ports:
- name: http
containerPort: 5601 # 容器内部暴露的端口
env:
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch:9200 # Elasticsearch的访问地址
```

然后,使用kubectl命令创建Kibana Deployment:

```bash
kubectl apply -f kibana.yaml
```

## 步骤4:配置Logstash和Kibana的访问

为了能够从外部访问Logstash和Kibana,我们需要创建相应的Service。

首先,创建一个logstash-service.yaml文件,并添加以下内容:

```yaml
apiVersion: v1
kind: Service # 定义Service资源类型
metadata:
name: logstash-service # Service的名称
spec:
selector:
app: logstash # 选择器标签
ports:
- name: tcp
protocol: TCP
port: 5044
targetPort: 5044 # 目标端口
type: NodePort # 暴露到Node的特定端口上
```

然后,创建一个kibana-service.yaml文件,并添加以下内容:

```yaml
apiVersion: v1
kind: Service # 定义Service资源类型
metadata:
name: kibana-service # Service的名称
spec:
selector:
app: kibana # 选择器标签
ports:
- name: http
protocol: TCP
port: 5601
targetPort: 5601 # 目标端口
type: NodePort # 暴露到Node的特定端口上
```

最后,使用kubectl命令创建Logstash和Kibana的Service:

```bash
kubectl apply -f logstash-service.yaml
kubectl apply -f kibana-service.yaml
```

至此,我们成功在K8S集群中部署了ELK。

通过以上步骤和相应的代码示例,我们可以实现在K8S集群中部署ELK,方便进行日志收集、存储和可视化。希望对你实现关键词有所帮助!