题干与适用场景
节点已经缓存私有镜像时,Kubernetes 是否仍应验证 imagePullSecrets?如何选择验证策略并安全上线?这道后端题考察容器运行时、凭证生命周期和多租户隔离。假设集群使用 IfNotPresent,不同命名空间可能访问同一节点,镜像仓库支持短期凭证,且不能因为安全策略让正常发布在大范围内同时失效。
面试官考察点
- 能否指出“本地有镜像”与“当前工作负载有权使用镜像”是两个不同判断。
- 能否解释 kubelet 如何记录成功拉取与凭证的关系,以及预加载镜像为什么需要单独处理。
- 能否比较
NeverVerify、NeverVerifyPreloadedImages、allowlist 和AlwaysVerify的风险与代价。 - 能否处理凭证轮换、节点重启、缓存记录丢失、仓库不可用和回滚问题。
回答前需要澄清的问题
先确认威胁模型:节点是否多租户、镜像是否包含敏感代码、攻击者是否可能创建 Pod。再确认镜像由 kubelet 拉取还是节点启动前预加载,凭证是 Pod Secret、节点凭证还是服务账号令牌。询问凭证轮换时是否必须立即撤销旧授权、仓库是否允许离线验证,以及集群能承受多大的重新拉取流量。最后确认目标是兼容旧行为、加强隔离,还是为高敏感命名空间使用更强策略。
30 秒回答框架
“我会把镜像缓存命中和授权验证分开。多租户或高敏感镜像不应因为节点缓存就绕过 imagePullSecrets。先启用凭证记录并选择默认的预加载镜像例外,再按节点和命名空间灰度到 AlwaysVerify;用成功启动率、重新拉取比例、仓库延迟、凭证轮换生效时间和跨租户拒绝率设护栏。必须预留缓存记录迁移、仓库故障降级和关闭 feature gate 的回滚路径。”
分步骤深入解答
- 分离两个判定:缓存只回答“字节是否在节点”,凭证验证回答“这个请求是否有权使用它”;不能把
IfNotPresent当成授权策略。 - 记录成功关系:kubelet 为镜像记录曾经成功的认证信息。相同凭证可本地验证,陌生或轮换后的凭证需要重新向仓库拉取并完成授权。
- 处理预加载边界:节点外部预加载的镜像没有 kubelet 拉取记录。
NeverVerifyPreloadedImages可保留兼容性,NeverVerifyAllowListedImages把例外缩小到明确清单,AlwaysVerify则要求全部验证。 - 设计凭证轮换:旧凭证的本地成功记录不会自动证明新凭证有效;轮换应触发重新拉取或显式失效,并监控仓库限流与启动延迟。
- 管理升级风险:首次启用时,现有镜像可能被视为预加载;启用前清理不应继续信任的缓存,记录节点重启和缓存文件迁移对行为的影响。
- 灰度与回滚:先按节点池、工作负载标签或低风险命名空间启用,观察拒绝率和仓库负载;保留配置为
NeverVerify或关闭 feature gate 的快速回滚。
高质量示范回答
我会验证,但策略取决于威胁模型。缓存命中只说明节点已有镜像字节,不说明当前 Pod 有权使用私有镜像;多租户节点如果跳过验证,拥有不同凭证的工作负载可能复用缓存。Kubernetes 的方案让 kubelet 记录镜像与成功认证的关系:相同凭证可在本地验证,未知或轮换后的凭证需要重新访问仓库。预加载镜像没有这些记录,所以我会先选择 NeverVerifyPreloadedImages 保持兼容,并为高敏感节点逐步改成 AlwaysVerify;允许例外时使用明确的预加载 allowlist,而不是全局关闭。上线前清理不应继续信任的节点缓存,演练 kubelet 重启、记录迁移、仓库限流和凭证轮换。灰度阶段比较 Pod 启动成功率、重新拉取比例、仓库 P95 延迟、认证拒绝和跨租户复用尝试。若仓库故障导致大量冷启动失败,回滚 feature gate 或策略,但保留告警和审计记录。这样把安全边界、兼容性和容量风险放在同一个发布决策里。
常见错误
- 认为镜像 digest 一致就代表所有命名空间都拥有使用权。
- 只说启用
AlwaysVerify,不讨论预加载镜像、节点重启和仓库不可用。 - 把凭证轮换当成 Secret 更新,忽略旧成功记录和重新拉取行为。
- 直接全局切换策略,没有节点池灰度、仓库容量预算和回滚开关。
- 把
NeverVerifyPreloadedImages描述成安全保证,却没有核对预加载来源和 allowlist。
追问及应对
为什么同一凭证可以不重新访问仓库?
成功拉取记录已经证明该凭证曾被仓库接受,kubelet 可在本地验证相同凭证与镜像的关系。若凭证变更、记录不存在或策略要求强验证,则必须重新拉取或访问仓库。
节点重启后缓存记录丢失怎么办?
把记录持久化在 kubelet 目录并按版本迁移;记录不可读时按更严格路径处理,宁可触发重新拉取,也不要默默恢复成任何人都能使用缓存镜像。
仓库临时不可用,是否允许继续使用缓存?
低风险环境可按明确策略短暂降级,高敏感工作负载不应绕过授权。降级必须可观测、限时,并记录哪些请求在离线状态被允许,避免把偶发故障变成长期越权。
如何验证凭证轮换真的生效?
用旧 Secret、新 Secret、没有 Secret 和不同命名空间分别启动同一私有镜像;检查 kubelet 事件、仓库访问、缓存记录和 Pod 结果。验证旧凭证拒绝、新凭证成功,以及仓库限流时的回滚行为。