k8s–基礎(chǔ)–24.3–efk–安裝efk組件
下面的步驟在k8s集群的master1節(jié)點(diǎn)操作
1、創(chuàng)建名稱空間
- 創(chuàng)建一個(gè)名稱空間,將EFK組件安裝到該名稱空間中。
- 名稱空間:kube-logging
1.1、腳本
vi /root/efk/kube-logging.yaml
內(nèi)容
kind: Namespace
apiVersion: v1
metadata:
name: kube-logging
1.2、執(zhí)行
kubectl apply -f /root/efk/kube-logging.yaml
# 查看kube-logging名稱空間是否創(chuàng)建成功
kubectl get namespaces | grep kube-logging
2、安裝elasticsearch組件
- 通過(guò)上面步驟已經(jīng)創(chuàng)建了一個(gè)名稱空間kube-logging,在這個(gè)名稱空間下去安裝日志收集組件efk
- 我們將部署一個(gè)3節(jié)點(diǎn)的Elasticsearch集群,我們使用3個(gè)Elasticsearch Pods可以避免高可用中的多節(jié)點(diǎn)群集中發(fā)生的"裂腦"的問(wèn)題。
- Elasticsearch腦裂可參考
- https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html#split-brain
2.1、創(chuàng)建一個(gè)headless service(無(wú)頭服務(wù))
- 創(chuàng)建一個(gè)headless service的Kubernetes服務(wù),這個(gè)服務(wù)將為3個(gè)Pod定義一個(gè)DNS域。
- 服務(wù)名稱:elasticsearch
- headless service不具備負(fù)載均衡也沒(méi)有IP。
2.1.1、腳本
vi /root/efk/elasticsearch_svc.yaml
內(nèi)容
kind: Service
apiVersion: v1
metadata:
# Service名稱為elasticsearch
name: elasticsearch
# 名稱空間為kube-logging
namespace: kube-logging
# Service的標(biāo)簽
labels:
app: elasticsearch
spec:
# 帶有app=elasticsearch標(biāo)簽,當(dāng)我們將 Elasticsearch StatefulSet 與此服務(wù)關(guān)聯(lián)時(shí),服務(wù)將返回帶有標(biāo)簽app=elasticsearch的 Elasticsearch Pods的DNS A記錄
selector:
app: elasticsearch
# 設(shè)置該服務(wù)設(shè)置成無(wú)頭服務(wù)。
clusterIP: None
# 定義端口9200、9300,分別用于與 REST API 交互,以及用于節(jié)點(diǎn)間通信。
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node
2.1.2、執(zhí)行
kubectl apply -f /root/efk/elasticsearch_svc.yaml
# 查看
kubectl get svc -n=kube-logging
- 上面操作總結(jié)
- 為Pod設(shè)置了 無(wú)頭服務(wù)
- 為Pod設(shè)置了 一個(gè)穩(wěn)定的域名.elasticsearch.kube-logging.svc.cluster.local
- 接下來(lái)我們通過(guò)StatefulSet來(lái)創(chuàng)建具體的Elasticsearch的Pod應(yīng)用。
2.2、通過(guò)statefulset創(chuàng)建elasticsearch集群
- Kubernetes statefulset可以為Pods分配一個(gè)穩(wěn)定的標(biāo)識(shí),讓pod具有穩(wěn)定的、持久的存儲(chǔ)。
- Elasticsearch需要穩(wěn)定的存儲(chǔ)才能通過(guò)POD重新調(diào)度和重新啟動(dòng)來(lái)持久化數(shù)據(jù)。
2.2.1、腳本
vi /root/efk/elasticsaerch-statefulset.yaml
內(nèi)容
apiVersion: apps/v1
kind: StatefulSet
metadata:
# StatefulSet的名稱es-cluster
name: es-cluster
# 名稱空間 kube-logging
namespace: kube-logging
spec:
# 使用名稱為elasticsearch的Service服務(wù)
# 可以確??梢允褂靡韵翫NS地址訪問(wèn)StatefulSet中的每個(gè)Pod:es-cluster-[0,1,2].elasticsearch.kube-logging.svc.cluster.local
# 其中[0,1,2]與Pod分配的序號(hào)數(shù)相對(duì)應(yīng)。
serviceName: elasticsearch
# 我們指定3個(gè)replicas(3個(gè)Pod副本)
replicas: 3
selector:
# 匹配模板中 標(biāo)簽是app: elasticseach的pod
matchLabels:
app: elasticsearch
template:
metadata:
# 模板中定義pod的標(biāo)簽為 app: elasticsearch
labels:
app: elasticsearch
spec:
# 定義容器
containers:
# 容器名稱
- name: elasticsearch
# 使用的鏡像
image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
# 鏡像拉取策略,如果本地鏡像存在就使用本地鏡像
imagePullPolicy: IfNotPresent
# 資源限制,最小CPU 100m(0.1個(gè)CPU),最大CPU 1000m(1個(gè)CPU)
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
# 暴漏了9200和9300兩個(gè)端口,名稱要和上面定義的Service保持一致
ports:
# 容器端口
- containerPort: 9200
# 端口名稱
name: rest
# 協(xié)議
protocol: TCP
- containerPort: 9300
name: inter-node
protocol: TCP
# 定義掛載
volumeMounts:
# 使用volumeClaimTemplates模板的名稱
- name: data
# 定義掛載點(diǎn)
mountPath: /usr/share/elasticsearch/data
# 定義環(huán)境變量
env:
# Elasticsearch 集群的名稱,我們這里是 k8s-logs
- name: cluster.name
value: k8s-logs
# 節(jié)點(diǎn)的名稱,通過(guò)metadata.name來(lái)獲取。這將解析為 es-cluster-[0,1,2],取決于節(jié)點(diǎn)的指定順序。
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
# seed_hosts 用于設(shè)置在Elasticsearch集群中節(jié)點(diǎn)相互連接的發(fā)現(xiàn)方法。
# 由于我們之前配置的無(wú)頭服務(wù),我們的 Pod 具有唯一的 DNS 域es-cluster-[0,1,2].elasticsearch.kube-logging.svc.cluster.local
# 因此我們相應(yīng)地設(shè)置此變量。由于都在同一個(gè) namespace 下面,所以我們可以將其縮短為es-cluster-[0,1,2].elasticsearch。
- name: discovery.seed_hosts
value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
# 設(shè)置初始化es服務(wù),這里使用es服務(wù)的節(jié)點(diǎn)名稱,也就是pod名稱
- name: cluster.initial_master_nodes
value: "es-cluster-0,es-cluster-1,es-cluster-2"
# 設(shè)置JVM參數(shù)
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx512m"
# 定義初始化容器,這些初始容器按照定義的順序依次執(zhí)行,執(zhí)行完成后才會(huì)啟動(dòng)主應(yīng)用容器。
initContainers:
# fix-permissions容器用來(lái)運(yùn)行chown命令,將Elasticsearch數(shù)據(jù)目錄的用戶和組更改為1000:1000(Elasticsearch用戶的 UID)。
# 因?yàn)槟J(rèn)情況下,Kubernetes 用 root 用戶掛載數(shù)據(jù)目錄,這會(huì)使得 Elasticsearch 無(wú)法訪問(wèn)該數(shù)據(jù)目錄
- name: fix-permissions
image: busybox
imagePullPolicy: IfNotPresent
# 將Elasticsearch數(shù)據(jù)目錄的用戶和組更改為1000:1000
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
securityContext:
# docker的privileged,讓container內(nèi)的root擁有真正的root權(quán)限。
privileged: true
# 設(shè)置掛載
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
# increase-vm-max-map容器 用來(lái)增加操作系統(tǒng)對(duì)mmap計(jì)數(shù)的限制
# 默認(rèn)情況下該值可能太低,導(dǎo)致內(nèi)存不足的錯(cuò)誤
- name: increase-vm-max-map
image: busybox
imagePullPolicy: IfNotPresent
# 增加操作系統(tǒng)對(duì)mmap計(jì)數(shù)的限制
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
# increase-fd-ulimit容器 用來(lái)執(zhí)行ulimit命令增加打開(kāi)文件描述符的最大數(shù)量的。
- name: increase-fd-ulimit
image: busybox
imagePullPolicy: IfNotPresent
# 增加打開(kāi)文件描述符的最大數(shù)量的。
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
# 使用 volumeClaimTemplates 來(lái)定義持久化模板,Kubernetes 會(huì)使用它為 Pod 創(chuàng)建 pv
volumeClaimTemplates:
- metadata:
# 定義模板的名稱
name: data
# 定義模板的標(biāo)簽
labels:
app: elasticsearch
spec:
# 定義pvc的訪問(wèn)模式為ReadWriteOnce,只能被 mount 到單個(gè)節(jié)點(diǎn)上進(jìn)行讀寫
accessModes: [ "ReadWriteOnce" ]
# 設(shè)置一個(gè)存儲(chǔ)類對(duì)象,我們需要提前創(chuàng)建該對(duì)象,我們這里使用的 NFS 作為存儲(chǔ)后端,所以需要安裝一個(gè)對(duì)應(yīng)的nfs provisioner 驅(qū)動(dòng)。
storageClassName: do-block-storage
resources:
requests:
# 定義pvc的大小為1G
storage: 1Gi
2.2.2、執(zhí)行
kubectl apply -f /root/efk/elasticsaerch-statefulset.yaml
# 查看
kubectl get pods -n kube-logging
kubectl get StatefulSet -n kube-logging
2.2.3、查看
pod部署完成之后,可以通過(guò)REST API檢查elasticsearch集群是否部署成功
2.2.3.1、在master1上執(zhí)行以下命令
# 將本地端口9200轉(zhuǎn)發(fā)到 Elasticsearch 節(jié)點(diǎn)(如es-cluster-0)對(duì)應(yīng)的端口
kubectl port-forward es-cluster-0 9200:9200 --namespace=kube-logging
2.2.3.2、新開(kāi)一個(gè)master1終端,執(zhí)行如下請(qǐng)求
curl http://localhost:9200/_cluster/state?pretty
內(nèi)容
{
"cluster_name" : "k8s-logs",
"cluster_uuid" : "6_lgzFwSTVmbxZYcXpklzg",
"version" : 17,
"state_uuid" : "_Dh8UScXT8KuPMqyfIlWeQ",
"master_node" : "3Drb7yF1SJupD63olsPc1Q",
"blocks" : { },
"nodes" : {
"MQIKdEc6TJaddwbnMl1zlg" : {
"name" : "es-cluster-0",
"ephemeral_id" : "jgY6M04QQH-BUu96cexFqA",
"transport_address" : "10.244.1.254:9300",
"attributes" : {
"ml.machine_memory" : "4122746880",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true"
}
},
"tmPTMGQXQiCM_8HMbTw-fw" : {
"name" : "es-cluster-2",
"ephemeral_id" : "PHil1sr-ROuGiQ7H2VM3jA",
"transport_address" : "10.244.1.3:9300",
"attributes" : {
"ml.machine_memory" : "4122746880",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true"
}
},
"3Drb7yF1SJupD63olsPc1Q" : {
"name" : "es-cluster-1",
"ephemeral_id" : "IQ4R0Cj2RcqzNz5idxHFFQ",
"transport_address" : "10.244.1.2:9300",
"attributes" : {
"ml.machine_memory" : "4122746880",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true"
}
}
},
......
表明 名稱空間為k8s-logs的 Elasticsearch 集群成功創(chuàng)建了3個(gè)節(jié)點(diǎn)
- es-cluster-0(主節(jié)點(diǎn))
- es-cluster-1
- es-cluster-2
3、安裝kibana組件
elasticsearch安裝成功之后,開(kāi)始部署kibana
3.1、腳本
vi /root/efk/kibana.yaml
內(nèi)容
apiVersion: v1
kind: Service
metadata:
# Service名稱為kibana
name: kibana
# 名稱空間
namespace: kube-logging
# Service標(biāo)簽
labels:
app: kibana
spec:
# 端口
ports:
- port: 5601
# pod對(duì)應(yīng)的標(biāo)簽
selector:
app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
# Deployment名稱
name: kibana
# 名稱空間
namespace: kube-logging
# Deployment標(biāo)簽
labels:
app: kibana
spec:
# 副本數(shù)量
replicas: 1
# pod對(duì)應(yīng)的標(biāo)簽
selector:
matchLabels:
app: kibana
# 定義模板
template:
metadata:
# 定義模板的pod標(biāo)簽
labels:
app: kibana
spec:
# 定義容器
containers:
# 容器名稱
- name: kibana
# 鏡像地址
image: docker.elastic.co/kibana/kibana:7.2.0
# 鏡像拉取策略
imagePullPolicy: IfNotPresent
# 定義資源
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
# 定義環(huán)境變量
env:
- name: ELASTICSEARCH_URL
# 使用名稱為elasticsearch的service進(jìn)行訪問(wèn)
value: http://elasticsearch:9200
# 定義端口
ports:
- containerPort: 5601
3.2、執(zhí)行
kubectl apply -f /root/efk/kibana.yaml
# 查看
kubectl get pods -n kube-logging
kubectl get svc -n kube-logging
3.3、修改service的type類型為NodePort
nodePort類型可以被k8s之外的主機(jī)或者瀏覽器訪問(wèn)
kubectl edit svc kibana -n kube-logging
# 查看
kubectl get svc -n kube-logging
3.4、瀏覽器訪問(wèn)
http://192.168.187.154:32238
4、安裝fluentd組件
- 保證集群中的每個(gè)節(jié)點(diǎn)都可以運(yùn)行同樣fluentd的pod副本,那就要使用daemonset控制器
- fluentd可以采集哪些日志
- 容器 的日志
- kubelet 的日志
- kube-proxy 的日志
- docker 的日志
- 在k8s集群中,容器應(yīng)用程序的輸入輸出日志會(huì)重定向到node節(jié)點(diǎn)里的json文件中,fluentd可以tail和過(guò)濾以及把日志轉(zhuǎn)換成指定的格式發(fā)送到elasticsearch集群中。
4.1、腳本
vi /root/efk/fluentd.yaml
內(nèi)容
# 創(chuàng)建sa賬號(hào)
apiVersion: v1
kind: ServiceAccount
metadata:
# 創(chuàng)建sa賬號(hào)
name: fluentd
# 名稱空間為kube-logging
namespace: kube-logging
labels:
# 選擇標(biāo)簽為app: fluentd的pod
app: fluentd
---
# 對(duì)sa賬號(hào)做rbac授權(quán)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: fluentd
labels:
app: fluentd
rules:
- apiGroups:
- ""
resources:
- pods
- namespaces
verbs:
- get
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd
roleRef:
kind: ClusterRole
name: fluentd
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: fluentd
namespace: kube-logging
---
# 部署fluentd
apiVersion: apps/v1
kind: DaemonSet
metadata:
# DaemonSet的名稱
name: fluentd
# 名稱空間為kube-logging
namespace: kube-logging
# DaemonSet的標(biāo)簽
labels:
app: fluentd
spec:
# 定義標(biāo)簽選擇器
selector:
matchLabels:
# 選擇標(biāo)簽為app: fluentd的template
app: fluentd
# 定義模板
template:
metadata:
labels:
# 定義標(biāo)簽是app: fluentd的pod
app: fluentd
spec:
# 使用sa賬號(hào)為fluentd
serviceAccount: fluentd
# 使用sa賬號(hào)為fluentd
serviceAccountName: fluentd
# 定義容忍度,可以容忍 key: node-role.kubernetes.io/master,effect: NoSchedule的污點(diǎn),也就是可以在master上部署pod
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
# 定義容器
containers:
# 容器名稱
- name: fluentd
# 鏡像地址
image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
# 鏡像策略,如果本地有鏡像,就使用本地鏡像
imagePullPolicy: IfNotPresent
# 定義環(huán)境變量
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.kube-logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
value: "http"
- name: FLUENTD_SYSTEMD_CONF
value: disable
# 定義資源限制
resources:
limits:
memory: 512Mi
requests:
cpu: 100m
memory: 200Mi
# 掛載點(diǎn)
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
# 只讀存儲(chǔ)卷
readOnly: true
# 等待容器進(jìn)程完全停止,如果在30s還未完全停止,就發(fā)送 SIGKILL 信號(hào)強(qiáng)制殺死進(jìn)程。
terminationGracePeriodSeconds: 30
# 定義存儲(chǔ)卷
volumes:
# 存儲(chǔ)卷名稱
- name: varlog
# 使用hostPath類型的存儲(chǔ)卷
hostPath:
# 節(jié)點(diǎn)的目錄
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
4.2、執(zhí)行
kubectl apply -f /root/efk/fluentd.yaml
# 查看
kubectl get pods -n kube-logging -o wide
kubectl get sa -n kube-logging
4.3、查看
4.3.1、查Fluentd 啟動(dòng)成功后,可以看到如下配置頁(yè)面
- 有個(gè)es索引:logstash-當(dāng)前時(shí)間
- 這里可以配置我們需要的 Elasticsearch 索引,前面 Fluentd 配置文件中我們采集的日志使用的是 logstash 格式,這里只需要在文本框中輸入logstash-*即可匹配到 Elasticsearch 集群中的所有日志數(shù)據(jù)
4.3.2、創(chuàng)建可視化索引
4.4、測(cè)試容器日志
4.4.1、腳本
vi /root/efk/pod.yaml
內(nèi)容
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: counter
image: busybox
imagePullPolicy: IfNotPresent
args: [/bin/sh, -c,'i=0; while i<100; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
4.4.2、執(zhí)行
kubectl apply -f /root/efk/pod.yaml
# 執(zhí)行一段時(shí)間就停掉
kubectl delete -f /root/efk/pod.yaml
4.4.3、查看
登錄到kibana的控制面板,在discover處的搜索欄中輸入kubernetes.pod_name:counter,這將過(guò)濾名為的Pod的日志數(shù)據(jù)counter,如下所示:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-629733.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-629733.html
5、總結(jié)
- 通過(guò)上面幾個(gè)步驟,我們已經(jīng)在k8s集群成功部署了elasticsearch,fluentd,kibana
- 內(nèi)容
- 3個(gè)Elasticsearch Pod
- 一個(gè)Kibana Pod
- 一組作為DaemonSet部署的Fluentd Pod。
5.1、要了解更多關(guān)于elasticsearch可參考
https://www.elastic.co/cn/blog/small-medium-or-large-scaling-elasticsearch-and-evolving-the-elastic-stack-to-fit
5.2、Kubernetes中還允許使用更復(fù)雜的日志系統(tǒng),要了解更多信息,可參考
https://kubernetes.io/docs/concepts/cluster-administration/logging/
到了這里,關(guān)于k8s--基礎(chǔ)--24.3--efk--安裝efk組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!