K8S使用Helm离线部署EFK

一、流程概述
要实现K8S使用Helm离线部署EFK,首先需要离线下载EFK相关镜像,然后使用Helm进行部署。

下面是整个流程的步骤概览:

步骤 | 操作
------------ | -------------
准备离线下载配置 | 配置使用阿里云的镜像服务、使用harbor仓库
离线下载镜像 | 使用离线下载配置下载EFK相关镜像
创建namespace和PV | 创建存储和命名空间
创建Deployment | 创建Elasticsearch、Fluentd和Kibana的Deployment
创建Service | 创建Elasticsearch、Fluentd和Kibana的Service
部署EFK | 运行部署命令

二、具体步骤

1. 准备离线下载配置

首先,我们需要配置使用阿里云的镜像服务和使用harbor仓库。如下所示:

```shell
# 配置阿里云镜像服务
$ vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}

# 配置Helm使用harbor仓库
$ helm repo add harbor https://harbor.example.com/chartrepo/library --username=admin --password=xxx
```

2. 离线下载镜像

执行下面的命令,离线下载EFK相关镜像:

```shell
$ docker pull alpine:3.14.2
$ docker save alpine:3.14.2 > alpine_3.14.2.tar
$ docker pull fluentd:v1.12.5-debian-1
$ docker save fluentd:v1.12.5-debian-1 > fluentd_v1.12.5-debian-1.tar
$ docker pull fluentd:v1.11.5-debian-1
$ docker save fluentd:v1.11.5-debian-1 > fluentd_v1.11.5-debian-1.tar
$ docker pull es:7.12.0
$ docker save es:7.12.0 > es_7.12.0.tar
$ docker pull kibana:7.12.0
$ docker save kibana:7.12.0 > kibana_7.12.0.tar

将下载的镜像文件复制到K8S集群中,例如使用scp命令将文件复制到目标服务器上。
```

3. 创建namespace和PV

执行下列命令,创建namespace和PV:

```shell
# 创建namespace
$ kubectl create namespace logging

# 创建PV
$ vim efk-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
name: data-efk
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
local:
path: /data-efk
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1

$ kubectl apply -f efk-pv.yaml
```

4. 创建Deployment

接下来,我们需要创建Elasticsearch、Fluentd和Kibana的Deployment。执行以下命令:

```shell
# 创建Elasticsearch Deployment
$ vim es.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: es
namespace: logging
spec:
replicas: 1
selector:
matchLabels:
app: es
template:
metadata:
labels:
app: es
spec:
containers:
- name: es
image: es:7.12.0 # 替换为你的镜像地址
ports:
- containerPort: 9200
```

```shell
# 创建Fluentd Deployment
$ vim fluentd.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: fluentd
namespace: logging
spec:
replicas: 1
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluentd:v1.12.5-debian-1 # 替换为你的镜像地址
volumeMounts:
- name: data-efk
mountPath: /var/log
volumes:
- name: data-efk
persistentVolumeClaim:
claimName: data-efk-claim
```

```shell
# 创建Kibana Deployment
$ vim kibana.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: logging
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: kibana:7.12.0 # 替换为你的镜像地址
ports:
- containerPort: 5601
```

5. 创建Service

为了让外部能够访问到EFK组件,我们需要创建对应的Service。执行以下命令:

```shell
# 创建Elasticsearch Service
$ vim es-service.yaml

apiVersion: v1
kind: Service
metadata:
name: es
namespace: logging
spec:
selector:
app: es
ports:
- protocol: TCP
port: 9200
targetPort: 9200
type: NodePort
```

```shell
# 创建Kibana Service
$ vim kibana-service.yaml

apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: logging
spec:
selector:
app: kibana
ports:
- protocol: TCP
port: 5601
targetPort: 5601
type: NodePort
```

6. 部署EFK

最后,我们可以运行部署命令,部署EFK组件:

```shell
# 部署EFK
$ helm install efk harbor/efk --version=1.0.0 --values=values.yaml -n logging
```

至此,我们已经完成了K8S使用Helm离线部署EFK的操作。小白只需按照以上步骤进行操作,即可成功实现关键词。