K8s 学习:常用命令 100 条(四)- 监控与日志
系列文章: K8s 命令实战指南
适用人群: SRE 工程师、运维工程师、DevOps 工程师
阅读时间: 18 分钟
前言
监控和日志是保障 Kubernetes 集群稳定运行的关键。本文介绍如何使用 kubectl 命令进行监控、日志收集和分析。
一、资源监控
1.1 节点资源监控
# 查看节点资源使用
kubectl top node
# 查看节点资源使用(JSON 格式)
kubectl top node -o json
# 查看节点详细信息
kubectl describe node <node-name>
# 查看节点资源分配
kubectl describe node <node-name> | grep -A 10 "Allocated resources"
# 查看节点条件
kubectl get nodes -o custom-columns='NAME:metadata.name,STATUS:status.conditions[?(@.type=="Ready")].status,CPU:status.capacity.cpu,MEMORY:status.capacity.memory'
# 查看节点容量
kubectl get node <node-name> -o jsonpath='{.status.capacity}'
# 查看节点可分配资源
kubectl get node <node-name> -o jsonpath='{.status.allocatable}'
# 持续监控节点资源
watch kubectl top node
使用场景:
- 监控节点资源使用
- 容量规划
- 节点负载分析
- 资源瓶颈识别
1.2 Pod 资源监控
# 查看 Pod 资源使用
kubectl top pod
# 查看指定命名空间的 Pod 资源
kubectl top pod -n <namespace>
# 查看所有命名空间的 Pod 资源
kubectl top pod --all-namespaces
# 按 CPU 使用排序
kubectl top pod --sort-by=cpu
# 按内存使用排序
kubectl top pod --sort-by=memory
# 查看 Pod 的容器资源使用
kubectl top pod <pod-name> --containers
# 查看资源请求和限制
kubectl get pod <pod-name> -o custom-columns='NAME:metadata.name,CPU_REQ:spec.containers[*].resources.requests.cpu,CPU_LIM:spec.containers[*].resources.limits.cpu,MEM_REQ:spec.containers[*].resources.requests.memory,MEM_LIM:spec.containers[*].resources.limits.memory'
# 持续监控 Pod 资源
watch kubectl top pod -l app=<app-name>
使用场景:
- 监控应用资源使用
- 性能分析
- 资源优化
- 容量规划
1.3 容器资源监控
# 查看容器资源使用
kubectl top pod <pod-name> --containers
# 查看所有容器资源
kubectl top pod --all-namespaces --containers
# 查看容器资源使用(排序)
kubectl top pod --all-namespaces --containers --sort-by=cpu
# 查看容器资源限制
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].resources}'
# 查看容器资源使用率
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].resources.requests}' | jq
使用场景:
- 容器级别监控
- 精细化资源管理
- 容器性能分析
- 多容器 Pod 监控
二、事件监控
2.1 集群事件
# 查看所有事件
kubectl get events
# 查看指定命名空间的事件
kubectl get events -n <namespace>
# 查看事件(排序)
kubectl get events --sort-by=.metadata.creationTimestamp
# 查看事件(监视模式)
kubectl get events --watch
# 查看事件(宽输出)
kubectl get events -o wide
# 查看事件(JSON 格式)
kubectl get events -o json
# 查看事件(YAML 格式)
kubectl get events -o yaml
# 按类型筛选事件
kubectl get events --field-selector type=Warning
kubectl get events --field-selector type=Normal
# 按原因筛选事件
kubectl get events --field-selector reason=FailedScheduling
kubectl get events --field-selector reason=OOMKilled
kubectl get events --field-selector reason=Pulling
# 按资源类型筛选
kubectl get events --field-selector involvedObject.kind=Pod
kubectl get events --field-selector involvedObject.kind=Node
kubectl get events --field-selector involvedObject.kind=Service
使用场景:
- 集群异常监控
- 调度问题排查
- 资源冲突识别
- 事件历史查询
2.2 资源事件
# 查看 Pod 事件
kubectl describe pod <pod-name> | grep -A 20 Events
# 查看 Deployment 事件
kubectl describe deployment <deployment-name> | grep -A 20 Events
# 查看 Service 事件
kubectl describe service <service-name> | grep -A 20 Events
# 查看 Node 事件
kubectl describe node <node-name> | grep -A 20 Events
# 查看特定资源的事件
kubectl get events --field-selector involvedObject.name=<resource-name>
# 查看特定 UID 的事件
kubectl get events --field-selector involvedObject.uid=<uid>
使用场景:
- 资源故障排查
- 事件追踪
- 问题定位
- 状态变更监控
三、日志收集
3.1 Pod 日志
# 查看 Pod 日志
kubectl logs <pod-name>
# 查看 Pod 日志(指定容器)
kubectl logs <pod-name> -c <container-name>
# 查看 Pod 日志(实时跟踪)
kubectl logs -f <pod-name>
# 查看 Pod 日志(最近 N 行)
kubectl logs --tail=100 <pod-name>
# 查看 Pod 日志(指定时间范围)
kubectl logs --since=1h <pod-name>
kubectl logs --since-time=2024-01-01T00:00:00Z <pod-name>
# 查看 Pod 日志(保存到文件)
kubectl logs <pod-name> > pod.log
# 查看前一个容器的日志(容器重启后)
kubectl logs <pod-name> --previous
# 查看所有容器的日志
kubectl logs <pod-name> --all-containers
# 查看多个 Pod 的日志(需要安装 stern)
stern <pod-name-pattern>
# 查看 Pod 日志(带时间戳)
kubectl logs <pod-name> --timestamps
# 查看 Pod 日志(限制字节数)
kubectl logs <pod-name> --limit-bytes=10000
使用场景:
- 应用日志查看
- 故障排查
- 性能分析
- 安全审计
3.2 系统日志
# 查看 kubelet 日志(SSH 到节点)
journalctl -u kubelet -f
# 查看容器运行时日志(SSH 到节点)
journalctl -u docker -f
journalctl -u containerd -f
# 查看系统日志(SSH 到节点)
tail -f /var/log/syslog
tail -f /var/log/messages
# 查看 kube-apiserver 日志
kubectl logs -n kube-system kube-apiserver-<node-name>
# 查看 kube-controller-manager 日志
kubectl logs -n kube-system kube-controller-manager-<node-name>
# 查看 kube-scheduler 日志
kubectl logs -n kube-system kube-scheduler-<node-name>
# 查看 etcd 日志
kubectl logs -n kube-system etcd-<node-name>
# 查看 kube-proxy 日志
kubectl logs -n kube-system kube-proxy-<node-name>
# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns
使用场景:
- 系统组件故障排查
- 集群级别问题诊断
- 安全审计
- 性能分析
3.3 审计日志
# 查看审计日志配置
cat /etc/kubernetes/audit/audit.yaml
# 查看审计日志文件
tail -f /var/log/kubernetes/audit.log
# 解析审计日志(JSON 格式)
cat /var/log/kubernetes/audit.log | jq .
# 筛选特定用户的操作
cat /var/log/kubernetes/audit.log | jq 'select(.user.username=="admin")'
# 筛选特定资源的操作
cat /var/log/kubernetes/audit.log | jq 'select(.objectRef.resource=="pods")'
# 筛选特定操作
cat /var/log/kubernetes/audit.log | jq 'select(.verb=="delete")'
# 筛选失败的操作
cat /var/log/kubernetes/audit.log | jq 'select(.responseStatus.code>=400)'
使用场景:
- 安全审计
- 操作追踪
- 合规检查
- 事件溯源
四、Prometheus 监控集成
4.1 部署 Prometheus
# 使用 Helm 部署 Prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/prometheus
# 查看 Prometheus Pod
kubectl get pods -n default -l app=prometheus
# 查看 Prometheus Service
kubectl get svc -n default -l app=prometheus
# 端口转发访问 Prometheus
kubectl port-forward svc/prometheus-server 9090:80
# 查看 Prometheus 配置
kubectl get configmap prometheus-server -o yaml
# 查看 Prometheus 规则
kubectl get configmap prometheus-server -o jsonpath='{.data.prometheus\.yml}'
使用场景:
- 监控系统部署
- 指标收集
- 告警配置
- 性能监控
4.2 查询 Prometheus 指标
# 访问 Prometheus API
kubectl port-forward svc/prometheus-server 9090:80
# 查询 CPU 使用率
curl 'http://localhost:9090/api/v1/query?query=rate(container_cpu_usage_seconds_total[5m])'
# 查询内存使用率
curl 'http://localhost:9090/api/v1/query?query=container_memory_usage_bytes'
# 查询网络流量
curl 'http://localhost:9090/api/v1/query?query=rate(container_network_receive_bytes_total[5m])'
# 查询 Pod 重启次数
curl 'http://localhost:9090/api/v1/query?query=increase(kube_pod_container_status_restarts_total[1h])'
# 查询节点资源
curl 'http://localhost:9090/api/v1/query?query=kube_node_status_capacity'
# 查询 PVC 使用量
curl 'http://localhost:9090/api/v1/query?query=kubelet_volume_stats_used_bytes'
使用场景:
- 指标查询
- 性能分析
- 容量规划
- 自动化监控
五、Grafana 可视化
5.1 部署 Grafana
# 使用 Helm 部署 Grafana
helm repo add grafana https://grafana.github.io/helm-charts
helm install grafana grafana/grafana
# 查看 Grafana Pod
kubectl get pods -l app.kubernetes.io/name=grafana
# 查看 Grafana Service
kubectl get svc -l app.kubernetes.io/name=grafana
# 获取 Grafana 密码
kubectl get secret grafana -o jsonpath="{.data.admin-password}" | base64 --decode
# 端口转发访问 Grafana
kubectl port-forward svc/grafana 3000:80
# 导入 Kubernetes Dashboard
# Dashboard ID: 315 (Kubernetes cluster monitoring)
# Dashboard ID: 6417 (Kubernetes cluster)
# Dashboard ID: 8588 (Kubernetes cluster)
使用场景:
- 监控可视化
- 仪表板管理
- 数据展示
- 团队协作
5.2 配置数据源
# 配置 Prometheus 数据源
kubectl create configmap grafana-datasources --from-file=datasources.yaml
# datasources.yaml 内容
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-datasources
data:
datasources.yaml: |
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server
access: proxy
isDefault: true
EOF
# 重启 Grafana
kubectl rollout restart deployment/grafana
使用场景:
- 数据源配置
- 多数据源管理
- 认证配置
- 权限管理
六、日志收集(EFK)
6.1 部署 EFK
# 部署 Elasticsearch
kubectl apply -f https://download.elastic.co/downloads/eck/2.0.0/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.0.0/operator.yaml
# 部署 Elasticsearch 集群
cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.0.0
nodeSets:
- name: default
count: 1
config:
node.store.allow_mmap: false
EOF
# 部署 Kibana
cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 8.0.0
count: 1
elasticsearchRef:
name: quickstart
EOF
# 部署 Fluentd(DaemonSet)
kubectl apply -f fluentd-daemonset.yaml
# 查看 EFK 组件
kubectl get elasticsearch,kibana,pods -l common.k8s.elastic.co/type=elasticsearch
使用场景:
- 集中式日志收集
- 日志搜索
- 日志分析
- 日志可视化
6.2 查询日志
# 访问 Kibana
kubectl port-forward svc/quickstart-kb-http 5601
# 获取 Kibana 密码
kubectl get secret quickstart-es-elastic-user -o jsonpath='{.data.elastic}' | base64 --decode
# 使用 Elasticsearch API 查询日志
curl -u "elastic:<password>" "http://localhost:9200/_search?q=error&pretty"
# 查询特定索引的日志
curl -u "elastic:<password>" "http://localhost:9200/logstash-*/_search?pretty"
# 查询特定时间范围的日志
curl -u "elastic:<password>" -X GET "http://localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"@timestamp": {
"gte": "now-1h"
}
}
}
}'
# 统计错误数量
curl -u "elastic:<password>" -X GET "http://localhost:9200/_count?q=level:error"
使用场景:
- 日志查询
- 日志分析
- 错误追踪
- 审计查询
七、告警配置
7.1 Prometheus 告警规则
# 创建告警规则 ConfigMap
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-alerts
data:
alerts.rules: |
groups:
- name: kubernetes-alerts
rules:
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 15 > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Pod {{ $labels.pod }} is crash looping"
description: "Pod {{ $labels.namespace }}/{{ $labels.pod }} is restarting {{ $value }} times per 15 minutes"
- alert: NodeNotReady
expr: kube_node_status_condition{condition="Ready",status="true"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Node {{ $labels.node }} is not ready"
description: "Node {{ $labels.node }} has been unready for more than 1 minute"
- alert: HighCPUUsage
expr: rate(container_cpu_usage_seconds_total[5m]) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage"
description: "Container {{ $labels.container }} in pod {{ $labels.pod }} is using high CPU"
- alert: HighMemoryUsage
expr: container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage"
description: "Container {{ $labels.container }} is using >90% of memory limit"
EOF
# 查看告警规则
kubectl get configmap prometheus-alerts -o yaml
# 查看告警状态
kubectl port-forward svc/prometheus-server 9090:80
curl http://localhost:9090/api/v1/alerts
使用场景:
- 异常告警
- 性能告警
- 资源告警
- 自定义告警
7.2 Alertmanager 配置
# 创建 Alertmanager 配置
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: alertmanager-config
type: Opaque
stringData:
alertmanager.yaml: |
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
smtp_auth_username: 'alertmanager@example.com'
smtp_auth_password: 'password'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'team@example.com'
send_resolved: true
EOF
# 部署 Alertmanager
kubectl apply -f alertmanager-deployment.yaml
# 查看 Alertmanager
kubectl get pods -l app=alertmanager
# 访问 Alertmanager UI
kubectl port-forward svc/alertmanager 9093:9093
使用场景:
- 告警通知
- 告警路由
- 告警静默
- 告警聚合
八、性能分析
8.1 性能基线
# 收集性能基线数据
kubectl top nodes > baseline-nodes.txt
kubectl top pods --all-namespaces > baseline-pods.txt
# 比较性能数据
diff baseline-nodes.txt current-nodes.txt
# 监控性能趋势
watch -n 5 'kubectl top nodes && echo "---" && kubectl top pods --all-namespaces | head -20'
# 导出性能数据(CSV 格式)
kubectl top nodes --no-headers | awk '{print $1","$2","$3}' > nodes-perf.csv
kubectl top pods --all-namespaces --no-headers | awk '{print $1","$2","$3","$4}' > pods-perf.csv
# 分析性能瓶颈
kubectl top pods --all-namespaces --sort-by=cpu | head -10
kubectl top pods --all-namespaces --sort-by=memory | head -10
使用场景:
- 性能基线建立
- 性能对比
- 趋势分析
- 瓶颈识别
8.2 资源优化
# 查看资源使用情况
kubectl top pod <pod-name> --containers
# 查看资源请求和限制
kubectl describe pod <pod-name> | grep -A 5 "Limits:\|Requests:"
# 调整资源请求和限制
kubectl set resources deployment/<deployment-name> --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi
# 查看资源配额
kubectl get resourcequota -n <namespace>
# 查看限制范围
kubectl get limitrange -n <namespace>
# 查看资源使用率
kubectl top pod <pod-name> --containers | awk '{if(NR>1) print $1, $2, $3, $4}'
使用场景:
- 资源优化
- 成本控制
- 性能调优
- 容量规划
九、总结
9.1 监控体系
指标收集(Prometheus)
↓
数据存储(Prometheus)
↓
可视化展示(Grafana)
↓
告警通知(Alertmanager)
9.2 日志体系
日志收集(Fluentd)
↓
日志存储(Elasticsearch)
↓
日志搜索(Elasticsearch)
↓
可视化展示(Kibana)
9.3 常用监控命令速查
| 场景 | 命令 |
|---|---|
| 节点资源 | kubectl top node |
| Pod 资源 | kubectl top pod |
| 容器日志 | kubectl logs <pod-name> |
| 系统日志 | journalctl -u kubelet -f |
| 集群事件 | kubectl get events |
| 审计日志 | cat /var/log/kubernetes/audit.log |
| 性能分析 | kubectl top pod --sort-by=cpu |
参考资料
作者: PaPaBot
发布时间: 2026-03-07
标签: #Kubernetes #K8s #DevOps #监控 #日志
本文属于《K8s 命令实战指南》系列文章第四篇
Views: 0
