From 614983564767e386781c8384873da3b192e9560f Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Sun, 13 Mar 2022 21:08:39 +0800 Subject: [PATCH] Tweak the downward API volume task page This PR drops some outdated information about very old Kubernetes versions. The last section is improved so that readers get a better idea why those pointers are provided. --- ...nward-api-volume-expose-pod-information.md | 96 ++++++++++--------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md b/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md index 579adcb736..d50b3e91a5 100644 --- a/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md +++ b/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md @@ -6,20 +6,15 @@ weight: 40 -This page shows how a Pod can use a DownwardAPIVolumeFile to expose information -about itself to Containers running in the Pod. A DownwardAPIVolumeFile can expose -Pod fields and Container fields. - - - +This page shows how a Pod can use a +[`DownwardAPIVolumeFile`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core) +to expose information about itself to Containers running in the Pod. +A `DownwardAPIVolumeFile` can expose Pod fields and Container fields. ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - - ## The Downward API @@ -27,10 +22,10 @@ Pod fields and Container fields. There are two ways to expose Pod and Container fields to a running Container: * [Environment variables](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#the-downward-api) -* Volume Files +* Volume files Together, these two ways of exposing Pod and Container fields are called the -*Downward API*. +"Downward API". ## Store Pod fields @@ -60,13 +55,13 @@ Create the Pod: kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume.yaml ``` -Verify that the Container in the Pod is running: +Verify that the container in the Pod is running: ```shell kubectl get pods ``` -View the Container's logs: +View the container's logs: ```shell kubectl logs kubernetes-downwardapi-volume-example @@ -83,7 +78,7 @@ build="two" builder="john-doe" ``` -Get a shell into the Container that is running in your Pod: +Get a shell into the container that is running in your Pod: ```shell kubectl exec -it kubernetes-downwardapi-volume-example -- sh @@ -136,8 +131,7 @@ total 8 Using symbolic links enables dynamic atomic refresh of the metadata; updates are written to a new temporary directory, and the `..data` symlink is updated -atomically using -[rename(2)](http://man7.org/linux/man-pages/man2/rename.2.html). +atomically using [rename(2)](http://man7.org/linux/man-pages/man2/rename.2.html). {{< note >}} A container using Downward API as a @@ -153,17 +147,19 @@ Exit the shell: ## Store Container fields -The preceding exercise, you stored Pod fields in a DownwardAPIVolumeFile. +The preceding exercise, you stored Pod fields in a +[`DownwardAPIVolumeFile`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core).. In this next exercise, you store Container fields. Here is the configuration file for a Pod that has one Container: {{< codenew file="pods/inject/dapi-volume-resources.yaml" >}} -In the configuration file, you can see that the Pod has a `downwardAPI` Volume, -and the Container mounts the Volume at `/etc/podinfo`. +In the configuration file, you can see that the Pod has a +[`downwardAPI` volume](/concepts/storage/volumes/#downwardapi), +and the Container mounts the volume at `/etc/podinfo`. Look at the `items` array under `downwardAPI`. Each element of the array is a -DownwardAPIVolumeFile. +[`DownwardAPIVolumeFile`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core). The first element specifies that in the Container named `client-container`, the value of the `limits.cpu` field in the format specified by `1m` should be @@ -176,7 +172,7 @@ Create the Pod: kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume-resources.yaml ``` -Get a shell into the Container that is running in your Pod: +Get a shell into the container that is running in your Pod: ```shell kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh @@ -187,46 +183,56 @@ In your shell, view the `cpu_limit` file: ```shell /# cat /etc/podinfo/cpu_limit ``` + You can use similar commands to view the `cpu_request`, `mem_limit` and `mem_request` files. - - + ## Capabilities of the Downward API The following information is available to containers through environment variables and `downwardAPI` volumes: * Information available via `fieldRef`: + * `metadata.name` - the pod's name * `metadata.namespace` - the pod's namespace * `metadata.uid` - the pod's UID - * `metadata.labels['']` - the value of the pod's label `` (for example, `metadata.labels['mylabel']`) - * `metadata.annotations['']` - the value of the pod's annotation `` (for example, `metadata.annotations['myannotation']`) + * `metadata.labels['']` - the value of the pod's label `` + (for example, `metadata.labels['mylabel']`) + * `metadata.annotations['']` - the value of the pod's annotation `` + (for example, `metadata.annotations['myannotation']`) + * Information available via `resourceFieldRef`: + * A Container's CPU limit * A Container's CPU request * A Container's memory limit * A Container's memory request - * A Container's hugepages limit (providing that the `DownwardAPIHugePages` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) is enabled) - * A Container's hugepages request (providing that the `DownwardAPIHugePages` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) is enabled) + * A Container's hugepages limit (provided that the `DownwardAPIHugePages` + [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) is enabled) + * A Container's hugepages request (provided that the `DownwardAPIHugePages` + [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) is enabled) * A Container's ephemeral-storage limit * A Container's ephemeral-storage request In addition, the following information is available through `downwardAPI` volume `fieldRef`: -* `metadata.labels` - all of the pod's labels, formatted as `label-key="escaped-label-value"` with one label per line -* `metadata.annotations` - all of the pod's annotations, formatted as `annotation-key="escaped-annotation-value"` with one annotation per line +* `metadata.labels` - all of the pod's labels, formatted as `label-key="escaped-label-value"` + with one label per line +* `metadata.annotations` - all of the pod's annotations, formatted as + `annotation-key="escaped-annotation-value"` with one annotation per line The following information is available through environment variables: * `status.podIP` - the pod's IP address -* `spec.serviceAccountName` - the pod's service account name, available since v1.4.0-alpha.3 -* `spec.nodeName` - the node's name, available since v1.4.0-alpha.3 -* `status.hostIP` - the node's IP, available since v1.7.0-alpha.1 +* `spec.serviceAccountName` - the pod's service account name +* `spec.nodeName` - the name of the node to which the scheduler always attempts to + schedule the pod +* `status.hostIP` - the IP of the node to which the Pod is assigned {{< note >}} If CPU and memory limits are not specified for a Container, the @@ -241,7 +247,7 @@ basis. For more information, see ## Motivation for the Downward API -It is sometimes useful for a Container to have information about itself, without +It is sometimes useful for a container to have information about itself, without being overly coupled to Kubernetes. The Downward API allows containers to consume information about themselves or the cluster without using the Kubernetes client or API server. @@ -252,19 +258,17 @@ application, but that is tedious and error prone, and it violates the goal of lo coupling. A better option would be to use the Pod's name as an identifier, and inject the Pod's name into the well-known environment variable. - - - ## {{% heading "whatsnext" %}} - -* [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) -* [Volume](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#volume-v1-core) -* [DownwardAPIVolumeSource](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumesource-v1-core) -* [DownwardAPIVolumeFile](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core) -* [ResourceFieldSelector](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcefieldselector-v1-core) - - - - +* Check the [`PodSpec`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) + API definition which defines the desired state of a Pod. +* Check the [`Volume`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#volume-v1-core) + API definition which defines a generic volume in a Pod for containers to access. +* Check the [`DownwardAPIVolumeSource`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumesource-v1-core) + API definition which defines a volume that contains Downward API information. +* Check the [`DownwardAPIVolumeFile`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core) + API definition which contains references to object or resource fields for + populating a file in the Downward API volume. +* Check the [`ResourceFieldSelector`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcefieldselector-v1-core) + API definition which specifies the container resources and their output format.