首先部署es和kinban
es部署
創(chuàng)建es-svc
kind: Service
apiVersion: v1
metadata:
name: elasticsearch
namespace: logging
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
targetPort: 9200
name: rest
- port: 9300
targetPort: 9300
name: inter-node
es-statefulset.yaml
開啟es跨域訪問
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es
namespace: logging
generation: 1
labels:
appgroup: ''
annotations:
container.io/container-0: https://xxxxx.cn/
description: ''
spec:
serviceName: elasticsearch
replicas: 1
selector:
matchLabels:
app: elasticsearch
failure-domain.beta.kubernetes.io/region: xxxxx
failure-domain.beta.kubernetes.io/zone: xxxxx
template:
metadata:
labels:
app: elasticsearch
failure-domain.beta.kubernetes.io/region: xxxx
failure-domain.beta.kubernetes.io/zone: xxxxx
annotations:
metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
pod.alpha.kubernetes.io/initialized: 'true'
spec:
initContainers:
- name: increase-vm-max-map
image: xxxxx/jxxxxx/busybox
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: xxxxx/xxx/busybox
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
containers:
- name: elasticsearch
image: xxxxx/xxxxx/elasticsearch:7.6.2
ports:
- name: rest
containerPort: 9200
- name: inter
containerPort: 9300
resources:
limits:
cpu: 800m
requests:
cpu: 300m
volumeMounts:
- name: efk-data
mountPath: /usr/share/elasticsearch/data
env:
- name: discovery.type
value: single-node
- name: http.cors.enabled
value: "true"
- name: http.cors.allow-origin
value: "*"
- name: http.cors.allow-methods
value: "OPTIONS,HEAD,GET,POST,DELETE"
- name: http.cors.allow-headers
value: "Content-Type,Accept,Authorization,x-requseted-with"
- name: transport.host
value: "0.0.0.0"
- name: discovery.seed_hosts
value: "elasticsearch"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx512m"
- name: network.host
value: "0.0.0.0"
volumes:
- name: efk-data
persistentVolumeClaim:
claimName: cxx-xx-l8xxxwi3-suub
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
imagePullSecrets:
- name: default-secret
affinity: {}
schedulerName: default-scheduler
部署kinban
創(chuàng)建kibana的configmap
kinban開啟中文
apiVersion: v1
kind: ConfigMap
metadata:
namespace: logging
name: kibana-config
labels:
app: kibana
data:
kibana.yml: |-
server.name: kibana
server.host: "0"
i18n.locale: zh-CN
xpack.monitoring.ui.container.elasticsearch.enabled: 'true'
elasticsearch:
hosts: ${ELASTICSEARCH_HOSTS}
創(chuàng)建kibana
apiVersion: v1
kind: Service
metadata:
annotations:
kubernetes.io/elb.class: union
kubernetes.io/session-affinity-mode: SOURCE_IP
name: kibana
namespace: logging
labels:
app: kibana
spec:
ports:
- name: kibana
port: 5601
protocol: TCP
targetPort: 5601
type: LoadBalancer
selector:
app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: logging
labels:
app: kibana
spec:
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
imagePullSecrets:
- name: default-secret
containers:
- name: kibana
image: xxxxx/xxxxx/kibana:7.6.2
resources:
limits:
cpu: 1000m
requests:
cpu: 1000m
env:
- name: ELASTICSEARCH_HOSTS
value: 'http://elasticsearch:9200'
ports:
- containerPort: 5601
volumeMounts:
- name: config
mountPath: /usr/share/kibana/config/kibana.yml
readOnly: true
subPath: kibana.yml
volumes:
- name: config
configMap:
name: kibana-config
部署fluentd
創(chuàng)建fluentd-configmap
只收集pod label 標(biāo)記為 logging=true 的日志
注意掛載的日志目錄出現(xiàn)unreadable 說明日志軟連接有問題,無法讀取日志
kind: ConfigMap
apiVersion: v1
metadata:
name: fluentd-config
namespace: logging
data:
system.conf: |-
<system>
root_dir /tmp/fluentd-buffers/
</system>
fluent.conf: |-
<source>
@id fluentd-containers.log
@type tail # Fluentd 內(nèi)置的輸入方式,其原理是不停地從源文件中獲取新的日志。
path /var/log/containers/*.log # 掛載的服務(wù)器Docker容器日志地址
pos_file /var/log/es-containers.log.pos
tag raw.kubernetes.* # 設(shè)置日志標(biāo)簽
read_from_head true
<parse> # 多行格式化成JSON
@type multi_format # 使用 multi-format-parser 解析器插件
<pattern>
format json # JSON解析器
time_key time # 指定事件時(shí)間的時(shí)間字段
time_format %Y-%m-%dT%H:%M:%S.%NZ # 時(shí)間格式
</pattern>
<pattern>
format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
time_format %Y-%m-%dT%H:%M:%S.%N%:z
</pattern>
</parse>
</source>
# 在日志輸出中檢測異常,并將其作為一條日志轉(zhuǎn)發(fā)
# https://github.com/GoogleCloudPlatform/fluent-plugin-detect-exceptions
<match raw.kubernetes.**> # 匹配tag為raw.kubernetes.**日志信息
@id kubernetes
@type detect_exceptions # 使用detect-exceptions插件處理異常棧信息
remove_tag_prefix raw # 移除 raw 前綴
message log
stream stream
multiline_flush_interval 5
max_bytes 500000
max_lines 1000
</match>
<filter **> # 拼接日志
@id filter_concat
@type concat # Fluentd Filter 插件,用于連接多個(gè)事件中分隔的多行日志。
key message
multiline_end_regexp /\n$/ # 以換行符“\n”拼接
separator ""
</filter>
# 添加 Kubernetes metadata 數(shù)據(jù)
<filter kubernetes.**>
@id filter_kubernetes_metadata
@type kubernetes_metadata
</filter>
# 修復(fù) ES 中的 JSON 字段
# 插件地址:https://github.com/repeatedly/fluent-plugin-multi-format-parser
<filter kubernetes.**>
@id filter_parser
@type parser # multi-format-parser多格式解析器插件
key_name log # 在要解析的記錄中指定字段名稱。
reserve_data true # 在解析結(jié)果中保留原始鍵值對。
remove_key_name_field true # key_name 解析成功后刪除字段。
<parse>
@type multi_format
<pattern>
format json
</pattern>
<pattern>
format none
</pattern>
</parse>
</filter>
# 刪除一些多余的屬性
<filter kubernetes.**>
@type record_transformer
remove_keys $.kubernetes.namespace_labels.project,$.kubernetes.pod_ip,$.kubernetes.labels.app,$.docker.container_id,$.kubernetes.container_image_id,$.kubernetes.pod_id,$.kubernetes.namespace_id,$.kubernetes.master_url,$.kubernetes.labels.pod-template-hash
</filter>
# 只保留具有l(wèi)ogging=true標(biāo)簽的Pod日志
<filter kubernetes.**>
@id filter_log
@type grep
<regexp>
key $.kubernetes.labels.logging
pattern ^true$
</regexp>
</filter>
<match **>
@id elasticsearch
@type elasticsearch
@log_level info
include_tag_key true
host elasticsearch
port 9200
logstash_format true
logstash_prefix k8slog # 設(shè)置 index 前綴為 k8s
request_timeout 30s
<buffer>
@type file
path /var/log/fluentd-buffers/kubernetes.system.buffer
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 5s
retry_forever
retry_max_interval 30
chunk_limit_size 2M
queue_limit_length 8
overflow_action block
</buffer>
</match>
部署fluentd-daemonset
注意fluentd鏡像版本,需要下載K8S的專用鏡像,否則會(huì)報(bào)沒有插件可用。
需要開啟fluentd收集K8S的參數(shù)才能收集到K8S的pod信息。
注意掛載的日志路徑。文章來源:http://www.zghlxwxcb.cn/news/detail-577536.html
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd-es
namespace: logging
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
- ""
resources:
- "namespaces"
- "pods"
verbs:
- "get"
- "watch"
- "list"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
name: fluentd-es
namespace: logging
apiGroup: ""
roleRef:
kind: ClusterRole
name: fluentd-es
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-es
namespace: logging
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
matchLabels:
k8s-app: fluentd-es
template:
metadata:
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
# 此注釋確保如果節(jié)點(diǎn)被驅(qū)逐,fluentd不會(huì)被驅(qū)逐,支持關(guān)鍵的基于 pod 注釋的優(yōu)先級方案。
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
serviceAccountName: fluentd-es
containers:
- name: fluentd-es
image: xxxxx/xxxxx/k8s-fluentd:v1.0
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "http://elasticsearch"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_KUBERNETES_METADATA_SKIP_CONTAINER_METADATA
value: 'true'
- name: FLUENT_KUBERNETES_METADATA_SKIP_SKIP_LABELS
value: 'true'
- name: K8S_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: FLUENTD_ARGS
value: --no-supervisor -q
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlogpods
mountPath: /var/log/pods
- name: config-volume
mountPath: /fluentd/etc/
imagePullSecrets:
- name: default-secret
tolerations:
- operator: Exists
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: config-volume
configMap:
name: fluentd-config
日志展示效果如下文章來源地址http://www.zghlxwxcb.cn/news/detail-577536.html
到了這里,關(guān)于K8S部署EFK(fluentd)收集日志的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!