受约束进程不能写只读根文件系统,但仍可使用指定的可写工作卷。

安全上下文需要运行时证据来验证

Kubernetes 的 securityContext 配置进程身份及部分操作系统约束,可以缩小被攻陷应用允许执行的操作,但本身不会建立完整安全边界。应先确定应用实际需要什么操作,再配置对应字段,并在最终容器中同时测试允许与拒绝的行为。只有一份看起来严格的清单,还不能说明运行中的进程已经按预期受到限制,也不能代替应用本身的权限设计。 原文 Kubernetes 1.34.11 历史样例,本次未重跑。结果反映组合设置;RuntimeDefault 取决于运行时。没有测试容器逃逸抵抗、全部 seccomp 规则、敌对多租户隔离或应用授权。执行仍为受阻。 把设置放在正确层级 Pod 级配置可以提供用户和组身份、共享卷的组权限行为,以及 seccomp 配置。容器级字段可以覆盖适用的默认值,并设置 capabilities、权限提升和只读根文件系统。需要核对字段真实 API 范围,把熟悉的名称写在错误位置,并不会获得等价约束。相同的 securityContext 名称之下,不代表所有字段都能互换放置。 ...

十一月 20, 2027 · 3 分钟 · XB Field Notes
二百四十秒的高建议让六副本保持到四百秒;这条建议过期后,模型在五百四十一秒缩到两个。

水平自动伸缩按需扩缩容

HorizontalPodAutoscaler 根据配置的指标目标调整可伸缩工作负载。它的输出是期望副本数,不是“额外 Pod 已经接收流量”的保证。调度、镜像启动、初始化、就绪状态以及节点容量,都会决定这个建议多久才能转变成真正有用的服务能力。设计控制循环时,必须把这些延迟一起考虑,不能只根据一条公式估计恢复时间。 仅展示原文的算术与列表状态模型。历史 Python 模型执行仍为通过;未测试容差、速率策略、逐 Pod 处理、Kubernetes 协调或真实就绪容量。本次未运行样例。 指标产生的是副本建议 对于简单的逐 Pod 平均值,期望副本等于当前副本数乘以当前指标除以目标指标,再向上取整。比值为二时,在额外控制介入之前会建议翻倍。比值低于一可能建议缩容,但容差、缺失测量、就绪处理、上下限和扩缩行为,都可能阻止或限制最终动作。公式描述起点,不是所有条件下都直接生效的完整算法。 CPU 利用率以资源 requests 为分母。改变请求值,即使用掉的 CPU 没变,也可能改变利用率,所以纵向与横向伸缩需要协调。指标接口必须可用,目标还要支持 scale 子资源。HPA 修改 Deployment 的副本数量,再由 Deployment 控制器管理 ReplicaSet 与 Pod;这几层职责不同,不应把它们统称为一个瞬间完成的操作。 ...

十一月 4, 2027 · 2 分钟 · XB Field Notes
reader Service 选中 a、b,c 位于集合外。由于选择不是网络授权,从 a 到 c 的直接路径仍可能可用。

Kubernetes 标签定义选择关系,不代替授权

标签是 Kubernetes 用于选择对象的键值元数据。Service 选择器、运维查询和工作负载控制器都可能依赖标签,但每个消费者有自己的 API 和处理方式。因此,标签变化可能改变对象所属集合,同时底层进程仍然健康。审阅时应把标签视为真实消费者的输入,而不是仅用于展示的贴纸,否则看似简单的文字修改也可能改变路由。 这是历史实验观察,不是新的集群运行结果。缺少键时的不等式会影响查询成员;Service 选择不会强制实施网络授权。实验使用普通就绪行为,未执行 NetworkPolicy 隔离。 确认正在使用哪一种选择语言 标签键采用限定名称格式,值也有字符和长度约束。标签值可以为空;不为空时,其允许字符及首尾位置受到限制,最大长度为六十三个字符。任意长段落或不受约束的 JSON 并不适合放在标签值里。描述性信息可以采用 annotation,但仍然要遵守对应格式和消费契约,不能把换字段当成取消所有限制。 等值条件检查某个键是否具有指定值,集合条件还支持成员关系与存在性检查。同一个选择器里的多个条件需要同时满足。有一个容易忽略的细节:track!=canary 也会匹配根本没有 track 键的对象。如果不允许键缺失,应另外要求这个键存在,不能认为“不等于某值”就已经隐含“这个键肯定存在”。 ...

