Configuration Best Practices

    This is a living document. If you think of something that is not on this list but might be useful to others, please don’t hesitate to file an issue or submit a PR.

    • When defining configurations, specify the latest stable API version.

    • Configuration files should be stored in version control before being pushed to the cluster. This allows you to quickly roll back a configuration change if necessary. It also aids cluster re-creation and restoration.

    • Group related objects into a single file whenever it makes sense. One file is often easier to manage than several. See the file as an example of this syntax.

    • Note also that many commands can be called on a directory. For example, you can call kubectl apply on a directory of config files.

    • Don’t specify default values unnecessarily: simple, minimal configuration will make errors less likely.

    • Don’t use naked Pods (that is, Pods not bound to a or Deployment) if you can avoid it. Naked Pods will not be rescheduled in the event of a node failure.

      A Deployment, which both creates a ReplicaSet to ensure that the desired number of Pods is always available, and specifies a strategy to replace Pods (such as ), is almost always preferable to creating Pods directly, except for some explicit restartPolicy: Never scenarios. A may also be appropriate.

    • Create a before its corresponding backend workloads (Deployments or ReplicaSets), and before any workloads that need to access it. When Kubernetes starts a container, it provides environment variables pointing to all the Services which were running when the container was started. For example, if a Service named foo exists, all containers will get the following variables in their initial environment:

      This does imply an ordering requirement - any Service that a Pod wants to access must be created before the Pod itself, or else the environment variables will not be populated. DNS does not have this restriction.

    • An optional (though strongly recommended) cluster add-on is a DNS server. The DNS server watches the Kubernetes API for new Services and creates a set of DNS records for each. If DNS has been enabled throughout the cluster then all Pods should be able to do name resolution of Services automatically.

    • Avoid using hostNetwork, for the same reasons as hostPort.

    • Use (which have a ClusterIP of None) for service discovery when you don’t need kube-proxy load balancing.

    • Define and use that identify semantic attributes of your application or Deployment, such as . You can use these labels to select the appropriate Pods for other resources; for example, a Service that selects all tier: frontend Pods, or all phase: test components of app.kubernetes.io/name: MyApp. See the guestbook app for examples of this approach.

    A Service can be made to span multiple Deployments by omitting release-specific labels from its selector. When you need to update a running service without downtime, use a .

    A desired state of an object is described by a Deployment, and if changes to that spec are applied, the deployment controller changes the actual state to the desired state at a controlled rate.

    • Use the Kubernetes common labels for common use cases. These standardized labels enrich the metadata in a way that allows tools, including kubectl and , to work in an interoperable way.

    • You can manipulate labels for debugging. Because Kubernetes controllers (such as ReplicaSet) and Services match to Pods using selector labels, removing the relevant labels from a Pod will stop it from being considered by a controller or from being served traffic by a Service. If you remove the labels of an existing Pod, its controller will create a new Pod to take its place. This is a useful way to debug a previously “live” Pod in a “quarantine” environment. To interactively remove or add labels, use kubectl label.

    • Use kubectl apply -f <directory>. This looks for Kubernetes configuration in all .yaml, .yml, and .json files in <directory> and passes it to apply.