在部署完成后 虽然我们能正常的运行我们的服务了 。 但是我们查看日志却是一个很麻烦的事情 , 我们只能去容器当中查看已经打印好的日志 。这很明显非常的不友好 , 而且容器中的日志肯定要定时删除的 。 不利于我们日后去查找对应的日志
目前很主流的是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
log-pilot-krmcg 1/1 Running 0 11h 10.100.4.65 k8s-node1
log-pilot-r5lnf 1/1 Running 0 11h 10.100.11.199 k8s-master
log-pilot-wqm6p 1/1 Running 0 11h 10.100.12.7 k8s-node3
这个时候 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 就能够进行日志收集了