九月 9, 2027 · 3 分钟 · XB Field Notes
一个集群内有两个命名空间范围,各有名为 settings 的 ConfigMap,下方为共享的集群节点层。范围不会创建独立节点容量。

命名空间划分对象范围,其他边界需要政策

命名空间为 Kubernetes 集群中的许多对象限定范围。两个团队都可以创建名为 settings 的 ConfigMap,因为包含命名空间后的完整身份不同。这种组织边界很有价值,但不会自动提供网络隔离、独立内核、专属节点容量或完整租户隔离。工作负载实际需要哪一种保障,就应确认额外由什么政策和执行机制落实,而不是把它们都归因于命名空间。 命名空间身份只是一类边界。历史实验未证明网络政策执行、CPU 公平性或面对敌对租户的完整隔离。ResourceQuota 约束准入,不是运行中进程带宽或物理容量预留。本次未重跑示例。 名称范围取决于资源类型 Pod、Service、ConfigMap 和许多工作负载控制器属于命名空间资源。Node、命名空间本身以及其他集群级资源,则不会因为客户端指定了某个命名空间,就被划分成另一份独立副本。应查看具体资源的 API 范围,不能假定所有对象都住在某个房间里面。命名空间也不是由独立子集群构成的嵌套层级。 在 Pod 内部,服务短名称通常按所在命名空间解析。带限定的名称可以指向别处,例如默认集群域下的 api.other.svc.cluster.local。这种约定负责定位目的地址,并不决定允许还是拒绝连接。集群域也可以另行配置,因此示例中的后缀不是所有安装都必须采用的常量。诊断 DNS 时需要结合实际域和工作负载所在位置。 自动化中的命名空间选择应保持明确。对象名称即使正确,如果当前活动命名空间错误,仍然会访问另一个资源。尤其是修改操作,应有意指定 kubeconfig、上下文和命名空间,而不是依赖操作者终端之前留下的状态。对象范围让身份更清楚,但具有广泛权限的管理员依然能够跨范围修改内容,不能因此省略权限审查。 坏掉的样子 没有适用网络政策的命名空间,仍然按照集群网络本身的行为保持连通。仅创建命名空间,或在 DNS 中加入它的名称,并不会拒绝其他 Pod。网络隔离需要正确的政策,以及真正执行这些政策的网络实现。应用认证还是另一层:域名能解析,只说明找到了地址,并不能证明某个调用者应该获准读取返回内容。 ...

八月 25, 2027 · 4 分钟 · XB Field Notes
客户端使用一个普通 ClusterIP Service 入口,路径分向合适的 Pod。稳定发现不保证请求连续。

Kubernetes Service 为 Pod 提供稳定入口

既然 Pod 会重建,就很难记住它的地址。Service 在这组 Pod 前面固定一个名字,让调用方不因 Pod 更换而受影响。 前后集合是模型结果,不是传输测试。稳定发现不证明每个请求都会成功。端点条件、端口和数据路径需分别检查。精确本地模型本轮再次通过;未执行 Kubernetes 或传输测试。 一个地址,一组 Pod 普通 ClusterIP Service 在对象存续期间保持虚拟地址,集群 DNS 提供发现名称。调用方可以依赖这个名称,而后端可互换的 Pod 逐渐被替换。这把稳定的客户端契约与单个后端生命周期分开,不需要每替换一个副本就推送客户端配置。但稳定身份仍有明确范围,不能扩写成全部网络行为都不会变化。 无头和 ExternalName Service 具有不同发现行为,无选择器 Service 则可以使用单独管理的 EndpointSlice。虚拟地址稳定的结论应限于普通情形。Deployment 管理工作负载,本身不是发起网络连接的客户端;真正使用发现结果的是应用、网关和其他组件。审阅调用关系时,应区分资源控制与请求转发这两层。 选择规则决定由谁响应 带选择器的 Service 识别本命名空间里匹配的 Pod,EndpointSlice 控制器异步协调地址和条件。就绪通常决定普通流量资格,但未就绪端点可能继续存在,只是就绪条件为假,不一定从 API 对象中彻底删除。列表成员、成员条件和最终是否选择它,是需要分别观察的状态。 ...

