ELK

安装EFK

axing
2023-09-10 / 0 评论 / 9 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年09月29日,已超过115天没有更新,若内容或图片失效,请留言反馈。

一、 准备规划
(1)先创建一个名称空间,后续日志相关组件都安装到该名称空间下

 kubectl create ns logging

(2)环境准备
ElasticSearch 安装有最低安装要求,如果安装后 Pod 无法正常启动,请检查是否符合最低要求的配置,要求如下:
m0w3d626.png
建议:
每台机器cpu调成4c
内存>=4G
我的是3台master节点,一个node节点,每台都可以参与调度,每台机器都是4G
注意:如果使用vmware workstation做实验,你的虚拟机是开机状态,最大把虚拟机内存调大到3G,想要调的大一些需要关机后才能调的更大

(3)部署规划
ES集群有三种角色组成,详细描述与规划如下
m0w3edrx.png

二、为ES准备持久化存储
为了能够持久化Elasticsearch的数据,需要准备一个存储,此处我们使用NFS类型的 StorageClass ,如果你是线上环境建议使用 Local PV 或者 Ceph RBD
(1) 安装nfs服务
找一台机器192.168.110.101安装nfs服务端

systemctl stop firewalld.service
systemctl disable firewalld.service

# 服务端软件安装: 192.168.71.101
yum install -y nfs-utils rpcbind # 安装nfs-utils和rpcbind两个包

# 创建共享目录
mkdir -p /data/nfs
chmod 755 /data/nfs

# 配置共享目录
cat > /etc/exports <<EOF
/data/nfs *(rw,sync,no_root_squash)
EOF

*:表示任何人都有权限连接,当然也可以是一个网段,一个 IP,也可以是域名
rw:读写的权限
sync:表示文件同时写入硬盘和内存
no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份

# 启动nfs服务
systemctl start rpcbind.service
systemctl enable rpcbind
systemctl status rpcbind

systemctl start nfs
systemctl enable nfs
systemctl status nfs
# 如下显示则ok
$ rpcinfo -p|grep nfs
    100003 3 tcp 2049 nfs
    100003 4 tcp 2049 nfs
    100227 3 tcp 2049 nfs_acl
    100003 3 udp 2049 nfs
    100227 3 udp 2049 nfs_acl

客户端软件安装(在所有node节点安装)

yum install -y nfs-utils

你可以在客户端宿主机上验证下能不能用,能用的话我们一会再用到pod的pv上

➜ showmount -e 192.168.71.101
Export list for 192.168.71.101:
/data/nfs *
➜ mount -t nfs 192.168.71.101:/data/nfs /mnt #可千万别挂载到/opt下哈,/opt/cni/bin放着网络插件呢
➜ touch /mnt/a.txt # 成功后,另外一台客户端上挂载查看验证

(2) 搭建StorageClass+NFS
官网:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

➜ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
➜ helm upgrade --install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.110.101 --set
nfs.path=/data/nfs --set storageClass.defaultClass=true -n kube-system
# 镜像下载不了的话可以用自己制作的镜像
registry.cn-shanghai.aliyuncs.com/egon-k8s-test/nfs-subdir-external-provisioner:v4.0.2

查看

helm -n kube-system list

查看nfs_provider的pod

$ kubectl -n kube-system get pods |grep nfs
nfs-subdir-external-provisioner-5c7dc6cd57-4mrmx 1/1 Running 0 18s

查看sc(已经设置为默认的了)

➜ kubectl -n kube-system get sc nfs-client
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION
nfs-client (default) cluster.local/nfs-subdir-external-provisioner Delete

三、为ES准备证书文件
由于 ElasticSearch 7.x 版本默认安装了 X-Pack 插件,需要我们配置一些安全证书文件。
(1)生成证书文件

# 运行容器生成证书,containerd下面用nerdctl
$ mkdir -p /logging/elastic-certs

