第一章:Go日志与监控埋点设计规范总纲
日志与监控埋点是可观测性体系的基石,其设计质量直接影响故障定位效率、系统健康评估精度及性能瓶颈识别能力。在Go生态中,统一规范可避免日志格式混乱、指标语义模糊、埋点遗漏或冗余等问题,为SRE、开发与产品团队提供一致的数据契约。
核心设计原则
- 语义明确:日志字段名使用
snake_case(如request_id,http_status_code),禁止缩写歧义(如req_id→request_id);监控指标命名遵循namespace_subsystem_metric_name{labels}模式(如app_http_request_duration_seconds{method="GET",status="200"})。 - 分级可控:日志级别严格遵循
DEBUG/INFO/WARN/ERROR/FATAL五级,生产环境默认启用INFO及以上,DEBUG仅限调试开关动态启用。 - 上下文贯穿:所有日志与指标必须携带
trace_id和span_id(通过 OpenTelemetry Context 透传),确保链路可追溯。
埋点实施要求
使用 go.opentelemetry.io/otel 进行标准化埋点,禁止直接调用底层 SDK。HTTP 服务需在中间件层自动注入以下基础指标:
// 初始化全局 Meter(示例)
import "go.opentelemetry.io/otel/metric"
meter := otel.Meter("app/http") // 命名空间统一为 "app/{service}"
httpDuration, _ := meter.Float64Histogram(
"http.request.duration", // 指标名
metric.WithDescription("HTTP request duration in seconds"),
metric.WithUnit("s"),
)
// 在 handler 中记录:httpDuration.Record(ctx, elapsed.Seconds(), metric.WithAttributes(
// attribute.String("http.method", r.Method),
// attribute.Int("http.status_code", statusCode),
// ))
日志结构规范
所有结构化日志必须为 JSON 格式,包含固定字段:time, level, msg, trace_id, span_id, service_name。推荐使用 uber-go/zap 配合 zapcore.AddSync(os.Stdout) 输出,并通过 zap.Stringer 等接口确保自定义类型可序列化。
| 字段 | 类型 | 必填 | 示例值 |
|---|---|---|---|
time |
string | 是 | "2024-06-15T10:30:45.123Z" |
service_name |
string | 是 | "user-service" |
trace_id |
string | 是 | "a1b2c3d4e5f67890..." |
第二章:结构化日志设计规范
2.1 日志字段标准化:Level、Timestamp、TraceID、SpanID、ServiceName 等核心字段定义与序列化约束
日志字段标准化是可观测性的基石,确保跨服务、跨组件的日志可检索、可关联、可聚合。
核心字段语义与约束
Level:必须为大写枚举值(DEBUG/INFO/WARN/ERROR/FATAL),禁止自定义字符串;Timestamp:ISO 8601 格式(2024-05-20T14:23:18.123Z),毫秒级精度,强制 UTC 时区;TraceID与SpanID:符合 W3C Trace Context 规范,16 字节十六进制字符串(32 位),TraceID全局唯一,SpanID在 trace 内唯一;ServiceName:小写字母、数字、短横线组合(正则^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$),长度 ≤ 64 字符。
JSON 序列化示例与校验逻辑
{
"level": "ERROR",
"timestamp": "2024-05-20T14:23:18.123Z",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"span_id": "00f067aa0ba902b7",
"service_name": "order-service"
}
该结构满足:① 字段名全小写蛇形命名;② trace_id 和 span_id 长度严格为 32/16 字符;③ timestamp 无本地时区偏移;④ level 值域受白名单控制——任意越界将触发序列化失败并返回 400 Bad Request。
| 字段 | 类型 | 必填 | 格式示例 |
|---|---|---|---|
level |
string | 是 | "ERROR" |
timestamp |
string | 是 | "2024-05-20T14:23:18.123Z" |
trace_id |
string | 否 | "4bf92f3577b34da6a3ce929d0e0e4736" |
span_id |
string | 否 | "00f067aa0ba902b7" |
service_name |
string | 是 | "payment-gateway" |
2.2 日志上下文传递机制:基于 context.Context 的键值对注入与跨 Goroutine 安全传播实践
在分布式请求链路中,需将 traceID、userID 等标识贯穿整个调用栈。context.Context 是 Go 唯一原生支持跨 Goroutine 安全传递数据的机制。
键值对注入:类型安全的上下文增强
使用 context.WithValue() 注入日志上下文,必须使用自定义未导出类型作为 key,避免冲突:
type ctxKey string
const logCtxKey ctxKey = "log-context"
ctx := context.WithValue(parent, logCtxKey, map[string]string{
"trace_id": "tr-abc123",
"user_id": "u-789",
})
✅
ctxKey是未导出类型,确保 key 全局唯一;❌ 不可用string直接作 key。值为不可变 map,防止并发写 panic。
跨 Goroutine 安全传播原理
context.Context 是不可变(immutable)结构体,每次派生新 context 都返回新实例,天然线程安全:
graph TD
A[main goroutine] -->|ctx passed by value| B[http handler]
B -->|ctx passed to goroutine| C[DB query]
B -->|ctx passed to goroutine| D[cache lookup]
C & D --> E[log.WithContext(ctx).Info("query done")]
常见陷阱对照表
| 场景 | 风险 | 推荐做法 |
|---|---|---|
| 在循环中复用同一 context 变量 | traceID 被覆盖 | 每次 goroutine 启动前 context.WithValue() 新建 |
使用 context.Background() 替代传入 ctx |
上下文丢失 | 显式接收并透传 ctx context.Context 参数 |
日志库(如 zerolog、logrus)均提供 WithContext(ctx) 方法,自动提取并序列化 context 中的键值对。
2.3 日志采样与分级策略:按错误等级、业务域、QPS 动态采样算法及 zap/slog 实现示例
日志爆炸常源于高频低价值请求。需构建多维动态采样策略:错误等级优先保留(ERROR/WARN 全量)、业务域差异化阈值(支付域采样率 1%,搜索域 0.1%)、QPS 自适应调节——当接口 QPS > 1000 时,自动启用指数退避采样。
动态采样核心逻辑
func DynamicSample(ctx context.Context, biz string, level zapcore.Level, qps float64) bool {
baseRate := map[string]float64{"pay": 1.0, "search": 0.1}[biz]
if level >= zapcore.WarnLevel { return true } // 错误级强制不采样
rate := baseRate * math.Max(0.01, 1000/qps) // QPS 越高,采样率越低
return rand.Float64() < rate
}
baseRate设定业务基线;1000/qps实现反比调节——QPS=5000 时 rate=0.02;math.Max防止归零;WARN 及以上直接跳过采样。
采样策略对照表
| 维度 | 低频场景(QPS | 高峰场景(QPS>5000) |
|---|---|---|
| 支付域INFO | 100% | 1% |
| 搜索域INFO | 10% | 0.02% |
zap 集成示例
core := zapcore.NewCore(
encoder, sink,
zapcore.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.InfoLevel && DynamicSample(ctx, "search", lvl, getQPS())
}),
)
2.4 日志输出格式与编码规范:JSON Schema 兼容性要求、时间格式(RFC3339Nano)、敏感字段自动脱敏规则
JSON Schema 兼容性约束
日志结构必须满足预定义的 LogEvent Schema,核心字段包括 timestamp(必需,string)、level(enum)、message(string)和 context(object)。缺失或类型不符字段将被拒绝写入。
时间格式标准化
所有时间戳强制使用 Go 的 time.RFC3339Nano 格式(如 "2024-03-15T08:30:45.123456789Z"),确保时区明确、纳秒精度、可被 JSON Schema format: "date-time" 验证。
敏感字段自动脱敏规则
以下字段在序列化前自动掩码(保留首末字符,中间替换为 *):
user_id→u***dphone→138****1234id_card→110101******001X
{
"timestamp": "2024-03-15T08:30:45.123456789Z",
"level": "INFO",
"message": "Login succeeded",
"context": {
"user_id": "user_abc123def456",
"phone": "13812345678"
}
}
该 JSON 经脱敏后输出:
"user_id": "u***d"、"phone": "138****5678"。脱敏逻辑由logrus.Hook在Fire()中触发,基于正则白名单匹配键名,不依赖值内容语义。
| 字段名 | 原始示例 | 脱敏后 | 触发条件 |
|---|---|---|---|
user_id |
uid_789xyz |
u***d |
键名匹配正则 |
email |
a@b.com |
不脱敏 | 未列入白名单 |
2.5 日志生命周期治理:滚动策略、归档压缩、冷热分离及与 Loki/ELK 的对接契约
日志治理需兼顾可追溯性、存储成本与查询效率。核心在于建立端到端的生命周期契约。
滚动与压缩策略(Log4j2 示例)
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.gz">
<PatternLayout pattern="%d{ISO8601} [%t] %-5p %c{1} - %m%n"/>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100MB"/>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs/" maxDepth="1">
<IfFileName glob="app-*.gz" />
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
TimeBasedTriggeringPolicy 按日切分;SizeBasedTriggeringPolicy 防止单文件过大;Delete 块实现自动清理——7天前的 gzip 归档被安全移除。
冷热分离架构
| 层级 | 存储介质 | 保留周期 | 查询延迟 | 典型工具 |
|---|---|---|---|---|
| 热日志 | SSD/内存 | 72小时 | Loki (index+chunks) | |
| 温日志 | 对象存储 | 90天 | ~2s | MinIO + Promtail |
| 冷日志 | 归档磁带 | 7年 | 分钟级 | 自定义 Loader |
数据同步机制
graph TD
A[应用容器] -->|stdout/stderr| B(Promtail)
B --> C{Loki}
B -->|fallback| D[Filebeat]
D --> E[ELK Stack]
C --> F[(S3 归档)]
F --> G[冷数据查询网关]
对接契约要求:所有日志必须携带 cluster, service, env, trace_id 四个结构化标签,且时间戳统一为 RFC3339 格式。
第三章:OpenTelemetry 埋点适配规范
3.1 Tracing 埋点统一入口:HTTP/gRPC/DB/Cache 四大关键路径的 Span 创建时机与语义约定(W3C Trace Context 兼容)
为保障全链路可观测性,需在四大核心路径入口处自动创建符合 W3C Trace Context 规范的 Span,并统一注入语义化属性。
Span 创建时机约定
- HTTP:在请求进入 Server Handler 时(如
http.ServeHTTP入口),解析traceparent并生成server类型 Span - gRPC:在
UnaryServerInterceptor/StreamServerInterceptor首帧处理前完成 Span 初始化 - DB:于
sql.DB.QueryContext/ExecContext调用前,包装上下文并创建clientSpan - Cache:在
redis.Client.GetContext等方法执行前触发,标注cache.hit/miss属性
W3C 兼容语义字段表
| 字段 | 示例值 | 说明 |
|---|---|---|
span.kind |
"server" / "client" |
标识调用方向 |
http.method |
"GET" |
HTTP 方法(仅 HTTP/gRPC server) |
db.statement |
"SELECT * FROM users" |
归一化后的 SQL 模板 |
cache.key |
"user:123" |
缓存键(非原始值,经哈希脱敏) |
// 示例:HTTP 中间件自动注入 Span(基于 OpenTelemetry Go SDK)
func TracingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
// 从 traceparent 提取 trace_id/span_id,并创建 server span
span := trace.SpanFromContext(otel.GetTextMapPropagator().Extract(ctx, propagation.HeaderCarrier(r.Header)))
defer span.End() // 自动结束于 handler 返回前
next.ServeHTTP(w, r.WithContext(trace.ContextWithSpan(ctx, span)))
})
}
该中间件确保每个 HTTP 请求在服务端入口即建立 server Span,并继承上游 traceparent;span.End() 延迟至 handler 执行完毕,覆盖完整处理周期。所有 Span 默认携带 http.url、http.status_code 等标准语义属性,兼容 W3C 规范。
graph TD
A[Incoming Request] --> B{Protocol}
B -->|HTTP| C[HTTP Middleware]
B -->|gRPC| D[UnaryInterceptor]
B -->|DB| E[SQL Driver Wrapper]
B -->|Cache| F[Redis Client Hook]
C & D & E & F --> G[Create Span with W3C Context]
G --> H[Inject semantic attributes]
3.2 Metrics 埋点建模规范:命名空间(namespace.subsystem.metric_name)、指标类型(Counter/Gauge/Histogram)与标签维度正交设计
埋点建模需严格遵循三要素正交原则:命名空间定义归属边界,指标类型表达语义行为,标签维度承载可切片上下文。
命名空间结构化示例
# 推荐:层级清晰、无歧义、可路由
metrics.counter("app.api.auth.login_attempts",
tags={"env": "prod", "region": "cn-east-1"})
# ❌ 避免:含特殊字符、动态值混入命名空间
# "app.api.auth.login_attempts.user_123"
app.api.auth.login_attempts 中 app 是业务域,api 是子系统,login_attempts 是语义明确的指标名;动态标识(如 user_id)必须下沉至 tags,保障命名空间静态可枚举。
指标类型语义约束表
| 类型 | 适用场景 | 是否支持标签 | 累加性 |
|---|---|---|---|
| Counter | 请求总数、错误次数 | ✅ | ✅ |
| Gauge | 当前连接数、内存使用率 | ✅ | ❌ |
| Histogram | API 响应延迟分布 | ✅ | ✅ |
标签维度正交设计原则
- 标签必须满足低基数、高稳定性、业务可解释性
- 禁止将
namespace或metric_name中已表达的信息重复作为标签(如subsystem="api"与命名空间中api冗余)
graph TD
A[埋点调用] --> B{指标类型判断}
B -->|Counter| C[原子递增+标签聚合]
B -->|Gauge| D[瞬时快照+标签分组]
B -->|Histogram| E[分桶统计+标签多维切片]
3.3 Logs-to-Traces 关联标准:通过 trace_id 和 span_id 字段实现日志与链路的端到端可追溯性验证方案
核心字段注入规范
应用日志必须在结构化输出中显式携带 trace_id(全局唯一,通常为16字节十六进制字符串)和 span_id(当前执行单元ID,8字节)。二者需与 OpenTelemetry SDK 生成的链路上下文严格一致。
日志采样示例(JSON 格式)
{
"timestamp": "2024-05-20T08:32:15.123Z",
"level": "INFO",
"message": "Order processed successfully",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"span_id": "5e0c63257de34c92",
"service": "payment-service"
}
逻辑分析:
trace_id遵循 W3C Trace Context 规范(如00-4bf92f3577b34da6a3ce929d0e0e4736-5e0c63257de34c92-01中的第2段),span_id对应当前 span 的 ID(第3段),确保日志可被 Jaeger/Zipkin 等后端按 trace 精确聚合。
关联验证流程
graph TD
A[应用写入结构化日志] --> B{日志采集器提取 trace_id/span_id}
B --> C[转发至日志平台(如 Loki)]
C --> D[链路平台(如 Tempo)按 trace_id 查询 spans]
D --> E[前端统一展示日志+调用栈+指标]
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
trace_id |
string | 是 | 全局唯一,长度32字符 |
span_id |
string | 是 | 当前 span ID,长度16字符 |
service |
string | 推荐 | 用于多服务上下文过滤 |
第四章:SRE 强制执行保障体系
4.1 静态代码检查规则:基于 golangci-lint 插件集成日志字段完整性、trace 注入缺失、未命名 metric 标签等硬性拦截项
为保障可观测性基建质量,我们在 golangci-lint 中定制化集成了三类强校验规则:
- 日志字段完整性:强制
log.With()必须包含trace_id、service_name等上下文字段 - Trace 注入缺失检测:识别
http.Client.Do/grpc.Invoke等调用未携带context.WithValue(ctx, traceKey, ...) - Metric 标签命名规范:禁止
prometheus.NewCounterVec(...).WithLabelValues("foo")中使用无含义字面量
# .golangci.yml 片段
linters-settings:
govet:
check-shadowing: true
unused:
check-exported: true
nolintlint:
allow-leading-space: true
该配置启用语义级分析器,结合自研 logcheck 和 tracinglint 插件实现 AST 层字段路径追踪。
| 规则类型 | 拦截示例 | 错误等级 |
|---|---|---|
| 日志字段缺失 | log.Info("user created") |
error |
| Trace 未透传 | client.Get(ctx, "/api") |
error |
| Metric 标签未命名 | .WithLabelValues("v1") |
warning |
// ❌ 违规示例
metrics.RequestCount.WithLabelValues("v1").Inc()
// ✅ 正确写法:需绑定语义化标签名
metrics.RequestCount.WithLabelValues("payment_api").Inc()
上述校验在 CI 阶段直接 fail build,确保可观测性元数据从编码源头结构化注入。
4.2 运行时合规性验证:启动阶段自动校验 OTel SDK 初始化状态、Exporter 配置有效性及日志 encoder 兼容性
运行时合规性验证在应用启动瞬间执行三重健康探针,确保可观测性管道“开箱即用”。
校验流程概览
graph TD
A[启动钩子触发] --> B[SDK 初始化状态检查]
B --> C[Exporter 连接性与协议兼容性验证]
C --> D[Log Encoder 序列化能力测试]
D --> E[全部通过 → 启用采集;任一失败 → 拒绝启动并输出诊断上下文]
关键校验逻辑示例
# 启动时同步执行的合规性断言
assert otel_sdk.is_registered(), "OTel SDK 未完成全局注册"
assert exporter.endpoint.startswith("https://"), "Exporter endpoint 必须启用 TLS"
assert hasattr(encoder, "encode_record"), "Log encoder 缺失 encode_record 方法"
该代码块在 main() 或 ApplicationRunner 中早期调用:is_registered() 确保 TracerProvider 已被 trace.set_tracer_provider() 注册;endpoint 协议校验防止 HTTP 明文暴露敏感指标;encode_record 存在性检查保障结构化日志可序列化为 JSON/Protobuf。
常见不兼容组合速查表
| 组件 | 不兼容配置 | 后果 |
|---|---|---|
| OTLP Exporter | endpoint=http://localhost:4318 |
gRPC 连接拒绝 |
| JSON Log Encoder | level_field="levelno" |
日志级别字段类型错配 |
| Jaeger Exporter | service_name="" |
服务名为空导致上报丢弃 |
4.3 埋点可观测性基线:SLO 指标看板预置模板(如 error_rate_by_service、p99_latency_by_endpoint)、告警阈值推荐配置
预置看板核心指标模板
开箱即用的 Grafana 看板内置以下 SLO 关键视图:
error_rate_by_service(按服务维度的 5 分钟错误率)p99_latency_by_endpoint(按 HTTP 路径分组的 P99 延迟热力图)request_volume_by_status_code(状态码分布占比堆叠柱状图)
推荐告警阈值策略
| 指标 | 严重等级 | 阈值 | 触发周期 |
|---|---|---|---|
error_rate_by_service |
Critical | >1.5% for 5m | 连续3个采样窗口 |
p99_latency_by_endpoint |
Warning | >2s for /api/v1/order | 滚动10m均值 |
# alert-rules.yaml 示例(Prometheus Alertmanager)
- alert: HighErrorRateByService
expr: 100 * sum(rate(http_request_total{status=~"5.."}[5m])) by (service)
/ sum(rate(http_request_total[5m])) by (service) > 1.5
for: 5m
labels: {severity: "critical"}
annotations: {summary: "Service {{ $labels.service }} error rate >1.5%"}
该规则基于 PromQL 实时聚合,rate() 自动处理计数器重置,by (service) 保留服务维度标签;for: 5m 避免瞬时抖动误报,与 SLO 的“30 天内错误预算消耗 ≤ 0.1%”对齐。
4.4 版本演进兼容策略:日志 Schema 变更灰度流程、OTel API Major 版本升级迁移检查清单与回滚机制
日志 Schema 灰度变更流程
采用双写+影子消费模式,新旧 Schema 并行写入,通过 schema_version 字段标识:
# log_entry.yaml 示例(v2 新增 user_agent_family)
- timestamp: "2024-06-15T10:30:00Z"
schema_version: "2"
user_agent: "Mozilla/5.0..."
user_agent_family: "Chrome" # v2 新增字段
此设计使下游消费者可按
schema_version路由解析逻辑;user_agent_family默认为空字符串兼容 v1 消费者,避免解析失败。
OTel API 升级迁移检查清单
- ✅ 确认
otel-sdk与otel-collector版本协同支持 OpenTelemetry Protocol v1.4+ - ✅ 替换已废弃的
SpanBuilder.startSpan()→Tracer.spanBuilder().startSpan() - ✅ 校验
Resource构建方式是否从Resource.create()迁移至Resource.builder()
回滚机制
graph TD
A[检测指标突增] --> B{错误率 > 5%?}
B -->|是| C[自动切回旧 Collector 配置]
B -->|否| D[继续灰度放量]
C --> E[触发告警并归档当前 Schema diff]
| 检查项 | 工具 | 频次 |
|---|---|---|
| Schema 字段缺失率 | Prometheus + LogQL | 实时 |
| OTel Span 导出成功率 | OTel Collector metrics | 每分钟 |
第五章:附录与演进路线图
开源工具链清单(2024年Q3实测可用)
以下为本项目在Kubernetes 1.28+、Ubuntu 22.04 LTS及RHEL 9.3环境中完成CI/CD流水线验证的工具组合,全部通过GitOps方式纳管:
| 工具类别 | 名称 | 版本 | 部署模式 | 关键验证场景 |
|---|---|---|---|---|
| 配置管理 | Argo CD | v2.10.10 | Helm Chart部署 | 多集群灰度发布(含istio-canary策略注入) |
| 日志分析 | Loki + Promtail | v2.9.2 + v2.10.0 | StatefulSet+RBAC最小权限 | 容器日志字段提取(app=payment, env=prod) |
| 安全扫描 | Trivy Operator | v0.15.0 | OLM Operator Lifecycle Manager | CRD级镜像漏洞阻断(CVSS≥7.0自动拒绝部署) |
生产环境故障复盘案例:API网关超时雪崩
2024年6月12日14:23,某电商核心订单服务出现P99延迟突增至8.2s。根因定位过程如下:
- 通过
kubectl top pods -n gateway发现Envoy代理内存使用率达94% - 检查
kubectl get envoyfilter -n istio-system发现错误配置残留:timeout: 0s(应为timeout: 30s) - 使用
istioctl proxy-status确认23个Pod未同步最新xDS配置 - 修复后执行滚动重启:
kubectl rollout restart deploy/istio-ingressgateway -n istio-system
# 快速验证配置生效的Shell脚本(已集成至监控巡检Job)
curl -s http://istio-ingressgateway.istio-system.svc.cluster.local/healthz/ready | \
jq -r '.status' 2>/dev/null | grep -q "SERVING" && echo "✅ Gateway Ready" || echo "❌ Gateway Unhealthy"
三年技术演进路径(基于真实业务增长曲线)
graph LR
A[2024 Q4:单集群K8s+ArgoCD GitOps] --> B[2025 Q2:双活多集群+Cluster API自愈]
B --> C[2026 Q1:服务网格统一治理+eBPF加速网络策略]
C --> D[2026 Q4:AI驱动的容量预测引擎接入Prometheus Alertmanager]
style A fill:#4CAF50,stroke:#388E3C
style D fill:#2196F3,stroke:#0D47A1
硬件资源基线配置模板
所有生产节点严格遵循以下规格,经压测验证可支撑1200 TPS订单峰值:
- 控制平面节点:8C/32GB/512GB NVMe(RAID1),启用
--etcd-quorum-read=true - 数据面节点:16C/64GB/1TB SSD,内核参数优化:
net.core.somaxconn=65535&vm.swappiness=1 - 存储类配置示例(Ceph RBD):
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-rbd-sc-prod provisioner: rbd.csi.ceph.com parameters: clusterID: prod-ceph pool: ssd-pool imageFormat: "2" imageFeatures: layering
运维知识库索引(Confluence自动化同步)
/ops/k8s/troubleshooting/etcd-corruption-recovery.md:包含etcdctl snapshot restore完整回滚步骤及校验checksum命令/infra/network/cni-troubleshooting/calico-bpf-mode.md:Calico eBPF模式下tc filter show dev cali+抓包分析指南/security/compliance/cis-k8s-1.28-checklist.xlsx:对应CIS Kubernetes Benchmark v1.28.0的137项检查项执行记录(含Last Updated: 2024-08-01)
第三方依赖安全策略
所有镜像必须通过Harbor 2.8.3的CVE扫描策略,且满足以下任一条件方可推送至生产仓库:
- CVE-2023-XXXX系列漏洞修复版本(如glibc 2.37+)
- 使用
distroless基础镜像(gcr.io/distroless/static:nonroot) - 经过SBOM生成验证:
syft -o cyclonedx-json nginx:1.25.3 > sbom.json
