集群管理
日志架构
Pod 与容器日志
- 所有容器相关的运行日志,都以 stdout 和 stderr 的方式输出,并对日志进行 rotate。默认情况下,如果容器重新启动,kubelet 会保留一个终止容器的日志,如果该容器被驱逐,所对应的日志也会跟随。kubelet 配置文件中,
containerLogMaxSize
(default 10Mi),containerLogMaxFiles
(default 5)。 - 系统组件的日志
- kubelet:linux 默认写入
journald
,使用journalctl -u kubelet
查看 - 其他组件如果是以容器的方式运行,如 kube-proxy 等一些系统 Pod,在
/var/log/pods
中,日志目录命名方式[namespace][podname][poduid]
- kubelet:linux 默认写入
集群级日志架构
kubernetes 没有提供原生日志解决方案,但用户可以选择一些方式:
- 使用 DaemonSet 在每个节点部署日志代理
- 使用 Sidecar 专门收集容器日志
- 使用第三方后端记录日志
总之,日志的收集无论哪种方式怎么实现,都会有一定的损耗。
系统日志
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]
- 结构化日志
<klog header> "<message>" <key1>="<value1>" <key2>="<value2>" <%+v>
- 上下文日志,example
- JSON 日志格式,
--logging-format=json
- 日志精细度级别,如
-v=5
,0 为 critical 事件 - 日志位置,在容器中的日志:
/var/log/<pods/containers/servicename>/**/*.log
(logrotate);不在容器中:写入 journald(系统日志工具) - 日志查询,需开启
NodeLogQuery
(feature gate)
系统组件指标
http 访问路径,/metrics/*
;
启用隐藏指标:show-hidden-metrics-for-version
kube-scheduler
包含以下 label:
- namespace
- podname
- pod.spec.nodeName
- pod.spec.priority
- pod.spec.scheduleName
- pod.spec.resources.[*].[cpu|memory|volume]
指标顺序指定
--allow-label-value
, --allow-metric-labels-manifest
Tracing Kubernetes 系统组件
- [OpenTelemetry 协议]
- w3c trace-context
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
KubeletTracing: true
tracing:
# 默认值
#endpoint: localhost:4317
samplingRatePerMillion: 100 # 如引发性能问题,可适当调整数值或关闭该项
kubernetes 中的 proxy
- kubectl proxy
- apiserver proxy
- kube proxy
- 在每个节点上运行
- 支持 UDP,TCP,SCTP
- 提供负载均衡能力
- 只用来访问 Service
- A Proxy/Load-balancer in front of apiserver(s)
- Cloud Load Balancers on external services