最佳实践: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: [&#39;${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}&#39;]---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&#39;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: [&#39;elasticsearch.kube-system:9200&#39;]

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 &gt;&gt;/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: [&#39;elasticsearch.kube-system:9200&#39;]

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网站。这不会被视为 站群,也不会产生 站群 的效果,但会起到保护相关域名的作用。

  如果要将这些域名做成站群,内容必须不同。例如。例如,如果主要 网站是关于汽车的,那么您可以制作一系列 站群,一个用于轮胎,一个用于发动机,一个用于配件。这些站群有相关内容,链接到大师网站在适当的地方。

  由于内容不同,不会被视为重复内容。来自同一个 网站的多个链接不如来自不同域的链接有效。这些内容相关但域名不同的网站可以对主网站起到很好的辅助作用。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线