WARNING WARNING WARNING WARNING WARNING

PLEASE NOTE: This document applies to the HEAD of the source tree

If you are using a released version of Kubernetes, you should refer to the docs that go with that version. The latest release of this document can be found [here](http://releases.k8s.io/release-1.1/docs/user-guide/production-pods.md). Documentation for other releases can be found at [releases.k8s.io](http://releases.k8s.io). -- # Kubernetes User Guide: Managing Applications: Working with pods and containers in production **Table of Contents** - [Kubernetes User Guide: Managing Applications: Working with pods and containers in production](#kubernetes-user-guide-managing-applications-working-with-pods-and-containers-in-production) - [Persistent storage](#persistent-storage) - [Distributing credentials](#distributing-credentials) - [Authenticating with a private image registry](#authenticating-with-a-private-image-registry) - [Helper containers](#helper-containers) - [Resource management](#resource-management) - [Liveness and readiness probes (aka health checks)](#liveness-and-readiness-probes-aka-health-checks) - [Lifecycle hooks and termination notice](#lifecycle-hooks-and-termination-notice) - [Termination message](#termination-message) - [What's next?](#whats-next) You’ve seen [how to configure and deploy pods and containers](configuring-containers.md), using some of the most common configuration parameters. This section dives into additional features that are especially useful for running applications in production. ## Persistent storage The container file system only lives as long as the container does, so when a container crashes and restarts, changes to the filesystem will be lost and the container will restart from a clean slate. To access more-persistent storage, outside the container file system, you need a [*volume*](volumes.md). This is especially important to stateful applications, such as key-value stores and databases. For example, [Redis](http://redis.io/) is a key-value cache and store, which we use in the [guestbook](../../examples/guestbook/) and other examples. We can add a volume to it to store persistent data as follows: ```yaml apiVersion: v1 kind: ReplicationController metadata: name: redis spec: template: metadata: labels: app: redis tier: backend spec: # Provision a fresh volume for the pod volumes: - name: data emptyDir: {} containers: - name: redis image: kubernetes/redis:v1 ports: - containerPort: 6379 # Mount the volume into the pod volumeMounts: - mountPath: /redis-master-data name: data # must match the name of the volume, above ``` `emptyDir` volumes live for the lifespan of the [pod](pods.md), which is longer than the lifespan of any one container, so if the container fails and is restarted, our storage will live on. In addition to the local disk storage provided by `emptyDir`, Kubernetes supports many different network-attached storage solutions, including PD on GCE and EBS on EC2, which are preferred for critical data, and will handle details such as mounting and unmounting the devices on the nodes. See [the volumes doc](volumes.md) for more details. ## Distributing credentials Many applications need credentials, such as passwords, OAuth tokens, and TLS keys, to authenticate with other applications, databases, and services. Storing these credentials in container images or environment variables is less than ideal, since the credentials can then be copied by anyone with access to the image, pod/container specification, host file system, or host Docker daemon. Kubernetes provides a mechanism, called [*secrets*](secrets.md), that facilitates delivery of sensitive credentials to applications. A `Secret` is a simple resource containing a map of data. For instance, a simple secret with a username and password might look as follows: ```yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: dmFsdWUtMg0K username: dmFsdWUtMQ0K ``` As with other resources, this secret can be instantiated using `create` and can be viewed with `get`: ```console $ kubectl create -f ./secret.yaml secrets/mysecret $ kubectl get secrets NAME TYPE DATA default-token-v9pyz kubernetes.io/service-account-token 2 mysecret Opaque 2 ``` To use the secret, you need to reference it in a pod or pod template. The `secret` volume source enables you to mount it as an in-memory directory into your containers. ```yaml apiVersion: v1 kind: ReplicationController metadata: name: redis spec: template: metadata: labels: app: redis tier: backend spec: volumes: - name: data emptyDir: {} - name: supersecret secret: secretName: mysecret containers: - name: redis image: kubernetes/redis:v1 ports: - containerPort: 6379 # Mount the volume into the pod volumeMounts: - mountPath: /redis-master-data name: data # must match the name of the volume, above - mountPath: /var/run/secrets/super name: supersecret ``` For more details, see the [secrets document](secrets.md), [example](secrets/) and [design doc](../../docs/design/secrets.md). ## Authenticating with a private image registry Secrets can also be used to pass [image registry credentials](images.md#using-a-private-registry). First, create a `.docker/config.json`, such as by running `docker login `. Then put the resulting `.docker/config.json` file into a [secret resource](secrets.md). For example: ```console $ docker login Username: janedoe Password: ●●●●●●●●●●● Email: jdoe@example.com WARNING: login credentials saved in /Users/jdoe/.docker/config.json. Login Succeeded $ echo $(cat ~/.docker/config.json) { "https://index.docker.io/v1/": { "auth": "ZmFrZXBhc3N3b3JkMTIK", "email": "jdoe@example.com" } } $ cat ~/.docker/config.json | base64 eyAiaHR0cHM6Ly9pbmRleC5kb2NrZXIuaW8vdjEvIjogeyAiYXV0aCI6ICJabUZyWlhCaGMzTjNiM0prTVRJSyIsICJlbWFpbCI6ICJqZG9lQGV4YW1wbGUuY29tIiB9IH0K $ cat > /tmp/image-pull-secret.yaml < /dev/termination-log"] ``` The message is recorded along with the other state of the last (i.e., most recent) termination: ```console $ kubectl create -f ./pod.yaml pods/pod-w-message $ sleep 70 $ kubectl get pods/pod-w-message -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.message}}{{end}}" Sleep expired $ kubectl get pods/pod-w-message -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.exitCode}}{{end}}" 0 ``` ## What's next? [Learn more about managing deployments.](managing-deployments.md) [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/production-pods.md?pixel)]()