k8s资源监控和日志管理

k8s资源监控和日志管理

k8s监控资源使用率


查看集群资源状态

# 查看master组件状态
kubectl get cs

# 查看node状态
kubectl get node

# 查看Apiserver代理的url
kubectl cluster-info

# 查看集群详细信息
kubectl cluster-info dump

# 查看资源的详情
kubectl describe 资源类型 资源名称
## 查看node的详细信息
### 可以查看该node的cpu,内存分配情况
kubectl describe node master

# 查看资源信息
kubectl get 资源类型 资源名称

# 查看资源的详细信息
kubectl get 资源类型 资源名称 -o wide # 查看基本信息,ip,所在node等
kubectl get 资源类型 资源名称 -o yaml # 以yaml格式输出详细信息

监控集群资源利用率

这个命令需要由metric-server服务提供数据,而这个服务默认没有安装,还需要手动部署下


安装metric-server服务

k8s资源监控和日志管理


metric-server服务工作原理:

kubectl top -> apiserver -> metric-server(pod) -> 所有节点kubelet(cadvisor指标接口) -> 所有容器资源利用率

使用yaml资源清单部署metric-server服务

下载yaml资源清单

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

修改资源清单,在containers:下添加- --kubelet-insecure-tls表示不验证证书

修改镜像为阿里云的地址

# 修改资源清单中的containers
## 修改镜像地址
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.5.2

## 添加忽略证书
- --kubelet-insecure-tls

k8s资源监控和日志管理


执行部署命令

kubectl apply -f components.yaml

检查是否部署成功

# 如果状态为True并且能返回数据,说明Metrics Server服务工作正常

## 检查metrics是否注册到apiservices,为True则注册成功
[root@master k8syaml]# kubectl get apiservices |grep metrics
v1beta1.metrics.k8s.io    kube-system/metrics-server   True        6m14s

## 查看节点上有无metrics数据,--raw是原始json格式
## 模拟请求/apis/metrics.k8s.io/v1beta1/nodes接口,看是否返回数据
[root@master k8syaml]# kubectl get --raw=/apis/metrics.k8s.io/v1beta1/nodes
{"kind":"NodeMetricsList","apiVersion":"metrics.k8s.io/v1beta1","metadata":{},"items":[{"metadata":{"name":"master","creationTimestamp":"2021-12-09T03:19:14Z","labels":{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"master","kubernetes.io/os":"linux","node-role.kubernetes.io/control-plane":"","node-role.kubernetes.io/master":"","node.kubernetes.io/exclude-from-external-load-balancers":""}},"timestamp":"2021-12-09T03:19:02Z","window":"10s","usage":{"cpu":"189579273n","memory":"1932332Ki"}},{"metadata":{"name":"node1","creationTimestamp":"2021-12-09T03:19:14Z","labels":{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node1","kubernetes.io/os":"linux"}},"timestamp":"2021-12-09T03:19:06Z","window":"20s","usage":{"cpu":"101784227n","memory":"1498876Ki"}}]}

使用kubectl top命令查看资源消耗

metric-server服务部署好之后,就可以正常使用kubectl top命令了

# 查看pod资源消耗
kubectl top po pod名 -n namespace名
[root@master k8syaml]# kubectl top po
NAME                          CPU(cores)   MEMORY(bytes)   
tomcatdemo-69b5598f69-4vzn6   2m           211Mi  

# 查看node资源消耗
kubectl top node node名 -n namespace名
[root@master k8syaml]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master   166m         8%     1869Mi          49%       
node1    98m          4%     1477Mi          38%   

管理k8s组件日志


k8s查看日志

# 查看pod日志
kubectl logs po pod名 -n namespace名称

# 查看deployment日志
kubectl logs deploy deploy名称 -n namespace名称

# 查看service日志
kubectl logs svc svc名称 -n namespace名称

管理k8s组件日志

k8s系统的组件日志

# 查看你systemd守护进程管理的组件日志
## kubelet是systemd方式运行的
journalctl -u kubelet

# 查看Pod部署的组件日志
## k8s的其他组件都是pod运行的
kubectl logs kube-proxy-xxx -n kube-system
## 持续查看日志
kubectl logs -f kube-proxy-xxx -n kube-system

# 进入pod的终端内查看日志
kubectl exec -ti pod名称 -- bash
# 输出pod中容器的日志(stdout,pod中有多个容器的情况下使用)
kubectl logs my-pod -c 容器名
kubectl -f logs my-pod -c 容器名

# 查看OS日志
tail /var/log/messages
# 持续查看OS日志
tail -f /var/log/messages

kubectl logs查看日志原理

kubectl logs (获取容器标准输出的日志) -> apiserver -> kubelet -> docker(接管容器标准输出并写入文件中持久化保存) -> 获取某个容器的日志

# 标准输出在宿主机的路径:
/var/lib/docker/containers/容器id/容器id-json.log

# 想要查看该日志文件
## 先通过pod名称查询容器id
docker ps|grep pod名称
## 进入该容器id的目录
cd /var/lib/docker/containers/容器id/
## 查看该容器id的log
cat 容器id-json.log	# 防止文件过大打不开,可以使用less 容器id-json.log

管理k8s应用日志

k8s Cluster里面部署的应用程序日志


收集k8s日志思路

k8s资源监控和日志管理


收集标准输出

# 针对标准输出
以DaemonSet方式在每个Node上部署一个日志收集程序,采集/var/lib/docker/containers/目录下所有容器日志

收集容器中日志文件

# 针对容器中日志文件
在Pod中增加一个容器运行日志采集器,使用emtyDir共享日志目录,让日志采集器读取都日志文件
上一篇:让kubectl输出颜色,方便阅读


下一篇:细说mysql replace into