八月 23, 2027 · 2 分钟 · XB Field Notes
已配置的 startup 成功前抑制 liveness 与 readiness;成功后停止当前实例的 startup,并交由分别配置的后续检查。

启动探针成功后,其他探针才开始执行

Startup 探针为容器提供单独的初始化契约。在已经配置的启动探针成功之前,Kubernetes 不会执行这个容器的 liveness 或 readiness 探针。这比“宽限期内忽略一些存活失败”更具体:另外两种检查根本还没有开始。启动检查成功之后,后续健康和就绪判断才按各自规则接管,不能把三个名称理解成同一个接口的不同标签。 阈值乘周期可辅助规划,不是精确重启时刻。启动成功不强迫就绪成功,也不保证持续健康。本轮没有重跑原文保留的 Kubernetes 集成实验。 为每个阶段定义可观察条件 应用进程必须先运行,启动探针才可能成功。因此,容器已经 Running 时,container status 中的 started 仍可能为 false,所在 Pod 也可能尚未 Ready。运行状态描述进程正在执行,启动成功则描述配置的检查条件已经满足。提前开放的 HTTP 监听端可以报告进度,但不应该因此自动声称全部准备已经完成。 启动条件应代表必要的本地准备,例如加载索引或验证初始状态。只有打开端口确实就是所需前置条件时,单纯检查端口才足够。如果监听器先出现,昂贵的初始化稍后才结束,过早成功的检查就会提前解除存活保护,再次造成原本想避免的重启循环。接口名称不会替应用定义初始化完成的真实含义。 启动检查一旦成功,kubelet 就停止当前容器实例的 startup 探针,并按独立配置运行存活与就绪检查。启动成功不是永久健康证明:应用稍后仍可能变成未就绪,或者需要重启。新的容器实例还要重新完成自己的启动检查,不能继承上一实例已经成功的结论。把实例身份和状态变化一起记录,才能解释重复启动的原因。 坏掉的样子 启动探针如果一直不成功,最终会达到失败阈值。Kubelet 随后终止容器,并根据对应重启策略处理。因此,启动保护不是允许初始化无限等待。周期、超时和失败阈值应依据真实初始化耗时设置,同时考虑环境中可能发生的资源争用与可以接受的恢复时间,避免只按开发机器的一次快速启动选择参数。 failureThreshold 与 periodSeconds 的乘积可用于规划启动预算,但不能把它写成所有实际重启都严格遵守的秒表。初始延迟、探针执行与调度、终止宽限和重启退避也影响完整时间线。排查慢发布时,应记录真实尝试和状态变化,而不是仅根据两个配置数字推断容器应该已经重启,或断定平台行为错误。 除非通过 startup 明确建立依赖,否则不应认为 liveness 会等 readiness 成功才开始。就绪与存活原本回答两个持续运行阶段的问题。反过来,启动成功也不会强迫就绪成功:后续 readiness 可能因为另一个条件拒绝流量资格,而进程仍然正常存活。把这些结果分开,才能选择正确恢复动作,避免用反复重启处理暂时不可服务。 ...

八月 22, 2027 · 3 分钟 · XB Field Notes
概念命名空间中,Pod 创建者的直接 get 被拒绝,但能创建消费数据的 Pod。另一条挂载箭头将 Secret 数据交给 Pod。读取权限和工作负载创建权限要一起审查。

