docs migration: Container Lifecycle Hooks into Concepts (#2564)

* initial commit for structure

* migrate Container Lifecycle Hooks and related files to Concepts

* update Concepts ToC

* fix formatting

* Formatting tweaks

* comment out What's next

* remove What's next

* Begin rewrite of container-lifecycle-hooks.md

* incremental update to edit

* Split Container Lifecycle Hooks into container-lifecycle-hooks.md and container-environment.md; change all referring links.

* Add concept template to volumes.md and images.md

* Apply changes for steveperry-53 feedback.

* fix format issue

* tweak formatting

* fix Concepts ToC

* update links

* add back changes to Concepts ToC

* fix a link

* update links
This commit is contained in:
Andrew Chen
2017-04-25 10:36:59 -07:00
committed by GitHub
parent b38c79dde8
commit 2f51937983
16 changed files with 8305 additions and 78 deletions
+1 -1
View File
@@ -4,4 +4,4 @@ title: Admin Guide
{% include user-guide-content-moved.md %}
[Cluster Administration Overview](/docs/tasks/administer-cluster/overview/)
[Cluster Administration Overview](/docs/tasks/administer-cluster/overview/)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -3561,14 +3561,14 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">postStart</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details">http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_handler">v1.Handler</a></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">preStop</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details">http://kubernetes.io//docs/concepts/containers/container-lifecycle-hooks#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_handler">v1.Handler</a></p></td>
<td class="tableblock halign-left valign-top"></td>
+3 -3
View File
@@ -233,7 +233,7 @@ Appears In <a href="#podstatus-v1-core">PodStatus</a> </aside>
<tbody>
<tr>
<td>containerID <br /> <em>string</em></td>
<td>Container&#39;s ID in the format &#39;docker://<container_id>&#39;. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#container-information">http://kubernetes.io/docs/user-guide/container-environment#container-information</a></td>
<td>Container&#39;s ID in the format &#39;docker://<container_id>&#39;. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-environment-variables/#container-information">http://kubernetes.io/docs/concepts/containers/container-environment-variables/#container-information</a></td>
</tr>
<tr>
<td>image <br /> <em>string</em></td>
@@ -51409,11 +51409,11 @@ Appears In <a href="#container-v1-core">Container</a> </aside>
<tbody>
<tr>
<td>postStart <br /> <em><a href="#handler-v1-core">Handler</a></em></td>
<td>PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></td>
<td>PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details">http://kubernetes.io/concepts/containers/container-lifecycle-hooks/#hook-details</a></td>
</tr>
<tr>
<td>preStop <br /> <em><a href="#handler-v1-core">Handler</a></em></td>
<td>PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></td>
<td>PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details">http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details</a></td>
</tr>
</tbody>
</table>
@@ -0,0 +1,65 @@
---
assignees:
- mikedanese
- thockin
title: Container Environment Variables
---
{% capture overview %}
This page describes the resources available to Containers in the Container environment.
{% endcapture %}
{:toc}
{% capture body %}
## Container environment
The Kubernetes Container environment provides several important resources to Containers:
* A filesystem, which is a combination of an [image](/docs/concepts/containers/images) and one or more [volumes](/docs/concepts/storage/volumes).
* Information about the Container itself.
* Information about other objects in the cluster.
### Container information
The *hostname* of a Container is the name of the Pod in which the Container is running.
It is available through the `hostname` command or the
[`gethostname`](http://man7.org/linux/man-pages/man2/gethostname.2.html)
function call in libc.
The Pod name and namespace are available as environment variables through the
[downward API](docs/tasks/configure-pod-container/downward-api-volume-expose-pod-information).
User defined environment variables from the Pod definition are also available to the Container,
as are any environment variables specified statically in the Docker image.
### Cluster information
A list of all services that were running when a Container was created are available to that Container as environment variables.
Those environment variables match the syntax of Docker links.
For a service named *foo* that maps to a container port named *bar*,
the following variables are defined:
```shell
FOO_SERVICE_HOST=<the host the service is running on>
FOO_SERVICE_PORT=<the port the service is running on>
```
Services have dedicated IP addresses and are available to the Container via DNS,
if [DNS addon](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/dns/) is enabled. 
{% endcapture %}
{% capture whatsnext %}
* Learn more about [Container lifecycle hooks](/docs/concepts/containers/container-lifecycle-hooks.md).
* Get hands-on experience
[attaching handlers to Container lifecycle events](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/).
{% endcapture %}
{% include templates/concept.md %}
@@ -5,89 +5,96 @@ assignees:
title: Container Lifecycle Hooks
---
This document describes the environment for Kubelet managed containers on a Kubernetes node (kNode).  In contrast to the Kubernetes cluster API, which provides an API for creating and managing containers, the Kubernetes container environment provides the container access to information about what else is going on in the cluster.
{% capture overview %}
This cluster information makes it possible to build applications that are *cluster aware*.
Additionally, the Kubernetes container environment defines a series of hooks that are surfaced to optional hook handlers defined as part of individual containers.  Container hooks are somewhat analogous to operating system signals in a traditional process model.   However these hooks are designed to make it easier to build reliable, scalable cloud applications in the Kubernetes cluster.  Containers that participate in this cluster lifecycle become *cluster native*.
This page describes how kubelet managed Containers can use the Container lifecycle hook framework
to run code triggered by events during their management lifecycle.
Another important part of the container environment is the file system that is available to the container. In Kubernetes, the filesystem is a combination of an [image](/docs/concepts/containers/images/) and one or more [volumes](/docs/concepts/storage/volumes/).
{% endcapture %}
The following sections describe both the cluster information provided to containers, as well as the hooks and life-cycle that allows containers to interact with the management system.
* TOC
{:toc}
## Cluster Information
{% capture body %}
There are two types of information that are available within the container environment.  There is information about the container itself, and there is information about other objects in the system.
## Overview
### Container Information
Analogous to many programming language frameworks that have component lifecycle hooks, such as Angular,
Kubernetes provides Containers with lifecycle hooks.
The hooks enable Containers to be aware of events in their management lifecycle
and run code implemented in a handler when the corresponding lifecycle hook is executed.
Currently, the Pod name for the pod in which the container is running is set as the hostname of the container, and is accessible through all calls to access the hostname within the container (e.g. the hostname command, or the [gethostname][1] function call in libc), but this is planned to change in the future and should not be used.
## Container hooks
The Pod name and namespace are also available as environment variables via [the downward API](/docs/tasks/configure-pod-container/downward-api-volume-expose-pod-information/#the-downward-api). Additionally, user-defined environment variables from the pod definition, are also available to the container, as are any environment variables specified statically in the Docker image.
There are two hooks that are exposed to Containers:
In the future, we anticipate expanding this information with richer information about the container.  Examples include available memory, number of restarts, and in general any state that you could get from the call to GET /pods on the API server.
`PostStart`
### Cluster Information
This hook executes immediately after a container is created.
However, there is no guarantee that the hook will execute before the container ENTRYPOINT.
No parameters are passed to the handler.
Currently the list of all services that are running at the time when the container was created via the Kubernetes Cluster API are available to the container as environment variables.  The set of environment variables matches the syntax of Docker links.
`PreStop`
For a service named **foo** that maps to a container port named **bar**, the following variables are defined:
This hook is called immediately before a container is terminated.
It is blocking, meaning it is synchronous,
so it must complete before the call to delete the container can be sent.
No parameters are passed to the handler.
```shell
FOO_SERVICE_HOST=<the host the service is running on>
FOO_SERVICE_PORT=<the port the service is running on>
```
A more detailed description of the termination behavior can be found in
[Termination of Pods](/docs/user-guide/pods/#termination-of-pods).
Services have dedicated IP address, and are also surfaced to the container via DNS (If [DNS addon](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/dns/) is enabled).  Of course DNS is still not an enumerable protocol, so we will continue to provide environment variables so that containers can do discovery.
### Hook handler implementations
## Container Hooks
Containers can access a hook by implementing and registering a handler for that hook.
There are two types of hook handlers that can be implemented for Containers:
Container hooks provide information to the container about events in its management lifecycle.  For example, immediately after a container is started, it receives a *PostStart* hook.  These hooks are broadcast *into* the container with information about the life-cycle of the container.  They are different from the events provided by Docker and other systems which are *output* from the container.  Output events provide a log of what has already happened.  Input hooks provide real-time notification about things that are happening, but no historical log.
* Exec - Executes a specific command, such as `pre-stop.sh`, inside the cgroups and namespaces of the Container.
Resources consumed by the command are counted against the Container.
* HTTP - Executes an HTTP request against a specific endpoint on the Container.
### Hook Details
### Hook handler execution
There are currently two container hooks that are surfaced to containers:
When a Container lifecycle management hook is called,
the Kubernetes management system executes the handler in the Container registered for that hook. 
*PostStart*
Hook handler calls are synchronous within the context of the Pod containing the Container.
This means that for a `PostStart` hook,
the Container ENTRYPOINT and hook fire asynchronously.
However, if the hook takes too long to run or hangs,
the Container cannot reach a `running` state.
This hook is sent immediately after a container is created.  It notifies the container that it has been created.  No parameters are passed to the handler. It is NOT guaranteed that the hook will execute before the container entrypoint.
The behavior is similar for a `PreStop` hook.
If the hook hangs during execution,
the Pod phase stays in a `running` state and never reaches `failed`.
If a `PostStart` or `PreStop` hook fails,
it kills the Container.
*PreStop*
This hook is called immediately before a container is terminated. No parameters are passed to the handler. This event handler is blocking, and must complete before the call to delete the container is sent to the Docker daemon. The SIGTERM notification sent by Docker is also still sent. A more complete description of termination behavior can be found in [Termination of Pods](/docs/user-guide/pods/#termination-of-pods).
### Hook Handler Execution
When a management hook occurs, the management system calls into any registered hook handlers in the container for that hook.  These hook handler calls are synchronous in the context of the pod containing the container. This means that for a `PostStart` hook, the container entrypoint and hook will fire asynchronously. However, if the hook takes a while to run or hangs, the container will never reach a "running" state. The behavior is similar for a `PreStop` hook. If the hook hangs during execution, the Pod phase will stay in a "running" state and never reach "failed." If a `PostStart` or `PreStop` hook fails, it will kill the container.
Typically we expect that users will make their hook handlers as lightweight as possible, but there are cases where long running commands make sense (e.g. saving state prior to container stop).
Users should make their hook handlers as lightweight as possible.
There are cases, however, when long running commands make sense,
such as when saving state prior to stopping a Container.
### Hook delivery guarantees
Hook delivery is intended to be "at least once", which means that a hook may be called multiple times for any given event (e.g. "start" or "stop") and it is up to the hook implementer to be able to handle this
correctly.
Hook delivery is intended to be *at least once*,
which means that a hook may be called multiple times for any given event,
such as for `PostStart` or `PreStop`.
It is up to the hook implementation to handle this correctly.
We expect double delivery to be rare, but in some cases if the Kubelet restarts in the middle of sending a hook, the hook may be resent after the Kubelet comes back up.
Generally, only single deliveries are made.
If, for example, an HTTP hook receiver is down and is unable to take traffic,
there is no attempt to resend.
In some rare cases, however, double delivery may occur.
For instance, if a kubelet restarts in the middle of sending a hook,
the hook might be resent after the kubelet comes back up.
Likewise, we only make a single delivery attempt. If (for example) an http hook receiver is down, and unable to take traffic, we do not make any attempts to resend.
### Debugging Hook handlers
Currently, there are (hopefully rare) scenarios where PostStart hooks may not be delivered.
### Hook Handler Implementations
Hook handlers are the way that hooks are surfaced to containers.  Containers can select the type of hook handler they would like to implement.  Kubernetes currently supports two different hook handler types:
* Exec - Executes a specific command (e.g. pre-stop.sh) inside the cgroups and namespaces of the container.  Resources consumed by the command are counted against the container.
* HTTP - Executes an HTTP request against a specific endpoint on the container.
[1]: http://man7.org/linux/man-pages/man2/gethostname.2.html
### Debugging Hook Handlers
Currently, the logs for a hook handler are not exposed in the pod events. If your handler fails for some reason, it will emit an event. For `PostStart`, this is the `FailedPostStartHook` event. For `PreStop` this is the `FailedPreStopHook` event. You can see these events by running `kubectl describe pod <pod_name>`. An example output of events from runing this command is below:
The logs for a Hook handler are not exposed in Pod events.
If a handler fails for some reason, it broadcasts an event.
For `PostStart`, this is the `FailedPostStartHook` event,
and for `PreStop`, this is the `FailedPreStopHook` event.
You can see these events by running `kubectl describe pod <pod_name>`.
Here is some example output of events from running this command:
```
Events:
@@ -102,8 +109,16 @@ Events:
37s 37s 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Killing Killing container with docker id 8df9fdfd7054: PostStart handler: Error executing in Docker Container: 1
38s 37s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "main" with RunContainerError: "PostStart handler: Error executing in Docker Container: 1"
1m 22s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Warning FailedPostStartHook
```
```
## What's Next
{% endcapture %}
- See an example of [using container lifecycle hooks](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)
{% capture whatsnext %}
* Learn more about the [Container environment](/docs/concepts/containers/container-environment-variables.md).
* Get hands-on experience
[attaching handlers to Container lifecycle events](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/).
{% endcapture %}
{% include templates/concept.md %}
+8 -2
View File
@@ -5,15 +5,17 @@ assignees:
title: Images
---
Each container in a pod has its own image. Currently, the only type of image supported is a [Docker Image](https://docs.docker.com/engine/tutorials/dockerimages/).
{% capture overview %}
You create your Docker image and push it to a registry before referring to it in a Kubernetes pod.
The `image` property of a container supports the same syntax as the `docker` command does, including private registries and tags.
* TOC
{% endcapture %}
{:toc}
{% capture body %}
## Updating Images
@@ -318,3 +320,7 @@ common use cases and suggested solutions.
- run a private registry with authorization required.
- generate registry credential for each tenant, put into secret, and populate secret to each tenant namespace.
- tenant adds that secret to imagePullSecrets of each namespace.
{% endcapture %}
{% include templates/concept.md %}
+10 -2
View File
@@ -7,18 +7,22 @@ assignees:
title: Volumes
---
{% capture overview %}
On-disk files in a container are ephemeral, which presents some problems for
non-trivial applications when running in containers. First, when a container
crashes kubelet will restart it, but the files will be lost - the
crashes, kubelet will restart it, but the files will be lost - the
container starts with a clean state. Second, when running containers together
in a `Pod` it is often necessary to share files between those containers. The
Kubernetes `Volume` abstraction solves both of these problems.
Familiarity with [pods](/docs/user-guide/pods) is suggested.
* TOC
{% endcapture %}
{:toc}
{% capture body %}
## Background
@@ -626,3 +630,7 @@ In the future, we expect that `emptyDir` and `hostPath` volumes will be able to
request a certain amount of space using a [resource](/docs/user-guide/compute-resources)
specification, and to select the type of media to use, for clusters that have
several media types.
{% endcapture %}
{% include templates/concept.md %}
@@ -274,7 +274,7 @@ spec:
* Get hands-on experience
[configuring liveness and readiness probes](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/).
* [Container Lifecycle Hooks](/docs/concepts/containers/container-lifecycle-hooks/)
* Learn more about [Container lifecycle hooks](/docs/concepts/containers/container-lifecycle-hooks/).
{% endcapture %}
@@ -3767,14 +3767,14 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">postStart</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details">http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_handler">v1.Handler</a></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">preStop</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details">http://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks#hook-details</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_handler">v1.Handler</a></p></td>
<td class="tableblock halign-left valign-top"></td>
+3 -3
View File
@@ -166,7 +166,7 @@ Appears In <a href="#podstatus-v1-core">PodStatus</a> </aside>
<tbody>
<tr>
<td>containerID <br /> <em>string</em></td>
<td>Container&#39;s ID in the format &#39;docker://<container_id>&#39;. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#container-information">http://kubernetes.io/docs/user-guide/container-environment#container-information</a></td>
<td>Container&#39;s ID in the format &#39;docker://<container_id>&#39;. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-environment-variables/#container-information">http://kubernetes.io/docs/concepts/containers/container-environment-variables/#container-information</a></td>
</tr>
<tr>
<td>image <br /> <em>string</em></td>
@@ -8275,11 +8275,11 @@ Appears In <a href="#container-v1-core">Container</a> </aside>
<tbody>
<tr>
<td>postStart <br /> <em><a href="#handler-v1-core">Handler</a></em></td>
<td>PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></td>
<td>PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-environment-variables/#hook-details">http://kubernetes.io/docs/concepts/containers/container-environment-variables/#hook-details</a></td>
</tr>
<tr>
<td>preStop <br /> <em><a href="#handler-v1-core">Handler</a></em></td>
<td>PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/user-guide/container-environment#hook-details">http://kubernetes.io/docs/user-guide/container-environment#hook-details</a></td>
<td>PreStop is called immediately before a container is terminated. The container is terminated after the handler completes. The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated. Other management of the container blocks until the hook completes. More info: <a href="http://kubernetes.io/docs/concepts/containers/container-environment-variables/#hook-details">http://kubernetes.io/docs/concepts/containers/container-environment-variables/#hook-details</a></td>
</tr>
</tbody>
</table>
+1 -1
View File
@@ -70,7 +70,7 @@ project](/docs/admin/salt).
## Security
* **Kubernetes Container Environment** ([docs/user-guide/container-environment](/docs/concepts/containers/container-lifecycle-hooks/)):
* **Kubernetes Container Environment** ([/docs/concepts/containers/container-environment-variables/](/docs/concepts/containers/container-environment-variables/)):
Describes the environment for Kubelet managed containers on a Kubernetes
node.
+1 -1
View File
@@ -4,4 +4,4 @@ title: Container Lifecycle Hooks
{% include user-guide-content-moved.md %}
[Container Lifecycle Hooks](/docs/concepts/containers/container-lifecycle-hooks/)
[Container Lifecycle Hooks](/docs/concepts/containers/container-lifecycle-hooks/)