Can one process run correctly?
A container already answers this: one process, one isolation boundary, one lifecycle.
Investigation 017 · Node Execution Principles
INV-016 already separated decisions from execution mechanics. We inherit that boundary unchanged. The mystery now is smaller and sharper: what exact unit should the scheduler and node treat as indivisible when one application needs tightly-coupled processes?
Begin the investigation ↓Prologue
A web service requests two companions: one process fetches configuration before startup, another ships logs while the service runs.
Run the web service process.
Add a log helper that is useful only beside that web service.
Add a precondition process that must succeed before web startup.
Three healthy containers can still fail to behave as one application.
The puzzle is not "how to run three containers." It is "how to express one application boundary across them."
First Principles
The first time a second process appears, architecture must answer co-location, startup order, identity, and fate. None belong to a process in isolation.
A container already answers this: one process, one isolation boundary, one lifecycle.
This requires shared guarantees that no single process can declare or enforce alone.
When correctness depends on several processes together, the orchestration unit can no longer be one process by default.
Naive Architecture
If every application is self-sufficient as one process, the inherited architecture is complete: one scheduling decision, one runtime request, one lifecycle.
The Architecture That Almost Worked
Configuration, web, and logging all run, each by a valid local decision. The platform still has no enforceable concept that they are one indivisible unit.
Must complete before web startup.
Serves traffic only after config exists.
Useful only when co-located with that specific web process.
Every container can be healthy while the application contract is still missing.
Breaking Our Design
Pressure. A log helper separated from the web process is healthy but useless.
Prediction. If independent placement is enough, helper usefulness should survive separate node decisions.
Place web and helper separately, then compare atomic co-location.
Separated helper cannot perform its job.
Useful relationship is not guaranteed.
Tightly-coupled members need atomic placement.
Placement alone does not control startup sequencing.
Group-level placement guarantee is required.
Choose a placement mode and inspect helper usefulness.
Pressure. Web startup races before configuration completion.
Prediction. If independent startup is acceptable, retries should be equivalent to a platform guarantee.
Start unordered, then enforce platform-declared order.
Unordered startup flails; ordered startup is stable.
Application code absorbs deployment sequencing burden.
Ordering belongs to the shared execution boundary.
Ordered members still appear as separate network identities.
Declared startup order must be enforceable.
Observe whether startup correctness is accidental or guaranteed.
Pressure. Separate addresses and localhost scopes split one application into three network identities.
Prediction. If independent identities are harmless, helper-to-web communication should remain trivial.
Compare separate identities with shared abstract identity.
Separate identities break localhost expectations.
One application appears as fragmented network targets.
The group needs one shared abstract identity guarantee.
Identity alone does not settle eviction behavior.
Identity ownership is group-scoped.
Validate whether helper and main process behave as one logical host.
Pressure. Independent eviction leaves healthy but useless fragments running.
Prediction. If independent fates are acceptable, partial eviction should preserve meaningful service behavior.
Evict one member independently, then compare group eviction.
Independent eviction preserves fragments, not application correctness.
No group-level health or termination boundary exists.
Group eviction and termination need one boundary, while members may still restart individually inside it.
The contract is now visible and can be formalized.
Eviction and health must be group-scoped.
Observe whether eviction semantics preserve application correctness.
The Turning Point
Placement, startup, identity, storage intent, and fate must be owned together by one generic boundary before any platform-specific name appears.
Application Boundary Contract
The smallest tightly-coupled process group must be placed, initialized, addressed, and terminated as one indivisible unit.
| Guarantee | What must hold |
|---|---|
| Atomic placement | All declared members land through one scheduling decision, or none does. |
| Declared startup ordering | Precondition members run to completion successfully before application members can start. |
| Shared abstract network identity | The group is reachable as one logical host identity; members can communicate with local-host semantics at the group boundary. |
| Shared declared storage guarantee | Group-declared storage is consistently available to every member that mounts it. |
| Shared fate | Group eviction and termination apply to the boundary as one unit; individual members may still restart within that boundary. |
| Policy exclusions | The contract does not define retry intervals, replica counts, CPU/memory apportionment, or health-check cadence. |
Only Now: Kubernetes
Kubernetes calls this indivisible application boundary a Pod. Containers that must complete before application startup are init containers.
These names implement the earned contract. They do not replace it.
A container runs one process. A Pod owns the guarantees that make tightly-coupled processes one application.
Engineering Reflection
When correctness belongs to a group, orchestration must treat the group as one unit. Containers remain the process unit; the application boundary remains the coupling unit.
Borg's alloc lineage documented helper companions and the operational inconvenience of allowing app containers to escape shared grouping, leading Kubernetes to regularize grouping for every app container.
A single-container boundary remains the default. Use several containers together only when permanent coupling makes separation incorrect; genuinely independent containers belong in separate boundaries.
Any orchestration system needs a smallest indivisible execution boundary once tightly-coupled processes appear.
A helper needing about 50 MB can no longer be scheduled alone on a node with 50 MB free if its multi-GB companion cannot fit there. Placement eligibility becomes the combined footprint.
Members in one boundary scale together even when one member would need fewer replicas.
Group-level eviction or termination affects healthy and unhealthy members together.
Engineers must reason about process-level behavior and boundary-level guarantees at the same time.
Investigation Exercise
Predict helper usefulness under separate placement.
Predict startup behavior before precondition completion.
Predict localhost behavior under separate identities.
Predict outcomes for independent and shared eviction.
Bridge
This investigation requires one group identity. It does not establish why that identity must be distinct from the machine that executes the group.
We know the application boundary needs one identity. We have not earned why it cannot share the node's identity.