一:痛點
在部署完成後 雖然我們能正常的運行我們的服務了 。 但是我們查看日誌卻是一個很麻煩的事情 , 我們只能去容器當中查看已經打印好的日誌 。這很明顯非常的不友好 , 而且容器中的日誌肯定要定時刪除的 。 不利於我們日後去查找對應的日誌
二:解決方案
目前很主流的是elk的解決方案 , 但是 l 卻有很多不同 這裏我使用的是 aliyun的 log-pilot
log-pilot 官方文檔 這上面有很詳細的解釋 以及 log-pilot 的優點
三 :部署
新建 vi external-es.yaml
apiVersion: v1
kind: Service
metadata:
name: external-es
namespace: ms
spec:
ports:
- port: 80
---
apiVersion: v1
kind: Endpoints
metadata:
# 和 svc 相同的名稱
name: external-es
namespace: ms
subsets:
- addresses:
# es 端口
- ip: 192.168.233.129
# 還要指定端口號
ports:
- port: 9200
新建 log-pilot.yml 這裏有幾個地方 需要注意
1 : apiVersion: apps/v1 這裏和 官方文檔有不同 是應爲我的 kubenates 的版本是v1.16.0 這裏需要注意自己的版本號
2 : apps/v1 對應的 selector 是必填選項 。 所以在這裏需要配置一個 selector 這兩個地方和官方文檔的不一樣
3 : # 請確保集羣到ES網絡可達 - name: "ELASTICSEARCH_HOSTS" value: "192.168.233.129:9200" 在這個位置我使用的是 我另一臺服務器上的 es 單機 。 所以我需要一個 service 進行轉發 再一次使用到了 endpoint
所以 新建 vi external-es.yaml 在去新建 log-pilot.yml
4 : 如果es 不會部署的 請參考 es 單機版部署
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-pilot
labels:
app: log-pilot
# 設置期望部署的namespace
namespace: kube-system
spec:
selector:
matchLabels:
app: log-pilot
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: log-pilot
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
# 是否允許部署到Master節點上
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: log-pilot
# 版本請參考https://github.com/AliyunContainerService/log-pilot/releases
image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat
resources:
limits:
memory: 500Mi
requests:
cpu: 200m
memory: 200Mi
env:
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: "LOGGING_OUTPUT"
value: "elasticsearch"
# 請確保集羣到ES網絡可達
- name: "ELASTICSEARCH_HOSTS"
value: "192.168.233.129:9200"
# 配置ES訪問權限
#- name: "ELASTICSEARCH_USER"
# value: "{es_username}"
#- name: "ELASTICSEARCH_PASSWORD"
# value: "{es_password}"
volumeMounts:
- name: sock
mountPath: /var/run/docker.sock
- name: root
mountPath: /host
readOnly: true
- name: varlib
mountPath: /var/lib/filebeat
- name: varlog
mountPath: /var/log/filebeat
- name: localtime
mountPath: /etc/localtime
readOnly: true
livenessProbe:
failureThreshold: 3
exec:
command:
- /pilot/healthz
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationGracePeriodSeconds: 30
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
- name: root
hostPath:
path: /
- name: varlib
hostPath:
path: /var/lib/filebeat
type: DirectoryOrCreate
- name: varlog
hostPath:
path: /var/log/filebeat
type: DirectoryOrCreate
- name: localtime
hostPath:
path: /etc/localtime
啓動
kubectl apply -f log-pilot.yml
daemonset.extensions "log-pilot" created
kubectl -n kube-system get pod -o wide | grep log-pilot
log-pilot-892d5 1/1 Running 0 11h 10.100.3.40 k8s-node2 <none> <none>
log-pilot-krmcg 1/1 Running 0 11h 10.100.4.65 k8s-node1 <none> <none>
log-pilot-r5lnf 1/1 Running 0 11h 10.100.11.199 k8s-master <none> <none>
log-pilot-wqm6p 1/1 Running 0 11h 10.100.12.7 k8s-node3 <none> <none>
這個時候 log-pilot 就部署完成了
這個時候我們以 cloud-auth項目爲例 對auth的資源清單進行修改
vi cloud-auth.yaml
apiVersion: v1
kind: Service
metadata:
name: cloud-auth
namespace: ms
spec:
ports:
- name: cloud-auth
port: 8020
selector:
project: ms
app: cloud-auth
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud-auth
namespace: ms
spec:
replicas: 1
selector:
matchLabels:
project: ms
app: cloud-auth
template:
metadata:
labels:
project: ms
app: cloud-auth
spec:
volumes:
- name: cloud-auth-log
emptyDir: {}
containers:
- name: cloud-auth
image: registry.cn-hangzhou.aliyuncs.com/sdongp-dkz/cloud-auth:1.0-SNAPSHOT
env:
# 1、stdout爲約定關鍵字,表示採集標準輸出日誌
# 2、配置標準輸出日誌採集到ES的catalina索引下
- name: aliyun_logs_catalina
value: "stdout"
# 1、配置採集容器內文件日誌,支持通配符
# 2、配置該日誌採集到ES的access索引下
- name: aliyun_logs_access
value: "/home/cloud/cloud-auth/*.log"
# 容器內文件日誌路徑需要配置emptyDir
volumeMounts:
- name: cloud-auth-log
mountPath: /home/cloud/cloud-auth
ports:
- name: http
containerPort: 8010
字段解釋
stdout :這是容器對日誌的一種輸出格式 不需要太去在意 , 有興趣的可以去搜索一下
aliyun_logs_catalina : 這是新建一個 catalina 的索引 待會部署完成後 去查看 es 就能看到
aliyun_logs_access : 這是新建一個 access的索引 待會部署完成後 去查看 es 就能看到
/home/cloud/cloud-auth/*.log : 因爲我在springboot 的項目中配置的日誌路徑 。實際上我們可以進入容器查看 。這裏的意思是拉取cloud-auth 文件夾下所有的 .log 的文件
# 進入容器
kubectl exec -ti cloud-auth-848c4ccdf7-kn4qz -n ms -- /bin/sh
# 查看
vi /home/cloud/cloud-auth/cloud-auth.log
通過這樣的部署我們的 E 和 L 部分就以及部署好了 使用 elasticHD 查看索引 這個時候已經有兩個索引了 。這就是 log-pilot 幫我們拉取是日誌索引 ElasticHD github 地址
接下來使用 kibana 去正式查看日誌
kibana 下載地址 切記kibana一定要和 es 的版本一致 不然會啓動失敗
kibana windows 安裝教程 因爲去linux 安裝麻煩直接使用windows 版本了
kibana使用
新建 access-* 和 catalina-* access-*是從你自己的項目打印的日誌的索引 catalina-* 是容器日誌的索引
選擇對應的索引 查看日誌
這個時候使用 postman 訪問
這是在容器中 打印的日誌
這是在 kibana中通過es 看到的日誌
這個時候除了時間對應不上 其他的都是ok的這裏貌似pod的時間有一些問題
這樣es 就能夠進行日誌收集了