集群管理


日志架构

Pod 与容器日志

  1. 所有容器相关的运行日志,都以 stdout 和 stderr 的方式输出,并对日志进行 rotate。默认情况下,如果容器重新启动,kubelet 会保留一个终止容器的日志,如果该容器被驱逐,所对应的日志也会跟随。kubelet 配置文件中,containerLogMaxSize(default 10Mi),containerLogMaxFiles(default 5)。
  2. 系统组件的日志
    1. kubelet:linux 默认写入journald,使用journalctl -u kubelet查看
    2. 其他组件如果是以容器的方式运行,如 kube-proxy 等一些系统 Pod,在/var/log/pods中,日志目录命名方式[namespace][podname][poduid]

集群级日志架构

kubernetes 没有提供原生日志解决方案,但用户可以选择一些方式:

  1. 使用 DaemonSet 在每个节点部署日志代理
  2. 使用 Sidecar 专门收集容器日志
  3. 使用第三方后端记录日志

总之,日志的收集无论哪种方式怎么实现,都会有一定的损耗。

系统日志

Klog 示例

I1025 00:15:15.525108       1 httplog.go:79] GET /api/v1/namespaces/kube-system/pods/metrics-server-v0.3.1-57c75779f-9p8wg: (1.512ms) 200 [pod_nanny/v0.0.0 (linux/amd64) kubernetes/$Format 10.56.1.19:51756]
  1. 结构化日志
    <klog header> "<message>" <key1>="<value1>" <key2>="<value2>" <%+v>
    
  2. 上下文日志example
  3. JSON 日志格式,--logging-format=json
  4. 日志精细度级别,如-v=5,0 为 critical 事件
  5. 日志位置,在容器中的日志:/var/log/<pods/containers/servicename>/**/*.log(logrotate);不在容器中:写入 journald(系统日志工具)
  6. 日志查询,需开启NodeLogQuery(feature gate)

系统组件指标

http 访问路径,/metrics/*

启用隐藏指标:show-hidden-metrics-for-version

kube-scheduler

包含以下 label:

  1. namespace
  2. podname
  3. pod.spec.nodeName
  4. pod.spec.priority
  5. pod.spec.scheduleName
  6. pod.spec.resources.[*].[cpu|memory|volume]

指标顺序指定

--allow-label-value, --allow-metric-labels-manifest

Tracing Kubernetes 系统组件

  1. [OpenTelemetry 协议]
  2. w3c trace-context
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
  KubeletTracing: true
tracing:
  # 默认值
  #endpoint: localhost:4317
  samplingRatePerMillion: 100 # 如引发性能问题,可适当调整数值或关闭该项

kubernetes 中的 proxy

  1. kubectl proxy
  2. apiserver proxy
  3. kube proxy
    • 在每个节点上运行
    • 支持 UDP,TCP,SCTP
    • 提供负载均衡能力
    • 只用来访问 Service
  4. A Proxy/Load-balancer in front of apiserver(s)
  5. Cloud Load Balancers on external services