gcs-fuse-csi-driver Profiles Recommender sre ops guide
Profiles Recommender SRE 运维指南受众: SRE、平台运维工程师场景: 日志分析、故障排查、容量规划、告警配置1. 运维概览Profiles Recommender 运行在 CSI Node 插件DaemonSet内部在每次NodePublishVolumePod 挂载 GCS Bucket时执行。它不是独立进程无需单独部署或维护。关键特性:无状态每次调用独立计算无持久化数据失败安全推荐失败时 fallback 到用户原始挂载选项可观测每次推荐输出结构化 JSON 日志2. 日志格式与查询2.1 日志结构每次 Profiles Recommender 执行时输出一条 JSON 格式日志到 stdout绕过 klog 格式化{severity:INFO,message:GCSFuseCSIRecommendation: ... FileCache: 512MiB (ram) | MetadataStatCache: 64MiB | Expand for full details,target:{pvName:pvc-abc123,nodeName:gke-pool-1-xyz,podName:default/my-training-pod},inputSignals:{bucketTotalObjects:10000,bucketTotalDataSizeBytes:536870912000,bucketLocationType:multi-region,bucketHNSEnabled:false,requiredFileCacheBytes:536870912000,requiredMetadataStatCacheBytes:17000000,nodeType:gpu,nodeAllocatableMemoryBytes:274877906944,nodeAllocatableEphemeralStorageBytes:402653184000,nodeHasEphemeralStorageLSSD:true,sidecarLimitMemoryBytes:6442450944,sidecarLimitEphemeralStorageBytes:0,fuseBudgetMemoryBytes:4509715660,fuseBudgetEphemeralStorageBytes:342254906400},decision:{metadataStatCacheBytes:17000000,fileCacheBytes:342254906400,fileCacheMedium:lssd}}2.2 关键字段说明字段路径含义运维关注点target.pvName卷名关联到具体 PVtarget.nodeName节点名定位节点级问题target.podNamePod 名namespace/name 格式inputSignals.nodeType节点类型gpu / tpu / general_purposeinputSignals.fuseBudgetMemoryBytes内存预算若为 0 表示资源计算异常decision.fileCacheBytes推荐文件缓存0 表示被禁用decision.fileCacheMedium缓存介质ram / lssd / 空字符串2.3 日志查询示例# 查找所有文件缓存被禁用的挂载kubectl logs-lappgcsfuse-csi-node --all-containers|\grepGCSFuseCSIRecommendation|\jqselect(.decision.fileCacheBytes 0)# 查找 stat cache 被截断的情况kubectl logs-lappgcsfuse-csi-node --all-containers|\grepGCSFuseCSIRecommendation|\jqselect(.inputSignals.requiredMetadataStatCacheBytes .decision.metadataStatCacheBytes)# 按节点汇总推荐情况kubectl logs-lappgcsfuse-csi-node --all-containers|\grepGCSFuseCSIRecommendation|\jq-r.target.nodeName|sort|uniq-c|sort-rn3. 排障决策树无否是否 (ephemeral)是否是有否是是否是否Pod 挂载 GCS Bucket 失败或性能不符预期日志中有GCSFuseCSIRecommendation?推荐器未激活Feature Flag 已启用?启用 GCSFuseProfiles Feature Flag使用静态 PV?改用静态 PV 或放弃 ProfilesSC 有 profile label?添加 label: gke-gcsfuse/profile: true检查 PV/SC 是否能被 CSI 找到挂载成功?检查 Internal errorPV 缺少 bucket-scan-* 注解→ 等待 Scanner 或手动 override性能问题?fileCacheBytes 0?文件缓存被禁用原因: 桶太大/节点资源不足→ 增加 sidecar limit→ 或手动设 file-cache:max-size-mbstatCache required?stat cache 被截断→ 增加 sidecar memory limit→ 或减小 Bucket 对象数检查 gcsfuse 自身日志问题可能不在推荐器4. 常见故障及处理4.1 挂载失败PV 注解缺失现象:NodePublishVolume返回Internal错误日志关键词:missing required annotation处理步骤:检查 PV 注解kubectl getpvpv-name-ojsonpath{.metadata.annotations}|jq.确认 Bucket Scanner Controller 正常运行kubectl get pods-nkube-system-lappbucket-scanner临时解决手动添加 override 注解kubectl annotatepvpv-name\gke-gcsfuse/bucket-scan-statusoverride\gke-gcsfuse/bucket-scan-num-objects估算值\gke-gcsfuse/bucket-scan-total-size-bytes估算值\gke-gcsfuse/bucket-scan-location-typemulti-region\gke-gcsfuse/bucket-scan-hns-enabledfalse4.2 文件缓存始终被禁用现象:decision.fileCacheBytes 0排查方向:原因诊断方法解决Bucket 太大requiredFileCacheBytes远大于fuseBudgetMemoryBytes和fuseBudgetEphemeralStorageBytes增加 sidecar limit 或节点规格Zonal BucketbucketLocationType zonal预期行为zonal 延迟已足够低TPU 大 BucketnodeTypetpu 且 required memoryBudgetTPU 仅支持 RAM考虑减小数据集或手动指定节点无 Local SSDnodeHasEphemeralStorageLSSD false使用带 LSSD 的节点池4.3 Stat Cache 被截断导致性能下降现象: 大量stat操作延迟高诊断:# 对比 required vs actualjqselect(.inputSignals.requiredMetadataStatCacheBytes .decision.metadataStatCacheBytes) | {pod: .target.podName, required: .inputSignals.requiredMetadataStatCacheBytes, actual: .decision.metadataStatCacheBytes}解决: 增加 sidecar container 的 memory limit或降低fuseMemoryAllocatableFactor注意降低 factor 意味着给文件缓存更少空间。4.4 LSSD 检测失败现象: 节点有 Local SSD 但nodeHasEphemeralStorageLSSD false诊断:kubectl getnodenode-name-ojsonpath{.metadata.annotations.node\.gke\.io/last-applied-node-labels}检查输出中是否包含cloud.google.com/gke-ephemeral-storage-local-ssdtrue。若 GKE 版本更新了标注方式此检测可能失效。5. 容量规划5.1 资源预算公式effectiveLimit min(nodeAllocatable, sidecarLimit) budget effectiveLimit × allocatableFactor内存预算默认: 70% × min(节点可分配内存, sidecar memory limit)临时存储预算默认: 85% × min(节点可分配临时存储, sidecar ephemeral-storage limit)5.2 节点规划建议场景建议节点配置Sidecar Limit 建议小 Bucket (1GB, 10K 对象)任意memory: 512Mi中等 Bucket (1-100GB, 100K 对象)带 LSSD 节点memory: 2Gi, ephemeral: 100Gi大 Bucket (100GB, 1M 对象)高内存 LSSDmemory: 8Gi, ephemeral: 500GiTB 级 BucketLSSD 必须memory: 4Gi (stat only), ephemeral: 匹配桶大小5.3 多 Pod 同节点注意事项每个 Pod 独立计算预算不感知其他 Pod。若 10 个 Pod 落在同一节点有 sidecarLimit: 每 Pod 限于其 limit × factor安全无 sidecarLimit: 每 Pod 各自认为可用节点 70% 内存叠加可能 OOM建议: 始终为 gcsfuse sidecar 设置resources.limits。6. 告警建议告警名称条件严重级别说明ProfilesStatCacheCappedrequiredMetadataStatCacheBytes decision.metadataStatCacheBytesWarningstat cache 被截断可能影响 metadata 性能ProfilesFileCacheDisableddecision.fileCacheBytes 0且bucketLocationType ! zonalWarning非 zonal 桶文件缓存被禁用ProfilesBucketScanMissingNodePublishVolume Internal error 包含 “missing required annotation”CriticalBucket Scanner 可能故障ProfilesNoMediumFit日志包含 “no medium fits”Warning所有存储介质不足告警查询示例 (Cloud Logging)resource.typek8s_container resource.labels.container_namegcs-fuse-csi-driver jsonPayload.message~GCSFuseCSIRecommendation jsonPayload.decision.fileCacheBytes0 jsonPayload.inputSignals.bucketLocationType!zonal7. 监控指标当前推荐器不直接暴露 Prometheus 指标但可从结构化日志导出建议指标来源用途profiles_recommendation_total统计日志出现次数推荐器执行频率profiles_file_cache_disabled_totalfileCacheBytes 0缓存未命中追踪profiles_stat_cache_capped_totalrequired actual资源不足追踪profiles_medium_selected{mediumram|lssd}decision.fileCacheMedium介质使用分布8. RunbookRB-1: 批量 Pod 挂载失败Scanner 故障否是是否刚创建( 5min)已创建很久多个 Pod 挂载失败Internal error: missing annotation检查 Bucket Scanner PodScanner Running?重启 Scannerkubectl rollout restartScanner 日志有错误?修复 Scanner 问题(权限/网络)PV 创建时间?等待 Scanner 完成扫描手动 override 注解并提工单调查紧急恢复: 对所有受影响 PV 添加 override 注解恢复挂载。RB-2: 节点内存压力多 Pod 缓存争抢识别受影响节点kubectltopnodes|sort-k4-rn|head查看该节点上的推荐日志kubectl logs-nkube-systemcsi-node-pod|grepGCSFuseCSIRecommendation|\jqselect(.target.nodeName 问题节点) | {pod: .target.podName, memBudget: .inputSignals.fuseBudgetMemoryBytes, statCache: .decision.metadataStatCacheBytes, fileCache: .decision.fileCacheBytes}临时缓解降低fuseMemoryAllocatableFactor到 0.5或为 sidecar 添加/减少 memory limit长期方案分散 Pod 到更多节点使用 Pod Anti-Affinity 避免过度集中RB-3: 切换节点池后缓存策略异常当节点从 LSSD 节点池迁移到非 LSSD 节点池时推荐器可能从 LSSD 降级到 RAM 或直接禁用文件缓存。确认新节点的 LSSD 注解状态如需强制使用 RAM 缓存用户可手动设置file-cache:max-size-mb或在 StorageClass 中调整fuseFileCacheMediumPriority移除 lssd 选项9. 已知运维影响限制影响缓解措施单 Pod 预算独立多 Pod 同节点可能超配必须设 sidecar limitsLSSD 检测依赖注解GKE 升级可能破坏检测监控nodeHasEphemeralStorageLSSD字段无 Pod Event 警告缓存被截断时用户无法通过kubectl describe pod发现依赖日志告警大 Bucket 必然禁用 file cacheTB 级场景无法自动优化用户需手动 override 或升级硬件Bucket Scanner 依赖Scanner 故障导致挂载失败监控 Scanner 健康 override 作为后备