K8s 上一鍵安裝 EFK
EFK
Elasticsearch,Fluentd,Kibana 的組合 Teck stack
- Elasticsearch 用於儲存與搜尋
- Fluentd 用於收集系統 Log
- Kibana 提供資料視覺化
開始安裝
把下列內容儲存成 template.yaml
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 
 | ---apiVersion: v1
 kind: Service
 metadata:
 name: elasticsearch-kibana
 labels:
 app: elasticsearch-kibana
 spec:
 type: ClusterIP
 selector:
 app: elasticsearch-kibana
 ports:
 - name: es-port
 protocol: TCP
 port: 9200
 targetPort: 9200
 - name: kibana-port
 protocol: TCP
 port: 5601
 targetPort: 5601
 ---
 apiVersion: apps/v1
 kind: Deployment
 metadata:
 name: elasticsearch-kibana
 labels:
 app: elasticsearch-kibana
 spec:
 replicas: 1
 selector:
 matchLabels:
 app: elasticsearch-kibana
 template:
 metadata:
 labels:
 app: elasticsearch-kibana
 spec:
 containers:
 - name: elasticsearch-kibana
 image: nshou/elasticsearch-kibana:kibana7
 imagePullPolicy: IfNotPresent
 securityContext:
 privileged: true
 ports:
 - name: es-port
 protocol: TCP
 containerPort: 9200
 - name: kibana-port
 protocol: TCP
 containerPort: 5601
 env:
 - name: "SSL_MODE"
 value: "false"
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
 name: fluent-bit
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
 metadata:
 name: fluent-bit-read
 rules:
 - apiGroups:
 - ""
 resources:
 - "nodes"
 - "events"
 - "namespaces"
 - "pods"
 verbs:
 - "get"
 - "list"
 - "watch"
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
 name: fluent-bit-read
 roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: ClusterRole
 name: fluent-bit-read
 subjects:
 - kind: ServiceAccount
 name: fluent-bit
 namespace: aio
 ---
 apiVersion: v1
 kind: ConfigMap
 metadata:
 name: fluent-bit-cm
 data:
 
 fluent-bit.conf: |-
 [SERVICE]
 Flush         1
 Log_Level     info
 Parsers_File  parsers.conf
 
 @INCLUDE input-cpu.conf
 @INCLUDE input-mem.conf
 @INCLUDE input-k8s.conf
 @INCLUDE input-disk.conf
 @INCLUDE input-network.conf
 @INCLUDE filter-k8s.conf
 @INCLUDE output-elasticsearch.conf
 parsers.conf: |-
 [PARSER]
 Name        cri
 Format      regex
 Regex       ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$
 Time_Key    time
 Time_Format %Y-%m-%dT%H:%M:%S.%L%z
 input-cpu.conf: |
 [INPUT]
 Name cpu
 Tag  cpu
 input-mem.conf: |
 [INPUT]
 Name mem
 Tag  memory
 input-disk.conf: |
 [INPUT]
 Name disk
 Tag  disk
 Interval_Sec  1
 Interval_NSec 0
 input-network.conf: |
 [INPUT]
 Name netif
 Tag netif
 Interval_Sec  1
 Interval_NSec 0
 Interface     eth0
 input-k8s.conf: |
 [INPUT]
 Name              tail
 Tag               kube.*
 Path              /var/log/containers/*_default_*.log
 Parser            cri
 DB                /var/log/fluentbit.db
 Mem_Buf_Limit     5MB
 Skip_Long_Lines   on
 Refresh_Interval  10
 filter-k8s.conf: |
 [FILTER]
 Name                kubernetes
 Match               kube.*
 Kube_URL            https://kubernetes.default.svc:443
 Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
 Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
 Kube_Tag_Prefix     kube.var.log.containers.
 Merge_Log           on
 Merge_Log_Key       log_processed
 K8S-Logging.Parser  off
 K8S-Logging.Exclude off
 output-elasticsearch.conf: |
 [OUTPUT]
 Name                es
 Match               *
 Host                elasticsearch-kibana
 Port                9200
 Type                _doc
 Logstash_Format     on
 Logstash_Prefix     project
 Logstash_DateFormat %Y.%m.%d
 Time_Key_Format     %Y-%m-%dT%H:%M:%S
 Buffer_Size         16k
 ---
 apiVersion: apps/v1
 kind: DaemonSet
 metadata:
 name: fluent-bit
 labels:
 app: fluent-bit
 spec:
 selector:
 matchLabels:
 app: fluent-bit
 template:
 metadata:
 labels:
 app: fluent-bit
 spec:
 volumes:
 - name: log
 hostPath:
 path: /var/log
 type: Directory
 - name: config
 configMap:
 name: fluent-bit-cm
 containers:
 - name: fluent-bit
 image: fluent/fluent-bit:1.7.0
 imagePullPolicy: IfNotPresent
 ports:
 - name: http-port
 protocol: TCP
 containerPort: 2020
 volumeMounts:
 - name: log
 mountPath: /var/log
 - name: config
 mountPath: /fluent-bit/etc
 terminationGracePeriodSeconds: 10
 serviceAccountName: fluent-bit
 tolerations:
 - key: node-role.kubernetes.io/master
 operator: "Exists"
 effect: "NoSchedule"
 - operator: "Exists"
 effect: "NoExecute"
 - operator: "Exists"
 effect: "NoSchedule"
 
 | 
| 1
 | kubectl apply -f template.yaml #套用至 K8s
 |