K8s 学习:常用命令 100 条(四)- 监控与日志

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