$ nerdctl run --name elastic-certs \
  -v /logging/elastic-certs:/app \
  -it \
  -w /app \
  registry.cn-guangzhou.aliyuncs.com/xingcangku/oooooo:1.0 \
  /bin/sh -c "
    elasticsearch-certutil ca --out /app/elastic-stack-ca.p12 --pass '' && \
    elasticsearch-certutil cert --name security-master --dns security-master \
    --ca /app/elastic-stack-ca.p12 --pass '' --ca-pass '' --out /app/elastic-certificates.p12
  "
  
# 删除容器
$ nerdctl rm -f elastic-certs

# 将 pcks12(Public Key Cryptography Standards #12) 文件中的证书和私钥提取出来,并保存为 PEM 格式的文件
#$ cd /logging/elastic-certs
#$ cd elastic-certs && openssl pkcs12 -nodes -passin pass:'' -in elastic-certificates.p12 -out elastic-certificate.pem

(2)添加证书到 Kubernetes

# 添加证书
$ cd /logging/elastic-certs
$ kubectl create secret -n logging generic elastic-certs --from-file=elastic￾certificates.p12
# 设置集群用户名密码,用户名为elastic,密码为egon666
$ kubectl create secret -n logging generic elastic-auth --from￾literal=username=elastic --from-literal=password=egon666

四、安装ES集群
首先添加 ELastic 的 Helm 仓库:

$ helm repo add elastic https://helm.elastic.co
$ helm repo update

ElaticSearch 安装需要安装三次,分别安装 Master、Data、Client 节点,Master 节点负责集群间的管理工作;Data 节点负责存储数据;Client 节点负责代理 ElasticSearch Cluster 集群,负载均衡。
首先使用 helm pull 拉取 Chart 并解压:

$ helm pull elastic/elasticsearch --untar --version 7.17.3
$ cd elasticsearch

在 Chart 目录下面创建用于 Master 节点安装配置的 values 文件:(默认自带的values.yaml不用管,我们不用它)

# 创建一个新文件:values-master.yaml,内容如下
## 设置集群名称
clusterName: 'elasticsearch'

## 设置节点名称
nodeGroup: 'master'

## 设置角色
roles:
  master: 'true'
  ingest: 'false'
  data: 'false'

# ============ 镜像配置 ============
## 指定镜像与镜像版本
image: 'registry.cn-hangzhou.aliyuncs.com/egon-k8s-test/elasticsearch' # 可以用自己的镜像,你的镜像仓库必须是公开的
# image: 'elasticsearch'
imageTag: '7.17.3'
imagePullPolicy: 'IfNotPresent'

## 副本数
# replicas: 3
# 测试环境资源有限,所以设置为1
replicas: 1

# ============ 资源配置 ============
## JVM 配置参数
esJavaOpts: '-Xmx1g -Xms1g'

## 部署资源配置(生产环境要设置大些)
resources:
  requests:
    cpu: '2000m'
    memory: '2Gi'
  limits:
    cpu: '2000m'
    memory: '2Gi'

## 数据持久卷配置
persistence:
  enabled: true

## 存储数据大小配置
volumeClaimTemplate:
  storageClassName: nfs-client
  accessModes: ['ReadWriteOnce']
  resources:
    requests:
      storage: 5Gi

# ============ 安全配置 ============
## 设置协议,可配置为 http、https
protocol: http

## 证书挂载配置,这里我们挂入上面创建的证书
secretMounts:
  - name: elastic-certs
    secretName: elastic-certs
    path: /usr/share/elasticsearch/config/certs
    defaultMode: 0755

## Elasticsearch 配置
esConfig:
  elasticsearch.yml: |
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    # xpack.security.http.ssl.enabled: true
    # xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    # xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12

## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件
extraEnvs:
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-auth
        key: username
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-auth
        key: password

