最佳实践:Kubernetes实战之部署ELK Stack收集平台日志
优采云 发布时间: 2022-12-03 20:39最佳实践:Kubernetes实战之部署ELK Stack收集平台日志
主要内容准备环境
一套正常运行的k8s集群,kubeadm安装部署或者二进制部署就够了
1 ELK概念
ELK是Elasticsearch、Logstash、Kibana这三个开源框架的大写缩写。市面上也叫Elastic Stack。其中,Elasticsearch是一个基于Lucene,分布式,通过Restful方式交互的近实时搜索平台框架。百度、谷歌等大数据全文搜索引擎可以使用Elasticsearch作为底层支撑框架。可见Elasticsearch提供的搜索能力确实强大。我们在市场上经常将Elasticsearch称为es。Logstash是ELK的中心数据流引擎,用于从不同的目标(文件/数据存储/MQ)采集不同格式的数据,支持输出到不同的目的地(文件/MQ/redis/elasticsearch/kafka等)。 )过滤后。
通过上面对ELK的简单介绍,我们知道了ELK字面意思中收录的各个开源框架的功能。市面上很多开发只要一提到ELK,就可以一致的说它是日志分析架构技术栈的统称,但实际上ELK不仅仅适用于日志分析,它还可以支持任何其他数据分析和采集场景,日志分析和采集才更有代表性。不是唯一的。我们的教程主要围绕如何通过ELK搭建生产级的日志分析平台来讲解ELK的使用。官方网站:elastic.co/cn/products/
2 日志管理平台
在过去的单体应用时代,我们所有的组件都部署在一台服务器上。那个时候对日志管理平台的需求可能没有那么强烈。我们只需要登录一台服务器,使用shell命令就可以非常方便的查看系统。日志,快速定位问题。随着互联网的发展,互联网已经全面渗透到生活的各个领域,使用互联网的用户越来越多。单个应用已经无法支持大量并发用户,尤其是在中国这样的人口大国。那么拆分单体应用,通过横向扩展支持海量用户使用就迫在眉睫。微服务的概念就是在这样的阶段诞生的。在微服务盛行的互联网技术时代,单个应用程序拆分为多个应用程序。每个应用集群都是为了负载均衡而部署的,所以如果某个业务出现系统错误,开发或者运维人员还是以往一个一个的登录服务器,通过登录服务器来定位问题查看日志。这种解决线上问题的方法效率可想而知。日志管理平台的建设极其重要。通过Logstash采集各台服务器的日志文件,然后按照定义的正则模板进行过滤并传输到Kafka或redis,再由另一个Logstash从Kafka或redis中读取日志存储到elasticsearch中创建索引,最后展示他们通过Kibana给开发人员或者运维人员进行分析。这大大提高了运维在线问题的效率。此外,采集的日志还可以进行大数据分析,为高层决策获取更多有价值的数据。
3 K8S需要采集哪些日志
这里只是一个主要采集日志的例子:
4 K8S中的ELK Stack log 采集方案
方法优缺点
方案一:在Node上部署一个日志采集程序
每个Node只需要部署一个日志采集程序,资源消耗少,不干扰应用
应用日志需要写到标准输出和标准错误输出,不支持多行日志
方案二:在Pod中添加专门的日志采集容器
低耦合
每个Pod启动一个日志采集代理,增加资源消耗,增加运维成本
方案三:应用直接推送日志
无需额外的采集工具
深入应用,增加应用的复杂度
5 以单节点方式部署ELK
单节点部署ELK的方法比较简单。可以参考下面的yaml布局文件。整体就是创建一个es,然后创建一个kibana的可视化展示,创建一个es服务service,然后通过ingress暴露域名访问
首先写es的yaml。这里部署*敏*感*词*。在k8s集群中,通常日志量超过每天20G时,建议部署在k8s集群外,以支持分布式集群架构。这里是状态部署的方式,使用动态存储进行持久化,需要提前创建一个存储类来运行yaml
[root@k8s-master fek]# vim elasticsearch.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: kube-system
labels:
k8s-app: elasticsearch
spec:
serviceName: elasticsearch
selector:
matchLabels:
k8s-app: elasticsearch
template:
metadata:
labels:
k8s-app: elasticsearch
spec:
containers:
- image: elasticsearch:7.3.1
name: elasticsearch
resources:
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 0.5
memory: 500Mi
env:
- name: "discovery.type"
value: "single-node"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx2g"
ports:
- containerPort: 9200
name: db
protocol: TCP
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
storageClassName: "managed-nfs-storage"
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: kube-system
spec:
clusterIP: None
ports:
- port: 9200
protocol: TCP
targetPort: db
selector:
k8s-app: elasticsearch
使用刚刚编写的yaml文件创建Elasticsearch,然后查看是否启动。如下图,可以看到创建了一个elasticsearch-0的pod副本,并且运行正常;如果无法正常启动,可以使用kubectl describe查看详细描述,排查问题
[root@k8s-master fek]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5bd5f9dbd9-95flw 1/1 Running 0 17h
elasticsearch-0 1/1 Running 1 16m
php-demo-85849d58df-4bvld 2/2 Running 2 18h
php-demo-85849d58df-7tbb2 2/2 Running 0 17h
然后,需要部署一个Kibana,将采集到的日志可视化,使用Deployment写一个yaml,使用ingress对外暴露访问,直接引用es
[root@k8s-master fek]# vim kibana.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: kube-system
labels:
k8s-app: kibana
spec:
replicas: 1
selector:
matchLabels:
k8s-app: kibana
template:
metadata:
labels:
k8s-app: kibana
spec:
containers:
- name: kibana
image: kibana:7.3.1
resources:
limits:
cpu: 1
memory: 500Mi
requests:
cpu: 0.5
memory: 200Mi
env:
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch:9200
ports:
- containerPort: 5601
name: ui
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: kube-system
spec:
ports:
- port: 5601
protocol: TCP
targetPort: ui
selector:
k8s-app: kibana
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kibana
namespace: kube-system
spec:
rules:
- host: kibana.ctnrs.com
http:
paths:
- path: /
backend:
serviceName: kibana
servicePort: 5601
使用刚刚编写的yaml创建kibana,可以看到终于生成了一个kibana-b7d98644-lshsz的pod并正常运行
[root@k8s-master fek]# kubectl apply -f kibana.yaml
deployment.apps/kibana created
service/kibana created
ingress.extensions/kibana created
[root@k8s-master fek]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5bd5f9dbd9-95flw 1/1 Running 0 17h
elasticsearch-0 1/1 Running 1 16m
kibana-b7d98644-48gtm 1/1 Running 1 17h
php-demo-85849d58df-4bvld 2/2 Running 2 18h
php-demo-85849d58df-7tbb2 2/2 Running 0 17h
最后需要写yaml在每个节点上创建一个ingress-nginx controller,对外提供访问
[root@k8s-master demo2]# vim mandatory.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: udp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
<p>
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- nodes
- pods
- secrets
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- "extensions"
- "networking.k8s.io"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
- "networking.k8s.io"
resources:
- ingresses/status
verbs:
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- pods
- secrets
- namespaces
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
resourceNames:
# Defaults to "-"
# Here: "-"
# This has to be adapted if you change either parameter
# when launching the nginx-ingress-controller.
- "ingress-controller-leader-nginx"
verbs:
- get
- update
- apiGroups:
- ""
resources:
- configmaps
verbs:
- create
- apiGroups:
- ""
resources:
- endpoints
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: nginx-ingress-role-nisa-binding
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nginx-ingress-role
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-nisa-binding
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
serviceAccountName: nginx-ingress-serviceaccount
hostNetwork: true
containers:
- name: nginx-ingress-controller
image: lizhenliang/nginx-ingress-controller:0.20.0
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
---</p>
创建一个ingress controller,可以看到使用DaemonSet方法在各个节点上部署ingress controller,我们可以在本地host绑定任意一个节点ip,然后使用域名访问
[root@k8s-master demo2]# kubectl apply -f mandatory.yaml
[root@k8s-master demo2]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-98769 1/1 Running 6 13h
nginx-ingress-controller-n6wpq 1/1 Running 0 13h
nginx-ingress-controller-tbfxq 1/1 Running 29 13h
nginx-ingress-controller-trxnj 1/1 Running 6 13h
绑定本地主机,访问域名验证
Windows系统,hosts文件地址:C:\Windows\System32\drivers\etc,Mac系统 sudo vi /private/etc/hosts 编辑hosts文件,在底部添加域名和ip进行解析,此ip地址为任意节点node 在ip地址中添加如下命令并保存
192.168.73.139 kibana.ctnrs.com
最后在浏览器中输入,就会进入kibana的web界面。已设置为无需登录。当前页面全部为英文模式。可以在网上搜索修改配置文件的位置。建议使用英文版
5.1 方案一:在Node上部署一个filebeat采集器采集k8s组件log es和kibana后,我们如何采集pod log,我们采用方案一的方法,首先在Deploy a各个节点上的filebeat的采集器,使用的是7.3.1版本,因为filebeat支持k8s,可以连接api给pod日志打标签,所以在yaml中需要认证,最后配置好后拿到数据采集在文件中,输入到es中,在yaml中已经配置好了
[root@k8s-master fek]# vim filebeat-kubernetes.yaml ---apiVersion: v1kind: ConfigMapmetadata: name: filebeat-config namespace: kube-system labels: k8s-app: filebeatdata: filebeat.yml: |- filebeat.config: inputs: # Mounted `filebeat-inputs` configmap: path: ${path.config}/inputs.d/*.yml # Reload inputs configs as they change: reload.enabled: false modules: path: ${path.config}/modules.d/*.yml # Reload module configs as they change: reload.enabled: false # To enable hints based autodiscover, remove `filebeat.config.inputs` configuration and uncomment this: #filebeat.autodiscover: # providers: # - type: kubernetes # hints.enabled: true output.elasticsearch: hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']---apiVersion: v1kind: ConfigMapmetadata: name: filebeat-inputs namespace: kube-system labels: k8s-app: filebeatdata: kubernetes.yml: |- - type: docker containers.ids: - "*" processors: - add_kubernetes_metadata: in_cluster: true---apiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: filebeat namespace: kube-system labels: k8s-app: filebeatspec: template: metadata: labels: k8s-app: filebeat spec: serviceAccountName: filebeat terminationGracePeriodSeconds: 30 containers: - name: filebeat image: elastic/filebeat:7.3.1 args: [ "-c", "/etc/filebeat.yml", "-e", ] env: - name: ELASTICSEARCH_HOST value: elasticsearch - name: ELASTICSEARCH_PORT value: "9200" securityContext: runAsUser: 0 # If using Red Hat OpenShift uncomment this: #privileged: true resources: limits: memory: 200Mi requests: cpu: 100m memory: 100Mi volumeMounts: - name: config mountPath: /etc/filebeat.yml readOnly: true subPath: filebeat.yml - name: inputs mountPath: /usr/share/filebeat/inputs.d readOnly: true - name: data mountPath: /usr/share/filebeat/data - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true volumes: - name: config configMap: defaultMode: 0600 name: filebeat-config - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers - name: inputs configMap: defaultMode: 0600 name: filebeat-inputs # data folder stores a registry of read status for all files, so we don't send everything again on a Filebeat pod restart - name: data hostPath: path: /var/lib/filebeat-data type: DirectoryOrCreate---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: filebeatsubjects:- kind: ServiceAccount name: filebeat namespace: kube-systemroleRef: kind: ClusterRole name: filebeat apiGroup: rbac.authorization.k8s.io---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata: name: filebeat labels: k8s-app: filebeatrules:- apiGroups: [""] # "" indicates the core API group resources: - namespaces - pods verbs: - get - watch - list---apiVersion: v1kind: ServiceAccountmetadata: name: filebeat namespace: kube-system labels: k8s-app: filebeat---
另外k8s组件的日志需要是采集,因为我的环境是用kubeadm部署的,所以我的组件日志都在/var/log/message,所以我们还需要部署一个采集 k8s组件日志的pod副本,自定义索引k8s-module-%{+yyyy.MM.dd},编写yaml如下:
[root@k8s-master elk]# vim k8s-logs.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: k8s-logs-filebeat-config
namespace: kube-system
data:
filebeat.yml: |
filebeat.inputs:
- type: log
paths:
- /var/log/messages
fields:
app: k8s
type: module
fields_under_root: true
setup.ilm.enabled: false
setup.template.name: "k8s-module"
setup.template.pattern: "k8s-module-*"
output.elasticsearch:
hosts: ['elasticsearch.kube-system:9200']
index: "k8s-module-%{+yyyy.MM.dd}"
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: k8s-logs
namespace: kube-system
spec:
selector:
matchLabels:
project: k8s
app: filebeat
template:
metadata:
labels:
project: k8s
app: filebeat
spec:
containers:
- name: filebeat
image: elastic/filebeat:7.3.1
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 500m
memory: 500Mi
securityContext:
runAsUser: 0
volumeMounts:
- name: filebeat-config
mountPath: /etc/filebeat.yml
subPath: filebeat.yml
- name: k8s-logs
mountPath: /var/log/messages
volumes:
- name: k8s-logs
hostPath:
path: /var/log/messages
- name: filebeat-config
configMap:
name: k8s-logs-filebeat-config
创建写入的yaml,查看是否创建成功。可以看到在两个节点上分别创建了两个名为 k8s-log-xx 的 pod 副本。
[root@k8s-master elk]# kubectl apply -f k8s-logs.yaml
[root@k8s-master elk]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5bd5f9dbd9-8zdn5 1/1 Running 0 10h
elasticsearch-0 1/1 Running 1 13h
filebeat-2q5tz 1/1 Running 0 13h
filebeat-k6m27 1/1 Running 2 13h
k8s-logs-52xgk 1/1 Running 0 5h45m
k8s-logs-jpkqp 1/1 Running 0 5h45m
kibana-b7d98644-tllmm 1/1 Running 0 10h
5.1.1 在kibana的web界面配置日志可视化首先打开kibana的web界面,点击左侧菜单栏中的settings,然后点击Kibana下的index按钮,然后点击左上角分别创建如图A filebeat -7.3.1- 和 k8s-module- 的 filebeat采集器 索引匹配
然后按时间筛选完成创建
创建索引匹配后,点击左侧顶部菜单的发现,然后在左侧就可以看到我们刚刚创建的索引,然后可以在下方添加要显示的标签,或者过滤标签,最后的效果如图,可以看到日志中的所有信息采集
在其中一个节点上,输入echo hello logs >>/var/log/messages,然后在web上选择k8s-module-*的索引匹配,在log中可以看到刚才输入到采集 hello日志,证明采集成功,如图
5.2 方案二:在Pod中添加一个专门的日志采集容器我们也可以使用采集pod日志的解决方案,在pod中注入一个日志采集容器,以php-demo应用为例,使用emptyDir将log目录共享到采集器容器集合的方法,写nginx-deployment.yaml,直接将filebeat容器添加到pod中,自定义index为nginx-access-%{+yyyy.MM。dd}
[root@k8s-master fek]# vim nginx-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: php-demo
namespace: kube-system
spec:
replicas: 2
selector:
matchLabels:
project: www
app: php-demo
template:
metadata:
labels:
project: www
app: php-demo
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: nginx
image: lizhenliang/nginx-php
ports:
- containerPort: 80
name: web
protocol: TCP
resources:
requests:
cpu: 0.5
memory: 256Mi
limits:
cpu: 1
memory: 1Gi
livenessProbe:
httpGet:
path: /status.html
port: 80
initialDelaySeconds: 20
timeoutSeconds: 20
readinessProbe:
httpGet:
path: /status.html
port: 80
initialDelaySeconds: 20
timeoutSeconds: 20
volumeMounts:
- name: nginx-logs
mountPath: /usr/local/nginx/logs
- name: filebeat
image: elastic/filebeat:7.3.1
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 100Mi
securityContext:
runAsUser: 0
volumeMounts:
- name: filebeat-config
mountPath: /etc/filebeat.yml
subPath: filebeat.yml
- name: nginx-logs
mountPath: /usr/local/nginx/logs
volumes:
- name: nginx-logs
emptyDir: {}
- name: filebeat-config
configMap:
name: filebeat-nginx-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-nginx-config
namespace: kube-system
data:
filebeat.yml: |-
filebeat.inputs:
- type: log
paths:
- /usr/local/nginx/logs/access.log
# tags: ["access"]
fields:
app: www
type: nginx-access
fields_under_root: true
setup.ilm.enabled: false
setup.template.name: "nginx-access"
setup.template.pattern: "nginx-access-*"
output.elasticsearch:
hosts: ['elasticsearch.kube-system:9200']
index: "nginx-access-%{+yyyy.MM.dd}"
创建刚刚编写的 nginx-deployment.yaml。创建后,kube-system命名空间下会有pod/php-demo-58d89c9bc4-r5692两个pod副本,对外暴露一个service/php-demo
[root@k8s-master elk]# kubectl apply -f nginx-deployment.yaml
[root@k8s-master fek]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5bd5f9dbd9-8zdn5 1/1 Running 0 20helasticsearch-0 1/1 Running 1 23hfilebeat-46nvd 1/1 Running 0 23m
filebeat-sst8m 1/1 Running 0 23m
k8s-logs-52xgk 1/1 Running 0 15hk8s-logs-jpkqp 1/1 Running 0 15hkibana-b7d98644-tllmm 1/1 Running 0 20hphp-demo-85849d58df-d98gv 2/2 Running 0 26m
php-demo-85849d58df-sl5ss 2/2 Running 0 26m
然后打开kibana的web,继续按照刚才的方法添加匹配nginx-access-*的索引,如图
最后点击左侧顶部菜单的Discover,然后就可以在左侧看到我们刚刚创建的索引匹配,下拉选择nginx-access-*,然后就可以添加下面要显示的标签了,或者过滤标签,最后效果如图,可以看到采集到达的日志的所有信息
专注开源DevOps技术栈技术,有问题欢迎交流
本文使用文章同步助手进行同步
常用的方法:数据采集的常用方法-数据采集的工具都有哪些?
随着社会的不断发展。人们越来越离不开互联网,常用的数据采集工具有哪些?今天小编就为大家盘点免费好用的数据采集工具,无论是导出到excel还是自动发布到网站,只需点击几下鼠标,即可轻松获取数据。详见图1、2、3、4!
业务人员
通过抓取动态网页数据分析客户行为拓展新业务,同时通过数据更好地了解竞争对手,分析竞争对手,超越竞争对手。
网站人
实现自动采集、定期发布、自动SEO优化,让您的网站瞬间拥有强大的内容支撑,快速提升流量和知名度。
个人的
代替手动复制和粘贴,提高效率并节省更多时间。解决学术研究或生活、工作等数据信息需求,彻底解决没有素材的问题,也告别了手动复制粘贴的痛苦。
站群必备数据采集工具
现在圈子里的人都对站群这个词很清楚了,现在很多公司都在用站群来开发自己的网站,用站群来包围自己的网站SEO优化需要注意以下几点。
1. 尝试隐藏站群
大多数情况下,搜索引擎不会将同一个人或公司的多个网站排在同一个关键词下。
如果搜索引擎发现很多网站属于同一个人或公司,即使优化再好,也只会给一个网站好的排名。如果 站群 走得太远,这个可能无法生存。
所以想办法隐藏站群之间的关系。域名 Whois 信息使用不同的名称、不同的地址和不同的电子邮件地址。网站放在不同的服务器上,使用不同的IP地址。尽量不要将相同的联系地址放在 网站上。电话。
2. 不要在站群之间交叉链接
在做站群的时候,很容易把所有这些网站联系起来。希望这些站能得到一个好的排名,PR可以在各个站之间传递。但是容易暴露站群的所有者,容易被判断为链接工厂。
应该选择一个网站作为主网站,其他网站链接到这个主网站,但不要链接到其他次要网站,把这些网站 的能量集中在主网站身上。
3. 网站内容要不同
我发现很多人喜欢把一模一样的网站内容放在多个域上,这是很不合适的。
建议选择一个做master网站,另一个网站做301重定向到master网站。这不会被视为 站群,也不会产生 站群 的效果,但会起到保护相关域名的作用。
如果要将这些域名做成站群,内容必须不同。例如。例如,如果主要 网站是关于汽车的,那么您可以制作一系列 站群,一个用于轮胎,一个用于发动机,一个用于配件。这些站群有相关内容,链接到大师网站在适当的地方。
由于内容不同,不会被视为重复内容。来自同一个 网站的多个链接不如来自不同域的链接有效。这些内容相关但域名不同的网站可以对主网站起到很好的辅助作用。