The one sentence this post writes about its new field is wrong in both halves at the pin, three pinned pages give three different answers about whether a sidecar may carry a probe at all, and the post's only link into the API documentation has had no target since the material moved¶
Post — Kubernetes v1.28: Introducing native sidecar containers, 2023-08-25.
Todd Neal (AWS), Matthias Bertschy (ARMO), Sergey Kanzhelev (Google), Gunju Kim (NAVER) and Shannon Kularathna (Google). 117 lines, 8,857 bytes, of which thirteen lines are acknowledgements. The pattern it gives a name to was described eight years earlier in the post walked as two of three patterns that are still patterns, which is where the pattern-to-field argument lives; this exercise reads the field.
As written
The frame is that Kubernetes has had sidecars "since nearly the very beginning" without ever having
a word for one: "Until now, sidecars were a concept that Kubernetes users applied without native
support. The lack of native support has caused some usage friction, which this enhancement aims to
resolve" (:16). The post links the 2015 composite-containers post for the original description.
What are sidecar containers in 1.28? is the specification. "Kubernetes 1.28 adds a new
restartPolicy field to init containers that is available when the SidecarContainers feature gate
is enabled" (:20), and a six-line YAML fragment shows it: two initContainers, the second
carrying restartPolicy: Always (:22-34). Then one sentence that does all the constraining work:
"The field is optional and, if set, the only valid value is Always" (:36). Setting it changes
init-container behaviour three ways — the container restarts if it exits; any subsequent init
container starts immediately after the startupProbe has completed instead of waiting for this one
to exit; and "the resource usage calculation changes for the pod as restartable init container
resources are now added to the sum of the resource requests by the main containers" (:38-40). Pod
termination "continues to only depend on the main containers" (:42), and three properties make
restartable init containers ideal for the pattern: defined startup order, no extension of the Pod's
lifetime, and restart on exit (:44-48).
When to use sidecar containers lists four workloads — batch and AI/ML Pods that run to completion,
network proxies, log collection, and Jobs, where "sidecars for any purpose" no longer block
completion and "no additional configuration is required to ensure this behavior" (:52-57). How
did users get sidecar behavior before 1.28? names the two workarounds and what each cost: an init
container gives ordering but must exit, and a second main container runs for the Pod's lifetime but
gives no ordering and can block termination (:61-64).
Transitioning existing sidecars to the new model recommends the gate only in "short lived testing
clusters" at alpha, and says an existing sidecar configured as a main container "can be moved to the
initContainers section of the pod spec and given a restartPolicy of Always" (:73). Known
issues lists two, both promised as resolved before beta: the CPU, memory, device and topology
managers "are unaware of the sidecar container lifetime and additional resource usage", and "the
output of kubectl describe node is incorrect when sidecars are in use" (:77-80). We need your
feedback! asks about three things by name: the shutdown sequence with multiple sidecars, the
backoff timeout for crashing sidecars, and "the behavior of Pod readiness and liveness probes when
sidecars are running" (:84-87). What's next? forecasts one thing: "we're working on adding
termination ordering for sidecar and main containers. This will ensure that sidecar containers only
terminate after the Pod's main containers have exited" (:93). More Information is two bullets,
in this order: "API for sidecar
containers in the
Kubernetes documentation", and the KEP (:117-118).
As it runs now
The sentence at :36 is wrong in both of its halves, and neither half was wrong when it was
written. The field is no longer reached only through initContainers: ContainerRestartRules is
beta and on by default from v1.35, and pod-lifecycle.md:397-400 says you can set restartPolicy
and restartPolicyRules "on individual containers to override the Pod restart policy", applying
to app containers and to regular init containers alike. And Always is no longer the only valid
value: :408-410 lists three — Always, OnFailure, Never — with restartPolicyRules layered
on top, each rule an exitCodes condition and a Restart action, evaluated in order (:412-419).
The API reference states the general form outright at pod-v1.md:762-763: "RestartPolicy defines
the restart behavior of individual containers in a pod. This overrides the pod-level restart
policy." What the post introduced as a special case of init containers became a general container
field, and the sidecar is now defined in terms of it rather than the other way round —
pod-lifecycle.md:402-403: "A Kubernetes-native sidecar container has its container-level
restartPolicy set to Always."
The documentation disagrees with itself about whether a sidecar may carry a probe, on one page and
then across two. pod-v1.md:137 describes initContainers and says flatly that "Init containers
may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes", with no
exception for the restartable kind — and a sidecar is an init container, which is the post's whole
design. init-containers.md:54-58 says regular init containers do not support those fields and that
sidecar containers "do support some probes". Twenty lines later the same page says sidecar
containers "support all these probes to control their lifecycle" (:74-75), and
sidecar-containers.md:120 agrees with all. None, some and all, in three places, about the
same four fields. Step 6 settles it by asking the API server, which is the only one of the four that
has to be consistent.
The post's one link into the API documentation has no target.
/docs/concepts/workloads/pods/init-containers/#api-for-sidecar-containers occurs nowhere under
content/en/docs at the pin: there is no API for sidecar containers section on
init-containers.md or anywhere else, because the material moved to a page of its own,
sidecar-containers.md, 171 lines long, which did not exist when the post was written. That page's
further-reading list points back at this post (:168), so the two are linked in one direction only,
and it is the direction that works.
Both known issues were answered, one of them off the ceiling of this lab. kubectl describe node
reports allocated requests from the scheduler's effective Pod request, and the effective-request
rule at sidecar-containers.md:140-158 now names sidecars explicitly: the Pod's effective request
is the higher of the effective init request and "the sum of all non-init containers(app and sidecar
containers) request/limit", with quota, limits and the Pod's cgroups all derived from the same
number (:157-163). Step 9 measures that. The resource managers are the other half, and the only
page in the pinned tree that says they understand sidecars is pod-level-resource-managers.md,
whose :52-56 reads "Both standard init containers and restartable init containers (sidecars) are
fully supported" — on a page carrying min-kubernetes-server-version: v1.36 and gated behind
PodLevelResources plus PodLevelResourceManagers, the second of which is beta and off by default
at the pin. Eight releases after the post, and still not something a v1.35 cluster can be asked.
The forecast landed. pod-lifecycle.md:1006-1008 is the What's next paragraph turned into
behaviour: "the kubelet will delay sending the TERM signal to these sidecar containers until the
last main container has fully terminated. The sidecar containers will be terminated in the reverse
order they are defined in the Pod spec." The reverse-order half is more than the post promised. So
is :1017-1018, which tells you to go back and delete work you did before 1.28: "if you have used
preStop hooks to control the termination order without sidecar containers, you can now remove them
and allow the kubelet to manage sidecar termination automatically."
Two of the three things the post asked for feedback about are documented answers now, and one is
documented twice with different force. Pod readiness: "If a readinessProbe is specified for this
init container, its result will be used to determine the ready state of the Pod"
(sidecar-containers.md:62-63), which step 8 drives from a file. The shutdown sequence with
multiple sidecars: reverse order, above. The third, backoff for crashing sidecars, is folded into
the general container backoff at pod-lifecycle.md:405 and never treated as a sidecar question.
Against that, sidecar-containers.md:106-110 says something the termination paragraph does not
prepare you for — that a sidecar's graceful termination "is less important", that when other
containers use all the grace period sidecars "will receive the SIGTERM signal, followed by the
SIGKILL signal, before they have time to terminate gracefully", and that non-zero sidecar exit
codes on Pod termination "are normal" and "should be generally ignored by the external tooling".
The tutorial that the concept page sends adopters to has not moved since beta.
pod-sidecar-containers.md:91-92 tells you to "make sure that both API server and Nodes are at
Kubernetes version v1.29 or later", :103-104 to ensure the feature gate is enabled "for the API
server(s) within the control plane and for all nodes", and :120-124 prints the output you are
looking for as kubernetes_feature_enabled{name="SidecarContainers",stage="BETA"} 1. The gate has
been stable and locked since v1.33. A reader following that page on a current cluster is checking a
switch that cannot be off, against a stage string that will not match.
What this exercise does not cover, and where it lives
The pattern-to-field argument, the two pre-1.28 workarounds run side by side, and the Job that never completes because a helper is still alive all belong to the composite-containers exercise, together with the release provenance of the gate beyond its stages and the KEP-753 reading. That exercise proves the field solves the lifecycle problem; this one starts from a cluster where the field is stable and asks what has happened to it since. Where a sidecar's resources are written into the Pod's cgroups is the cgroup v2 version.
The diff, and why
The post broke in exactly one sentence and one link. The sentence is the post's :36, and it
broke twice over — once in v1.34 when ContainerRestartRules arrived at alpha and made
restartPolicy a field on every container, and once in v1.35 when that gate turned on by default,
which is the version this lab runs. The link is the More Information bullet, and it broke by
success: the API material the post pointed at got large enough to need its own page. A reader who
follows the post's manifest is fine; a reader who follows its constraint will not try things that
work.
Everything else is still right, including the parts the post could not know it was right
about. The three behaviour changes at the post's :38-40 are the pin's behaviour. The Job claim at
:57 holds with no configuration. The What's next forecast landed, and landed larger —
reverse-order shutdown was not promised. Both Known issues were fixed, the second of them in a
place a v1.35 cluster cannot look. The pressure in all of this is the same one: a field introduced
to describe one pattern turned out to describe a general question about container lifetime, and the
project generalised the field rather than adding more special cases.
The gate is stable and locked, so there is nothing to enable; the exercise that owns this gate's provenance is linked above and is not repeated here.
SidecarContainers
| stage | default | locked | releases |
|---|---|---|---|
| alpha | false |
— | v1.28 – v1.28 |
| beta | true |
— | v1.29 – v1.32 |
| stable | true |
true |
v1.33 – |
ContainerRestartRules
| stage | default | locked | releases |
|---|---|---|---|
| alpha | false |
— | v1.34 – v1.34 |
| beta | true |
— | v1.35 – |
Neither file carries removed: true at the pin, and neither carries former_titles:. The
SidecarContainers body is one sentence that defines the feature as setting "the restartPolicy of
an init container to Always" and sends the reader to sidecar-containers.md; the
ContainerRestartRules body sends them to pod-lifecycle.md. The two gates read as one feature
split across two files.
Topology
solo — one node, 4096MB, 4 vCPU, 25G, at 10.10.10.180.
Every question here is a kubelet question answered inside one Pod, and the node's
allocated-resources table in step 9 is easier to read when nothing else is competing for it.
Provision with the standard steps and the node
baseline. The lab runs Kubernetes v1.35, which
is the first release where ContainerRestartRules is on without being asked; steps 4 and 5 will
fail on v1.34 and earlier, and that failure is itself the post's sentence being true.
Do
- Ask the cluster about both gates, and run the adoption tutorial's own check against a cluster eight releases past the one it was written for.
kubectl version | head -2
kubectl create ns sidecar
kubectl get --raw /metrics | grep '^kubernetes_feature_enabled' \
| grep -E 'SidecarContainers|ContainerRestartRules' || echo "neither gate in the series"
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
kubectl get --raw "/api/v1/nodes/$NODE/proxy/metrics" | grep kubernetes_feature_enabled \
| grep SidecarContainers || echo "not reported by the node either"
- Build the post's manifest, shape unchanged from its
:22-34, with images that exist.
cat > /tmp/post-shape.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: post-shape, namespace: sidecar }
spec:
volumes:
- name: shared
emptyDir: {}
initContainers:
- name: secret-fetch
image: busybox:1.36
command: ["sh", "-c", "echo fetched > /shared/secret"]
volumeMounts: [{ name: shared, mountPath: /shared }]
- name: network-proxy
image: busybox:1.36
restartPolicy: Always
command: ["sh", "-c", "while true; do sleep 5; done"]
containers:
- name: app
image: busybox:1.36
command: ["sh", "-c", "cat /shared/secret; sleep 3600"]
volumeMounts: [{ name: shared, mountPath: /shared }]
EOF
kubectl apply -f /tmp/post-shape.yaml
kubectl -n sidecar wait --for=condition=Ready pod/post-shape --timeout=90s
kubectl -n sidecar get pod post-shape -o jsonpath='{range .status.initContainerStatuses[*]}{.name}: started={.started} ready={.ready}{"\n"}{end}'
kubectl -n sidecar logs post-shape -c app
- Ask the API where the field lives now. The post adds it to init containers; the composite-containers exercise already reads it there, so read the other side.
kubectl explain pod.spec.containers.restartPolicy
kubectl explain pod.spec.containers.restartPolicyRules
kubectl explain pod.spec.containers.restartPolicyRules.exitCodes
- Test the post's constraint directly, with the pin's own example from
pod-lifecycle.md:424-439— two app containers in one Pod, one of which may never restart — shortening the second container's sleep from 1800 seconds so the restarts are visible while you watch.
cat > /tmp/restart-values.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: on-failure-pod, namespace: sidecar }
spec:
restartPolicy: OnFailure
containers:
- name: try-once-container
image: busybox:1.36
command: ["sh", "-c", "echo 'Only running once' && sleep 10 && exit 1"]
restartPolicy: Never
- name: on-failure-container
image: busybox:1.36
command: ["sh", "-c", "echo 'Keep restarting' && sleep 20 && exit 1"]
EOF
kubectl apply -f /tmp/restart-values.yaml
kubectl -n sidecar get pod on-failure-pod -w --output-watch-events=false &
sleep 90; kill %1
kubectl -n sidecar get pod on-failure-pod \
-o jsonpath='{range .status.containerStatuses[*]}{.name}: restarts={.restartCount} state={.state}{"\n"}{end}'
- Now the part of the field that has no counterpart anywhere in the post: a rule that decides on
the exit code. This is the pin's sample at
:466-483, whose container exits0and therefore never triggers the rule it carries; this one exits42.
cat > /tmp/restart-rules.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: restart-on-exit-codes, namespace: sidecar }
spec:
restartPolicy: Never
containers:
- name: restart-on-exit-codes
image: busybox:1.36
command: ["sh", "-c", "echo attempt; sleep 10; exit 42"]
restartPolicy: Never
restartPolicyRules:
- action: Restart
exitCodes:
operator: In
values: [42]
EOF
kubectl apply -f /tmp/restart-rules.yaml
sleep 60
kubectl -n sidecar get pod restart-on-exit-codes \
-o jsonpath='phase={.status.phase} restarts={.status.containerStatuses[0].restartCount}{"\n"}'
kubectl -n sidecar logs restart-on-exit-codes | head -5
- Settle the probe question by submitting it. One sidecar carrying all four of the disputed fields, and one regular init container carrying one of them.
cat > /tmp/probes.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: probed, namespace: sidecar }
spec:
initContainers:
- name: sidecar
image: busybox:1.36
restartPolicy: Always
command: ["sh", "-c", "touch /tmp/up; while true; do sleep 5; done"]
startupProbe: { exec: { command: ["test", "-f", "/tmp/up"] }, periodSeconds: 2 }
readinessProbe: { exec: { command: ["test", "-f", "/tmp/up"] }, periodSeconds: 2 }
livenessProbe: { exec: { command: ["true"] }, periodSeconds: 5 }
lifecycle: { preStop: { exec: { command: ["sh", "-c", "echo stopping"] } } }
containers:
- name: app
image: busybox:1.36
command: ["sh", "-c", "sleep 3600"]
EOF
kubectl apply -f /tmp/probes.yaml
kubectl -n sidecar run regular-init --image=busybox:1.36 --dry-run=client -o yaml \
--command -- sh -c 'sleep 5' > /tmp/regular.yaml
kubectl apply --dry-run=server -f - <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: regular-init-probe, namespace: sidecar }
spec:
initContainers:
- name: setup
image: busybox:1.36
command: ["sh", "-c", "sleep 5"]
readinessProbe: { exec: { command: ["true"] }, periodSeconds: 2 }
containers:
- name: app
image: busybox:1.36
command: ["sh", "-c", "sleep 3600"]
EOF
- Measure the post's forecast at its
:93. Two sidecars and one main container, each announcing its ownSIGTERMwith a timestamp, then delete the Pod and read the order off the logs.
cat > /tmp/term-order.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: term-order, namespace: sidecar }
spec:
terminationGracePeriodSeconds: 60
initContainers:
- name: sidecar-one
image: busybox:1.36
restartPolicy: Always
command: ["sh", "-c", "trap 'echo TERM $(date +%s.%N) sidecar-one; sleep 2; exit 0' TERM; while true; do sleep 1; done"]
- name: sidecar-two
image: busybox:1.36
restartPolicy: Always
command: ["sh", "-c", "trap 'echo TERM $(date +%s.%N) sidecar-two; sleep 2; exit 0' TERM; while true; do sleep 1; done"]
containers:
- name: app
image: busybox:1.36
command: ["sh", "-c", "trap 'echo TERM $(date +%s.%N) app; sleep 5; exit 0' TERM; while true; do sleep 1; done"]
EOF
kubectl apply -f /tmp/term-order.yaml
kubectl -n sidecar wait --for=condition=Ready pod/term-order --timeout=90s
kubectl -n sidecar delete pod term-order --wait=false
sleep 25
for c in app sidecar-two sidecar-one; do
kubectl -n sidecar logs term-order -c $c 2>/dev/null | grep TERM || echo "$c: no TERM seen"
done
- Drive Pod readiness from the sidecar, which is the first of the three things the post asked for feedback about.
kubectl -n sidecar get pod probed \
-o jsonpath='ready={.status.conditions[?(@.type=="Ready")].status}{"\n"}'
kubectl -n sidecar exec probed -c sidecar -- rm /tmp/up
sleep 15
kubectl -n sidecar get pod probed \
-o jsonpath='ready={.status.conditions[?(@.type=="Ready")].status}{"\n"}'
kubectl -n sidecar get pod probed -o jsonpath='{range .status.initContainerStatuses[*]}{.name}: ready={.ready}{"\n"}{end}'
kubectl -n sidecar exec probed -c sidecar -- touch /tmp/up
sleep 15
kubectl -n sidecar get pod probed \
-o jsonpath='ready={.status.conditions[?(@.type=="Ready")].status}{"\n"}'
- Answer the second known issue with arithmetic the node has to agree with.
kubectl describe node "$NODE" | sed -n '/Allocated resources/,/^Events/p'
cat > /tmp/accounting.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata: { name: accounting, namespace: sidecar }
spec:
initContainers:
- name: heavy-init
image: registry.k8s.io/pause:3.10
resources: { requests: { memory: 300Mi } }
- name: side
image: registry.k8s.io/pause:3.10
restartPolicy: Always
resources: { requests: { memory: 200Mi } }
containers:
- name: app
image: registry.k8s.io/pause:3.10
resources: { requests: { memory: 200Mi } }
EOF
kubectl apply -f /tmp/accounting.yaml
kubectl -n sidecar wait --for=condition=Ready pod/accounting --timeout=90s
kubectl describe node "$NODE" | sed -n '/Non-terminated Pods/,/Allocated resources/p' | grep -E 'accounting|NAMESPACE'
kubectl describe node "$NODE" | sed -n '/Allocated resources/,/^Events/p'
-
Offline, in a checkout of
kubernetes/websiteat the pin, read the three voices on probes and the link with no target.cd /path/to/kubernetes/website/content/en grep -rn 'api-for-sidecar-containers' --include='*.md' docs | wc -l grep -n 'may not have Lifecycle actions' docs/reference/kubernetes-api/core/pod-v1.md sed -n '54,58p;74,75p' docs/concepts/workloads/pods/init-containers.md sed -n '118,121p' docs/concepts/workloads/pods/sidecar-containers.md sed -n '120,124p' docs/tutorials/configuration/pod-sidecar-containers.md cat docs/reference/command-line-tools-reference/feature-gates/ContainerRestartRules.md
Expect
Step 1 prints SidecarContainers at stage STABLE and ContainerRestartRules at stage BETA,
both with value 1 — or drops the locked one from the series entirely, depending on the build. The
node endpoint agrees with the API server, which is the check the adoption tutorial asks you to make
and the only part of that page still worth running. Note the stage string:
pod-sidecar-containers.md:120-124 tells you to look for stage="BETA" and would have you conclude
the feature is off.
Step 2 is the post working exactly as written, three years on. Both init container statuses report
started=true; secret-fetch also reports ready=true after it exits, network-proxy reports
ready=true while still running, and app logs fetched — the ordering guarantee the post's first
bullet promises, with no gate set anywhere. This is the baseline against which the rest of the
exercise is a surprise.
Step 3 is where the post's sentence comes apart. kubectl explain pod.spec.containers.restartPolicy
returns a field description, not error: field "restartPolicy" does not exist, and it describes the
general form from pod-v1.md:762-763 rather than the sidecar special case. restartPolicyRules is
there too, with an action and an exitCodes condition underneath it. The post says the field is
added to init containers and that its only valid value is Always; two explain calls disagree
with both halves, and neither of them is about sidecars at all.
Step 4 runs that disagreement. try-once-container exits 1 after ten seconds and stays down —
restarts=0, state terminated — while on-failure-container exits 1 after twenty seconds and
comes straight back, its restart count climbing every twenty seconds or so as the backoff grows. Two
containers, one Pod, one Pod-level restartPolicy of OnFailure, and two different outcomes
decided per container. Nothing in this Pod is a sidecar; the field the post introduced for sidecars
is doing all of it.
Step 5 restarts on an exit code. restarts climbs above 0 and the Pod stays out of Failed even
though its Pod-level policy is Never and its container-level policy is Never as well, because
the rule matched first. Change the 42 in the command to any other number and re-apply: the rule
stops matching, the container-level Never takes over and the Pod goes to Failed. Worth noticing
that the pinned sample this is copied from exits 0 (pod-lifecycle.md:476), so as published it
never triggers the rule it exists to demonstrate.
Step 6 is the answer to the three-way disagreement, and it comes in two parts. The probed Pod is
accepted and reaches Ready, so a sidecar carries startupProbe, readinessProbe, livenessProbe
and lifecycle — all four, which is init-containers.md:74-75 and sidecar-containers.md:120
against :54-58's some. The server-side dry run of regular-init-probe is rejected with a
validation error naming spec.initContainers[0].readinessProbe as a field that may not be set,
which is pod-v1.md:137 being right about regular init containers and silent about the exception.
The API server holds all three positions at once without contradiction; only the prose contradicts.
Step 7 prints three timestamped lines, and the order is the finding: app first, then
sidecar-two, then sidecar-one. The gap between app's line and sidecar-two's is at least the
five seconds app sleeps before exiting, which is the delay pod-lifecycle.md:1006-1008 promises.
The two sidecar lines arrive in reverse declaration order, which the post never forecast. If a
container's line is missing, it was killed before it could log — read that as the grace period
expiring rather than as an ordering failure, and raise terminationGracePeriodSeconds.
Step 8 makes the Pod unready without touching the app. Removing /tmp/up fails the sidecar's
readiness probe, and within about two probe periods the Pod's Ready condition flips to False
while app keeps running and its own status stays ready; the init container status for sidecar
reports ready=false. Restoring the file flips it back. A Service in front of this Pod would have
removed it from its endpoints on the strength of a container that is not the application — which is
the answer to the second thing the post asked for feedback about, and it is a sharper answer than
the post anticipated.
Step 9 is the arithmetic from sidecar-containers.md:140-158. The accounting Pod requests 300Mi
on a regular init container, 200Mi on a sidecar and 200Mi on the app container; the node's
Allocated resources table should rise by 400Mi, not by 300Mi and not by 700Mi — the sum of the
non-init containers, which now includes the sidecar, beats the effective init request of 300Mi. If
it rises by 200Mi you have found the post's second known issue still alive, and it is worth saying
so precisely. The per-Pod line in Non-terminated Pods should carry the same 400Mi.
Step 10 is the paperwork. The anchor count is 0: the post's only link into the API documentation
has had no target since the material moved to a page of its own. The three probe sentences print one
after another and can be read as a set — may not have, some, all these — and the tutorial's
stage="BETA" prints beside a gate file whose last stage is stable with locked: true.
Read on
-
sidecar-containers.md:106-110, on sidecar exit codes being normal and ignorable. Read it against step 7's timestamps and work out which of the two descriptions your grace period produced. -
pod-lifecycle.md:485-488, the paragraph warning that restart rules inherit every inconsistency of the restart policy — kubelet restarts, runtime garbage collection and control-plane connectivity can all re-run a container you asked never to be re-run. -
pod-level-resource-managers.md:40-56, for what sidecar-aware resource management looks like when it finally arrives, and which two gates you would have to turn on to see it. -
pod-sidecar-containers.md:128-196, the adoption tutorial's sections on third-party tooling and on automatic sidecar injection. The post says an existing sidecar "can be moved" toinitContainers; this is the page that says what else has to move with it. -
Unanswerable from the pin. Whether the classic per-container CPU, memory, device and topology managers became sidecar-aware, and in which release. The only statement in the tree is about the pod-level managers, on a page that needs v1.36 and two feature gates; nothing under
content/ensays what the per-container managers do with a restartable init container today.
Teardown
kubectl delete ns sidecar --ignore-not-found
rm -f /tmp/post-shape.yaml /tmp/restart-values.yaml /tmp/restart-rules.yaml /tmp/probes.yaml /tmp/regular.yaml /tmp/term-order.yaml /tmp/accounting.yaml
kubectl describe node "$NODE" | sed -n '/Allocated resources/,/^Events/p'
The last line is worth reading before you leave: allocated requests should be back where step 9 found them. Then return the guest with the standard teardown, or leave it up for the next row.
Back to the 2023 census.