# ============ 调度配置 ============
## 设置调度策略
## - hard:只有当有足够的节点时 Pod 才会被调度,并且它们永远不会出现在同一个节点上
## - soft:尽最大努力调度
antiAffinity: 'soft'

# tolerations:
#   - operator: "Exists"  # 容忍全部污点
# 创建新文件:values-client.yaml

# ============ 设置集群名称 ============
## 设置集群名称
clusterName: 'elasticsearch'
## 设置节点名称
nodeGroup: 'client'
## 设置角色
roles:
  master: 'false'
  ingest: 'false'
  data: 'false'

# ============ 镜像配置 ============
## 指定镜像与镜像版本
image: 'registry.cn-hangzhou.aliyuncs.com/egon-k8s-test/elasticsearch' # 可以用自己的镜像
# image: 'elasticsearch'
imageTag: '7.17.3'

## 副本数
# 测试环境资源有限,所以设置为1吧
replicas: 1

# ============ 资源配置 ============
## JVM 配置参数
esJavaOpts: '-Xmx1g -Xms1g'

## 部署资源配置(生产环境一定要设置大些)
resources:
  requests:
    cpu: '1000m'
    memory: '2Gi'
  limits:
    cpu: '1000m'
    memory: '2Gi'

## 数据持久卷配置
persistence:
  enabled: false

# ============ 安全配置 ============
## 设置协议,可配置为 http、https
protocol: http

## 证书挂载配置,这里我们挂入上面创建的证书
secretMounts:
  - name: elastic-certs
    secretName: elastic-certs
    path: /usr/share/elasticsearch/config/certs

## 自定义配置文件 elasticsearch.yml
esConfig:
  elasticsearch.yml: |
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    # xpack.security.http.ssl.enabled: true
    # xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    # xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12

## 环境变量配置,引入上面设置的用户名、密码 secret 文件
extraEnvs:
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-auth
        key: username
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-auth
        key: password

# ============ Service 配置 ============
service:
  type: NodePort
  nodePort: '30200'

我的集群资源不足,我将上述三个yaml副本都设置成了1
现在用上面的 values 文件来安装:(切换到elasticsearch的chart目录下)

[root@master01 ~]# cd /logging/elasticsearch/
[root@master01 /logging/elasticsearch]# ls
Chart.yaml Makefile templates values-data.yaml values.yaml
examples README.md values-client.yaml values-master.yaml

# --------------->>>>>>>>>>> 注意install指定的release名字要不同哦
# helm install 你起的release名 你的chart包的路径 -f xxx.yaml --namespace yyy
# 如果是升级安装则用:helm upgrade --install 你起的release名 你的chart包的路径 -f values-master.yaml --namespace logging .

cd elasticsearch/

# 安装 master 节点
helm install es-master ./ -f values-master.yaml --namespace logging

# 安装 data 节点
helm install es-data ./ -f values-data.yaml --namespace logging

# 安装 client 节点
helm install es-client ./ -f values-client.yaml --namespace logging

# 升级操作
#$ helm upgrade --install es-master -f values-master.yaml --namespace logging .
#$ helm upgrade --install es-data -f values-data.yaml --namespace logging .
#$ helm upgrade --install es-client -f values-client.yaml --namespace logging .
如果你的es-master设置的replicas副本数为3,那么在安装 Master 节点后 Pod 启动时候会抛出异
常,就绪探针探活失败,
$ kubectl -n logging describe pod elasticsearch-master-0
Warning Unhealthy 61s kubelet Readiness probe failed: Waiting for elasticsearch
cluster to become ready (request params: "wait_for_status=green&timeout=1s" )
Cluster is not yet ready (request params: "wait_for_status=green&timeout=1s" )
这是个正常现象。在执行安装 Data 节点后 Master 节点 Pod 就会恢复正常。
[root@master01 /logging/elasticsearch]# kubectl -n logging get pods -w
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 2m17s
elasticsearch-master-1 1/1 Running 0 2m13s
elasticsearch-master-2 1/1 Running 0 2m20s
此外,如果因为资源原因导致出现pending状态的pod,请根据describe信息扩容cpu或内存资源

