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格式输出详细信息
kubectl get cs显示scheduler Unhealthy,controller-manager Unhealthy
参考: https://blog.csdn.net/m0_47219942/article/details/115231303
解决办法
:
将/etc/kubernetes/manifests/kube-scheduler.yaml
和/etc/kubernetes/manifests/kube-controller-manager.yaml
这两个配置文件中–port注释掉.
然后重启kubelet服务
即可.
# 重启kubelet服务
systemctl restart kubelet
监控集群资源利用率
这个命令需要由
metric-server服务
提供数据,而这个服务默认没有安装,还需要手动部署下
metric-server
项目地址: https://github.com/kubernetes-sigs/metrics-server
安装metric-server服务
安装了metric-server
服务才能执行kubectl top
命令.
metric-server服务工作原理:
- 用户发送 kubectl top 命令到 API Server。
- API Server 将请求转发给 Metric Server。
- Metric Server 监听 Kubernetes 中所有节点上的 Kubelet 的 cadvisor 指标接口。
- Kubelet 收集每个容器的资源使用率数据并将其发送到 cadvisor。
- cadvisor 将数据发送给 Kubelet,然后 Kubelet 将其汇报给 Metric Server。
- Metric Server 整理数据并将其返回给 API Server。
- API Server 再将数据返回给用户,用户就可以看到所有容器的资源利用率了。
kubectl top
-> apiserver
–> metric-server(pod)
–> 所有节点kubelet(cadvisor指标接口)
–> 所有容器资源利用率
使用yaml资源清单部署metric-server服务
项目地址:https://github.com/kubernetes-sigs/metrics-server
# 下载yaml资源清单
wget https://ghproxy.com/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
修改资源清单–(必须执行)
验证证书
的部署方法: https://blog.csdn.net/zorsea/article/details/105037533
找到 container
下的 args
部分,添加以下行:
# 不验证证书
- --kubelet-insecure-tls
可选:修改yaml
中镜像为阿里云的地址
# 修改资源清单中的containers
## 修改镜像地址
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.5.2
## 忽略证书
- --kubelet-insecure-tls
在 spec
下,添加如下参数:
https://linux.cn/article-15714-1.html
# 非必需参数
hostNetwork: true
执行部署命令
# apply资源清单
kubectl apply -f components.yaml
检查是否部署成功-(必须执行
)
# 如果状态为True并且能返回数据,说明Metrics Server服务工作正常
## 检查metrics是否注册到apiservices,为True则注册成功
kubectl get apiservices |grep metrics
## 查看节点上有无metrics数据,--raw是原始json格式
## 模拟请求/apis/metrics.k8s.io/v1beta1/nodes接口,看是否返回数据
kubectl get --raw=/apis/metrics.k8s.io/v1beta1/nodes
使用kubectl top命令查看资源消耗
metric-server服务部署好之后,就可以正常使用
kubectl top
命令了
# 查看pod资源消耗
kubectl top po pod名 -n namespace名
kubectl top po
# 查看node资源消耗
kubectl top node node名 -n namespace名
kubectl top node
资源占用排序-根据cpu
# 根据cpu占有率排序查看所有pod
## -A 所有
## -l 指定匹配标签
kubectl top pod -A -l app=flannel --sort-by=cpu
管理k8s组件日志
k8s查看日志
# 查看pod日志
kubectl logs po pod名 -n namespace名称
# 获取容器实例的 pod 日志(标准输出)
kubectl logs my-pod --previous
# 流式输出 Pod 的日志(标准输出)
kubectl logs po pod名 -n namespace名称 -f
# 获取含 name=myLabel 标签的 Pods 的日志(标准输出)
kubectl logs -l name=myLabel
# 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出)
kubectl logs -f -l name=myLabel --all-containers
查看集群中不是完全运行状态的pod
# 列出 Kubernetes 集群中所有不是完全运行状态的 Pods
## 1/1, 2/2, 3/3, 4/4, 5/5, 6/6: 这些通常表示 Pod 中的容器数量/期望的容器数量,比如 1/1 表示一个容器正在运行,并且只有一个容器是期望运行的,因此 Pod 状态是好的。
## Com: 这可能是用于匹配 "Completed" 状态的 Pods 的缩写。
## NAME: 可能用于排除输出中的表头行。
kubectl get pods -A -o wide |grep -vE "1/1|2/2|3/3|4/4|5/5|6/6|Com|NAME"
查看deployment日志
# 查看deployment日志
kubectl logs deploy deploy名称 -n namespace名称
kubectl logs -f deploy/my-deployment -n namespace名称
# 获取一个Deployment的Pod的日志(多容器例子)
kubectl logs deploy/my-deployment -c my-container
kubectl logs -f deploy/my-deployment -c my-container
查看service日志
# 查看service日志
kubectl logs svc svc名称 -n namespace名称
kubectl logs svc/服务名
进入pod的容器内查看日志
# 挂接到一个运行的容器中
kubectl attach my-pod -i
# 进入pod的终端内查看日志
kubectl exec -ti pod名称 -- bash
# 查看容器内主进程id
# 查看指定pid的输出
## 1 = stdout, 2 = stderr
tail /proc/<pid>/fd/1
# 输出pod中容器的日志(stdout,pod中有多个容器的情况下使用)
# 获取 Pod 容器的日志(标准输出, 多容器场景)
kubectl logs my-pod -c 容器名
# 流式输出 Pod 容器的日志(标准输出, 多容器场景)
kubectl -f logs my-pod -c 容器名
管理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
# 从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日志思路
收集标准输出
针对标准输出
;
以DaemonSet
方式在每个Node上部署一个日志收集程序
,采集/var/lib/docker/containers/
目录下所有容器日志
收集容器中日志文件
针对容器中日志文件
;
在Pod
中增加一个容器运行日志采集器
,使用emtyDir
共享日志目录
,让日志采集器
读取日志文件
.
k8s查看节点状态失败
参考: https://www.cnblogs.com/dudu/p/12146344.html
需要安装Prometheus
监控组件
才能使用kubectl get pods -n monitoring
命令
k8s部署prometheus监控
官方网站 https://prometheus.io/
官方文档 https://prometheus.io/docs/introduction/overview/
https://github.com/prometheus-operator/kube-prometheus
# clone项目
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
# apply
kubectl apply --server-side -f manifests/setup
# apply
kubectl apply -f manifests/
# 查看部署是否成功
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
# 查看节点状态
kubectl get pods -n monitoring