Kubernetes Secret 需要明确的访问边界

Kubernetes Secret 是用于保存工作负载所需机密值的 API 对象,提供专门的类型、消费路径和访问控制目标。但它不会让所有其他参与者都无法读取内容。设计边界时,需要同时考虑谁能取回对象、谁能创建消费者、谁能查看消费者输出,以及谁能管理运行它们的节点。仅区分配置对象与秘密对象,还不足以完成权限设计。 Secret 的边界既包括直接读取者,也包括能够创建消费者的主体。窄投射只限制这一次交付,不一定限制创建者。轮换还需要交付、重载和签发方验证。此图是概念示意,本轮没有执行集群实验。 编码与保护处于不同层次 在 JSON API 表示中,Secret 的 data 使用 base64;stringData 则便于在写入时提交字符串。Base64 无需密钥就能还原,并不是加密。这种表示也不能证明某个具体集群怎样保护底层存储。Kubernetes 文档说明,若未配置相应加密,秘密数据默认不在存储层加密。应核对实际 API 服务器和存储设置,不能看到编码文字就推断保密措施已经生效。 存储加密同样不会阻止获得授权的 API 读取者拿到数据。RBAC 中的 get、list 和 watch 权限都可能暴露 Secret 内容,广泛的列表权限并不只是允许查看对象名称。备份和诊断输出也需要保护。正常应用最终仍要获得可用值,因此,一旦有权消费数据的程序被控制,攻击者就已经进入这份数据的信任边界,不能靠编码再次隔离它。 ...

八月 21, 2027 · 3 分钟 · XB Field Notes
镜像代码与所选 ConfigMap 配置分别输入 Pod;工作负载定义指定这两类输入。

ConfigMap 把配置与镜像分开

ConfigMap 把非敏感配置放在镜像之外,让环境相关设置发生变化时,不必重新构建应用产物。真正有用的边界需要明确:镜像提供代码,工作负载定义则指定这些代码应该读取哪份配置。因此,一次发布不仅是一个镜像标签,配置引用同样属于正在交付的行为。只记录镜像版本,可能无法解释两个环境为什么表现不同。 配置引用属于发布的一部分。图示解释历史选择和依赖旧输入的回退,不证明应用兼容性、滚动期间可用性或外部副作用回滚。本次未重跑示例。 给配置一个可审阅的身份 ConfigMap 的 data 值是字符串,也可以通过 binaryData 表达二进制内容及其 API 编码形式。它适合小规模配置,数据大小有一 MiB 限制,不是通用文件仓库,更不是保护秘密的机制。API 能检查对象结构,却不知道某个应用参数在业务上是否合理。因此,结构合法和业务正确仍需分别验证,不能以创建成功代替配置审查。 Pod 可以通过环境变量引用或挂载文件消费配置。普通 Pod 引用要求 ConfigMap 位于这个 Pod 所在的命名空间。名称、必需键和应用解释方式都应明确。Deployment 对象被 API 接受,并不证明它引用的每个键都存在,也不证明新容器能够带着这些值成功启动。发布检查必须继续观察真实工作负载的结果。 单位、允许值与默认值应属于应用配置规范。某个字符串看起来像布尔值或数字,并不说明接收方会采用什么转换规则。在不同环境之间推广配置之前,需要结合真实消费者检查这些规则,避免同一份文本被解释成不同业务含义。 版本化的不可变 ConfigMap 更容易表达发布身份。settings-v2 可以与 settings-v1 同时保留,而 immutable 会禁止修改当前对象的数据。但这项保护不阻止有权限的操作者删除对象,再用同名重新创建另一份内容。对象生命周期权限和发布记录,应与希望实现的不可变承诺一致,不能把一个字段理解成所有可能路径都被永久封闭。 ...

八月 20, 2027 · 3 分钟 · XB Field Notes