查看master(建议3副本,但是我的资源有限,我就启了一个副本)

[root@master01 /logging/elasticsearch]# kubectl -n logging get pods -w
NAME READY STATUS RESTARTS AGE
elasticsearch-client-0 1/1 Running 0 7m17s
elasticsearch-data-0 1/1 Running 0 7m21s
elasticsearch-master-0 1/1 Running 0 9m16s

一会访问es就用用该svc

[root@master01 harbor]# kubectl -n logging get svc
NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE
elasticsearch-client            NodePort    10.111.16.229    <none>        9200:30200/TCP,9300:30969/TCP   23h

五、安装Kibana

helm pull elastic/kibana --untar --version 7.17.3 # 下载并解压chart包
cd kibana

创建用于安装 Kibana 的 values 文件:

# 创建全新文件:values-prod.yaml

# ============ 镜像配置 ============
## 指定镜像与镜像版本
image: 'registry.cn-hangzhou.aliyuncs.com/egon-k8s-test/kibana'
# image: 'docker.elastic.co/kibana/kibana'
imageTag: '7.17.3'
imagePullPolicy: "IfNotPresent"

# ============ ElasticSearch 配置 ============
## 配置 ElasticSearch 地址,主要使用 es-client 的 SVC
elasticsearchHosts: 'http://elasticsearch-client:9200'

# ============ 环境变量配置 ============
## 引入用户名、密码的 secret 文件
extraEnvs:
  - name: 'ELASTICSEARCH_USERNAME'
    valueFrom:
      secretKeyRef:
        name: elastic-auth
        key: username
  - name: 'ELASTICSEARCH_PASSWORD'
    valueFrom:
      secretKeyRef:
        name: elastic-auth
        key: password

# ============ 资源配置 ============
resources:
  requests:
    cpu: '500m'
    memory: '1Gi'
  limits:
    cpu: '500m'
    memory: '1Gi'

# ============ Kibana 参数配置 ============
## 添加语言配置,设置 Kibana 为中文
kibanaConfig:
  kibana.yml: |
    i18n.locale: "zh-CN"
    server.publicBaseUrl: "http://192.168.110.101:30601"  # 将地址改为你访问 Kibana 的地址,不能以 / 结尾

# ============ Service 配置 ============
service:
  type: NodePort
  nodePort: '30601'

部署

helm install kibana -f values-prod.yaml --namespace logging .

部署完后查看

[root@master01 /]# kubectl -n logging get pods -w
NAME                     READY   STATUS    RESTARTS   AGE
elasticsearch-client-0   0/1     Running   0          2m3s
elasticsearch-data-0     1/1     Running   0          4m35s
elasticsearch-master-0   1/1     Running   0          4m45s
elasticsearch-client-0   1/1     Running   0          2m20s

上面我们安装 Kibana 的时候指定了 30601 的 NodePort 端口,所以我们可以从任意节点http://IP:30601 来访问 Kibana。
m0w47hgy.png
我们可以看到会跳转到登录页面,让我们输出用户名、密码,这里我们输入上面配置的用户名elastic 、密码 egon666 进行登录。登录成功后进入如下所示的 Kibana 主页(点击自己浏览):
m0w47zgq.png

六、安装Fluentd来作为日志收集工具
(1)安装fluentd
要想在k8s每个物理节点都能采集到数据,们可以直接用 DasemonSet 控制器来部署 Fluentd 应用,确保在集群中的每个节点上始终运行一个 Fluentd 容器
可以直接使用 Helm 来进行一键安装,为了能够了解更多实现细节,我们这里还是采用手动方法来进行安装。
官网部署参考:https://docs.fluentd.org/container-deployment/kubernetes

0

评论 (0)

取消