# K8s 上一鍵安裝 EFK
# EFK
Elasticsearch,Fluentd,Kibana 的組合 Teck stack
- Elasticsearch 用於儲存與搜尋
 
- Fluentd 用於收集系統 Log
 
- Kibana 提供資料視覺化
 
# 開始安裝
把下列內容儲存成 template.yaml
1 2 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
   |