日志系統要求:
1.因開發項目要求,一個pod 內有多個日志路徑,需要收集
2.同時需要收集pod 容器的標准輸出日志
環境:
本次環境es、kibana 均部署在k8s 集群外,在物理機部署,只需要log-pilot 指定es 地址
具體步驟:
創建 daemonset log-pilot
kubectl get daemonsets.apps log-pilot -o yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
k8s-app: log-pilot
name: log-pilot
namespace: default
spec:
selector:
matchLabels:
k8s-app: log-es
template:
metadata:
labels:
k8s-app: log-es
spec:
containers:
- env:
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: PILOT_LOG_PREFIX
value: mytest #收集容器日志前綴標識,容器日志必須指定同一標識 mytest
- name: FILEBEAT_OUTPUT
value: elasticsearch #日志指定輸出位置為 es
- name: ELASTICSEARCH_HOST
value: 10.16.0.178 # es 地址
- name: ELASTICSEARCH_PORT
value: "9200" # es 端口
image: yzsjhl-evdc-node03.opi.com/tj/log-pilot:0.9.5-filebeatv01
imagePullPolicy: IfNotPresent
name: log-pilot
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/docker.sock
name: sock
- mountPath: /host
name: root
readOnly: true
- mountPath: /var/lib/filebeat
name: varlib
- mountPath: /var/log/filebeat
name: varlog
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /var/run/docker.sock
type: ""
name: sock
- hostPath:
path: /
type: ""
name: root
- hostPath:
path: /var/lib/filebeat
type: DirectoryOrCreate
name: varlib
- hostPath:
path: /var/log/filebeat
type: DirectoryOrCreate
name: varlog
updateStrategy:
rollingUpdate:
maxUnavailable: 1
type: RollingUpdate
創建應用容器deployments (java 項目),有三個日志路徑需要收集
$ kubectl get deployments.apps gateway-deploy -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: gateway
release: stabel
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: gateway
env: test
release: stabel
spec:
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: mytest_logs_gatewaystdout # 容器的標准輸出日志
value: stdout
- name: mytest_logs_gatewayaccesslogdir #第一個應用日志
value: /data/logs/service-gateway/access/*.log
- name: mytest_logs_gatewayauthlogdir #第二個應用日志
value: /data/logs/service-gateway/auth/*.log
- name: mytest_logs_gatewayrootlogdir #第三個應用日志
value: /data/logs/service-gateway/root/*.log
image: yzsjhl-evdc-node03.opi.com/renren-backend/gateway:20200519161529
imagePullPolicy: IfNotPresent
name: gateway
ports:
- containerPort: 8089
name: http1
protocol: TCP
- containerPort: 20007
name: http2
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: # 每個日志 emptyDir都需要掛載在容器日志的指定位置
- mountPath: /data/logs/service-gateway/access
name: gatewayaccess-logs
- mountPath: /data/logs/service-gateway/auth
name: gatewayauth-logs
- mountPath: /data/logs/service-gateway/root
name: gatewayroot-logs
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- emptyDir: {} # 每個日志路徑都需要指定一個 emptyDir
name: gatewayaccess-logs
- emptyDir: {}
name: gatewayauth-logs
- emptyDir: {}
name: gatewayroot-logs
另外一種寫法,比較便捷:
案例2:
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-base-server-deploy
namespace: rrzhibo
spec:
progressDeadlineSeconds: 600
replicas: 20
revisionHistoryLimit: 10
selector:
matchLabels:
app: user-base-server
release: stabel
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
prometheus.io/path: /actuator/prometheus
prometheus.io/port: "20002"
prometheus.io/scrape: "true"
creationTimestamp: null
labels:
app: user-base-server
env: pro
release: stabel
spec:
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: mytest_logs_live-user-base-root
value: /data/logs/user-base-server/root.log
- name: mytest_logs_live-user-base-common-error
value: /data/logs/user-base-server/common-error.log
- name: mytest_logs_live-user-base-common-info
value: /data/logs/user-base-server/common-info.log
- name: mytest_logs_live-user-base-gc
value: /data/logs/user-base-server/gc.log
- name: mytest_logs_live-user-base-kafka
value: /data/logs/user-base-server/kafka.log
- name: mytest_logs_live-user-base-scheduler
value: /data/logs/user-base-server/scheduler.log
- name: mytest_logs_live-user-base-servicecall
value: /data/logs/user-base-server/servicecall.log
- name: mytest_logs_live-user-base-sql
value: /data/logs/user-base-server/sql.log
image: yzsjhl-evdc-promaster03.opi.com/renren-backend/user-base-server:20210308154516
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- sh
- /data/check-live.sh
failureThreshold: 3
initialDelaySeconds: 13
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
name: user-base-server
ports:
- containerPort: 10002
name: http1
protocol: TCP
- containerPort: 20002
name: http2
protocol: TCP
readinessProbe:
exec:
command:
- sh
- /data/check-ready.sh
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 3
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: "4"
memory: 8Gi
requests:
cpu: 500m
memory: 2Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data/logs/user-base-server
name: all-logs
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 300
volumes:
- emptyDir: {}
name: all-logs
查看kibana,看是否收集到日志: