Convert site to Hugo (#8316)
This commit converts content and layout to use Hugo.
This commit is contained in:
committed by
k8s-ci-robot
parent
7745f0e0c5
commit
7f3b633aa0
Executable
+5
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: "Overview"
|
||||
weight: 20
|
||||
---
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
---
|
||||
reviewers:
|
||||
- lavalamp
|
||||
title: Kubernetes Components
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
This document outlines the various binary components needed to
|
||||
deliver a functioning Kubernetes cluster.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
## Master Components
|
||||
|
||||
Master components provide the cluster's control plane. Master components make global decisions about the
|
||||
cluster (for example, scheduling), and detecting and responding to cluster events (starting up a new pod when a replication controller's 'replicas' field is unsatisfied).
|
||||
|
||||
Master components can be run on any machine in the cluster. However,
|
||||
for simplicity, set up scripts typically start all master components on
|
||||
the same machine, and do not run user containers on this machine. See
|
||||
[Building High-Availability Clusters](/docs/admin/high-availability/) for an example multi-master-VM setup.
|
||||
|
||||
### kube-apiserver
|
||||
|
||||
{{< glossary_definition term_id="kube-apiserver" length="all" >}}
|
||||
|
||||
### etcd
|
||||
|
||||
{{< glossary_definition term_id="etcd" length="all" >}}
|
||||
|
||||
### kube-scheduler
|
||||
|
||||
{{< glossary_definition term_id="kube-scheduler" length="all" >}}
|
||||
|
||||
### kube-controller-manager
|
||||
|
||||
{{< glossary_definition term_id="kube-controller-manager" length="all" >}}
|
||||
|
||||
These controllers include:
|
||||
|
||||
* Node Controller: Responsible for noticing and responding when nodes go down.
|
||||
* Replication Controller: Responsible for maintaining the correct number of pods for every replication
|
||||
controller object in the system.
|
||||
* Endpoints Controller: Populates the Endpoints object (that is, joins Services & Pods).
|
||||
* Service Account & Token Controllers: Create default accounts and API access tokens for new namespaces.
|
||||
|
||||
### cloud-controller-manager
|
||||
|
||||
[cloud-controller-manager](/docs/tasks/administer-cluster/running-cloud-controller/) runs controllers that interact with the underlying cloud providers. The cloud-controller-manager binary is an alpha feature introduced in Kubernetes release 1.6.
|
||||
|
||||
cloud-controller-manager runs cloud-provider-specific controller loops only. You must disable these controller loops in the kube-controller-manager. You can disable the controller loops by setting the `--cloud-provider` flag to `external` when starting the kube-controller-manager.
|
||||
|
||||
cloud-controller-manager allows cloud vendors code and the Kubernetes core to evolve independent of each other. In prior releases, the core Kubernetes code was dependent upon cloud-provider-specific code for functionality. In future releases, code specific to cloud vendors should be maintained by the cloud vendor themselves, and linked to cloud-controller-manager while running Kubernetes.
|
||||
|
||||
The following controllers have cloud provider dependencies:
|
||||
|
||||
* Node Controller: For checking the cloud provider to determine if a node has been deleted in the cloud after it stops responding
|
||||
* Route Controller: For setting up routes in the underlying cloud infrastructure
|
||||
* Service Controller: For creating, updating and deleting cloud provider load balancers
|
||||
* Volume Controller: For creating, attaching, and mounting volumes, and interacting with the cloud provider to orchestrate volumes
|
||||
|
||||
## Node Components
|
||||
|
||||
Node components run on every node, maintaining running pods and providing the Kubernetes runtime environment.
|
||||
|
||||
### kubelet
|
||||
|
||||
{{< glossary_definition term_id="kubelet" length="all" >}}
|
||||
|
||||
### kube-proxy
|
||||
|
||||
[kube-proxy](/docs/admin/kube-proxy/) enables the Kubernetes service abstraction by maintaining
|
||||
network rules on the host and performing connection forwarding.
|
||||
|
||||
### Container Runtime
|
||||
|
||||
The container runtime is the software that is responsible for running containers. Kubernetes supports several runtimes: [Docker](http://www.docker.com), [rkt](https://coreos.com/rkt/), [runc](https://github.com/opencontainers/runc) and any OCI [runtime-spec](https://github.com/opencontainers/runtime-spec) implementation.
|
||||
|
||||
## Addons
|
||||
|
||||
Addons are pods and services that implement cluster features. The pods may be managed
|
||||
by Deployments, ReplicationControllers, and so on. Namespaced addon objects are created in
|
||||
the `kube-system` namespace.
|
||||
|
||||
Selected addons are described below, for an extended list of available addons please see [Addons](/docs/concepts/cluster-administration/addons/).
|
||||
|
||||
### DNS
|
||||
|
||||
While the other addons are not strictly required, all Kubernetes clusters should have [cluster DNS](/docs/concepts/services-networking/dns-pod-service/), as many examples rely on it.
|
||||
|
||||
Cluster DNS is a DNS server, in addition to the other DNS server(s) in your environment, which serves DNS records for Kubernetes services.
|
||||
|
||||
Containers started by Kubernetes automatically include this DNS server in their DNS searches.
|
||||
|
||||
### Web UI (Dashboard)
|
||||
|
||||
[Dashboard](/docs/tasks/access-application-cluster/web-ui-dashboard/) is a general purpose, web-based UI for Kubernetes clusters. It allows users to manage and troubleshoot applications running in the cluster, as well as the cluster itself.
|
||||
|
||||
### Container Resource Monitoring
|
||||
|
||||
[Container Resource Monitoring](/docs/tasks/debug-application-cluster/resource-usage-monitoring/) records generic time-series metrics
|
||||
about containers in a central database, and provides a UI for browsing that data.
|
||||
|
||||
### Cluster-level Logging
|
||||
|
||||
A [Cluster-level logging](/docs/concepts/cluster-administration/logging/) mechanism is responsible for
|
||||
saving container logs to a central log store with search/browsing interface.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
---
|
||||
title: Extending your Kubernetes Cluster
|
||||
reviewers:
|
||||
- erictune
|
||||
- lavalamp
|
||||
- cheftako
|
||||
- chenopis
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
|
||||
Kubernetes is highly configurable and extensible. As a result,
|
||||
there is rarely a need to fork or submit patches to the Kubernetes
|
||||
project code.
|
||||
|
||||
This guide describes the options for customizing a Kubernetes
|
||||
cluster. It is aimed at {{< glossary_tooltip text="Cluster Operators" term_id="cluster-operator" >}} who want to
|
||||
understand how to adapt their Kubernetes cluster to the needs of
|
||||
their work environment. Developers who are prospective {{< glossary_tooltip text="Platform Developers" term_id="platform-developer" >}} or Kubernetes Project {{< glossary_tooltip text="Contributors" term_id="contributor" >}} will also find it
|
||||
useful as an introduction to what extension points and patterns
|
||||
exist, and their trade-offs and limitations.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## Overview
|
||||
|
||||
Customization approaches can be broadly divided into *configuration*, which only involves changing flags, local configuration files, or API resources; and *extensions*, which involve running additional programs or services. This document is primarily about extensions.
|
||||
|
||||
## Configuration
|
||||
|
||||
*Configuration files* and *flags* are documented in the Reference section of the online documentation, under each binary:
|
||||
|
||||
* [kubelet](/docs/admin/kubelet/)
|
||||
* [kube-apiserver](/docs/admin/kube-apiserver/)
|
||||
* [kube-controller-manager](/docs/admin/kube-controller-manager/)
|
||||
* [kube-scheduler](/docs/admin/kube-scheduler/).
|
||||
|
||||
Flags and configuration files may not always be changeable in a hosted Kubernetes service or a distribution with managed installation. When they are changeable, they are usually only changeable by the cluster administrator. Also, they are subject to change in future Kubernetes versions, and setting them may require restarting processes. For those reasons, they should be used only when there are no other options.
|
||||
|
||||
*Built-in Policy APIs*, such as [ResourceQuota](/docs/concepts/policy/resource-quotas/), [PodSecurityPolicies](/docs/concepts/policy/pod-security-policy/), [NetworkPolicy](/docs/concepts/services-networking/network-policies/) and Role-based Access Control ([RBAC](/docs/admin/authorization/rbac/)), are built-in Kubernetes APIs. APIs are typically used with hosted Kubernetes services and with managed Kubernetes installations. They are declarative and use the same conventions as other Kubernetes resources like pods, so new cluster configuration can be repeatable and be managed the same way as applications. And, where they are stable, they enjoy a [defined support policy](/docs/reference/deprecation-policy/) like other Kubernetes APIs. For these reasons, they are preferred over *configuration files* and *flags* where suitable.
|
||||
|
||||
## Extensions
|
||||
|
||||
Extensions are software components that extend and deeply integrate with Kubernetes.
|
||||
They adapt it to support new types and new kinds of hardware.
|
||||
|
||||
Most cluster administrators will use a hosted or distribution
|
||||
instance of Kubernetes. As a result, most Kubernetes users will need to
|
||||
install extensions and fewer will need to author new ones.
|
||||
|
||||
## Extension Patterns
|
||||
|
||||
Kubernetes is designed to be automated by writing client programs. Any
|
||||
program that reads and/or writes to the Kubernetes API can provide useful
|
||||
automation. *Automation* can run on the cluster or off it. By following
|
||||
the guidance in this doc you can write highly available and robust automation.
|
||||
Automation generally works with any Kubernetes cluster, including hosted
|
||||
clusters and managed installations.
|
||||
|
||||
There is a specific pattern for writing client programs that work well with
|
||||
Kubernetes called the *Controller* pattern. Controllers typically read an
|
||||
object's `.spec`, possibly do things, and then update the object's `.status`.
|
||||
|
||||
A controller is a client of Kubernetes. When Kubernetes is the client and
|
||||
calls out to a remote service, it is called a *Webhook*. The remote service
|
||||
is called a *Webhook Backend*. Like Controllers, Webhooks do add a point of
|
||||
failure.
|
||||
|
||||
In the webhook model, Kubernetes makes a network request to a remote service.
|
||||
In the *Binary Plugin* model, Kubernetes executes a binary (program).
|
||||
Binary plugins are used by the kubelet (e.g. [Flex Volume
|
||||
Plugins](https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md)
|
||||
and [Network
|
||||
Plugins](/docs/concepts/cluster-administration/network-plugins/))
|
||||
and by kubectl.
|
||||
|
||||
Below is a diagram showing how the extensions points interact with the
|
||||
Kubernetes control plane.
|
||||
|
||||
<img src="https://docs.google.com/drawings/d/e/2PACX-1vQBRWyXLVUlQPlp7BvxvV9S1mxyXSM6rAc_cbLANvKlu6kCCf-kGTporTMIeG5GZtUdxXz1xowN7RmL/pub?w=960&h=720">
|
||||
|
||||
<!-- image source drawing https://docs.google.com/drawings/d/1muJ7Oxuj_7Gtv7HV9-2zJbOnkQJnjxq-v1ym_kZfB-4/edit?ts=5a01e054 -->
|
||||
|
||||
|
||||
## Extension Points
|
||||
|
||||
This diagram shows the extension points in a Kubernetes system.
|
||||
|
||||
<img src="https://docs.google.com/drawings/d/e/2PACX-1vSH5ZWUO2jH9f34YHenhnCd14baEb4vT-pzfxeFC7NzdNqRDgdz4DDAVqArtH4onOGqh0bhwMX0zGBb/pub?w=425&h=809">
|
||||
|
||||
<!-- image source diagrams: https://docs.google.com/drawings/d/1k2YdJgNTtNfW7_A8moIIkij-DmVgEhNrn3y2OODwqQQ/view -->
|
||||
|
||||
1. Users often interact with the Kubernetes API using `kubectl`. [Kubectl plugins](/docs/tasks/extend-kubectl/kubectl-plugins/) extend the kubectl binary. They only affect the individual user's local environment, and so cannot enforce site-wide policies.
|
||||
2. The apiserver handles all requests. Several types of extension points in the apiserver allow authenticating requests, or blocking them based on their content, editing content, and handling deletion. These are described in the [API Access Extensions](/docs/concepts/overview/extending#api-access-extensions) section.
|
||||
3. The apiserver serves various kinds of *resources*. *Built-in resource kinds*, like `pods`, are defined by the Kubernetes project and can't be changed. You can also add resources that you define, or that other projects have defined, called *Custom Resources*, as explained in the [Custom Resources](/docs/concepts/overview/extending#user-defined-types) section. Custom Resources are often used with API Access Extensions.
|
||||
4. The Kubernetes scheduler decides which nodes to place pods on. There are several ways to extend scheduling. These are described in the [Scheduler Extensions](/docs/concepts/overview/extending#scheduler-extensions) section.
|
||||
5. Much of the behavior of Kubernetes is implemented by programs called Controllers which are clients of the API-Server. Controllers are often used in conjunction with Custom Resources.
|
||||
6. The kubelet runs on servers, and helps pods appear like virtual servers with their own IPs on the cluster network. [Network Plugins](/docs/concepts/overview/extending#network-plugins) allow for different implementations of pod networking.
|
||||
7. The kubelet also mounts and unmounts volumes for containers. New types of storage can be supported via [Storage Plugins](/docs/concepts/overview/extending#storage-plugins).
|
||||
|
||||
If you are unsure where to start, this flowchart can help. Note that some solutions may involve several types of extensions.
|
||||
|
||||
|
||||
<img src="https://docs.google.com/drawings/d/e/2PACX-1vRWXNNIVWFDqzDY0CsKZJY3AR8sDeFDXItdc5awYxVH8s0OLherMlEPVUpxPIB1CSUu7GPk7B2fEnzM/pub?w=1440&h=1080">
|
||||
|
||||
<!-- image source drawing: https://docs.google.com/drawings/d/1sdviU6lDz4BpnzJNHfNpQrqI9F19QZ07KnhnxVrp2yg/edit -->
|
||||
|
||||
## API Extensions
|
||||
### User-Defined Types
|
||||
|
||||
Consider adding a Custom Resource to Kubernetes if you want to define new controllers, application configuration objects or other declarative APIs, and to manage them using Kubernetes tools, such as `kubectl`.
|
||||
|
||||
Do not use a Custom Resource as data storage for application, user, or monitoring data.
|
||||
|
||||
For more about Custom Resources, see the [Custom Resources concept guide](/docs/concepts/api-extension/custom-resources/).
|
||||
|
||||
|
||||
### Combining New APIs with Automation
|
||||
|
||||
Often, when you add a new API, you also add a control loop that reads and/or writes the new APIs. When the combination of a Custom API and a control loop is used to manage a specific, usually stateful, application, this is called the *Operator* pattern. Custom APIs and control loops can also be used to control other resources, such as storage, policies, and so on.
|
||||
|
||||
### Changing Built-in Resources
|
||||
|
||||
When you extend the Kubernetes API by adding custom resources, the added resources always fall into a new API Groups. You cannot replace or change existing API groups.
|
||||
Adding an API does not directly let you affect the behavior of existing APIs (e.g. Pods), but API Access Extensions do.
|
||||
|
||||
|
||||
### API Access Extensions
|
||||
|
||||
When a request reaches the Kubernetes API Server, it is first Authenticated, then Authorized, then subject to various types of Admission Control. See [[Accessing the API](/docs/admin/accessing-the-api/)] for more on this flow.
|
||||
|
||||
Each of these steps offers extension points.
|
||||
|
||||
Kubernetes has several built-in authentication methods that it supports. It can also sit behind an authenticating proxy, and it can send a token from an Authorization header to a remote service for verification (a webhook). All of these methods are covered in the [Authentication documentation](/docs/admin/authentication/).
|
||||
|
||||
### Authentication
|
||||
|
||||
[Authentication](/docs/admin/authentication) maps headers or certificates in all requests to a username for the client making the request.
|
||||
|
||||
Kubernetes provides several built-in authentication methods, and an [Authentication webhook](/docs/admin/authentication/#webhook-token-authentication) method if those don't meet your needs.
|
||||
|
||||
|
||||
### Authorization
|
||||
|
||||
[Authorization](/docs/admin/authorization/webhook/) determines whether specific users can read, write, and do other operations on API resources. It just works at the level of whole resources -- it doesn't discriminate based on arbitrary object fields. If the built-in authorization options don't meet your needs, and [Authorization webhook](/docs/admin/authorization/webhook/) allows calling out to user-provided code to make an authorization decision.
|
||||
|
||||
|
||||
### Dynamic Admission Control
|
||||
|
||||
After a request is authorized, if it is a write operation, it also goes through [Admission Control](/docs/admin/admission-controllers/) steps. In addition to the built-in steps, there are several extensions:
|
||||
|
||||
* The [Image Policy webhook](/docs/admin/admission-controllers/#imagepolicywebhook) restricts what images can be run in containers.
|
||||
* To make arbitrary admission control decisions, a general [Admission webhook](/docs/admin/extensible-admission-controllers/#external-admission-webhooks) can be used. Admission Webhooks can reject creations or updates.
|
||||
* [Initializers](/docs/admin/extensible-admission-controllers/#initializers) are controllers that can modify objects before they are created. Initializers can modify initial object creations but cannot affect updates to objects. Initializers can also reject objects.
|
||||
|
||||
## Infrastructure Extensions
|
||||
|
||||
|
||||
### Storage Plugins
|
||||
|
||||
[Flex Volumes](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/flexvolume-deployment.md
|
||||
) allow users to mount volume types without built-in support by having the
|
||||
Kubelet call a Binary Plugin to mount the volume.
|
||||
|
||||
|
||||
### Device Plugins
|
||||
|
||||
Device plugins allow a node to discover new Node resources (in addition to the
|
||||
builtin ones like cpu and memory) via a [Device
|
||||
Plugin](/docs/concepts/cluster-administration/device-plugins/).
|
||||
|
||||
|
||||
### Network Plugins
|
||||
|
||||
Different networking fabrics can be supported via node-level [Network Plugins](/docs/admin/network-plugins/).
|
||||
|
||||
### Scheduler Extensions
|
||||
|
||||
The scheduler is a special type of controller that watches pods, and assigns
|
||||
pods to nodes. The default scheduler can be replaced entirely, while
|
||||
continuing to use other Kubernetes components, or [multiple
|
||||
schedulers](/docs/tasks/administer-cluster/configure-multiple-schedulers/)
|
||||
can run at the same time.
|
||||
|
||||
This is a significant undertaking, and almost all Kubernetes users find they
|
||||
do not need to modify the scheduler.
|
||||
|
||||
The scheduler also supports a
|
||||
[webhook](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md)
|
||||
that permits a webhook backend (scheduler extension) to filter and prioritize
|
||||
the nodes chosen for a pod.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
|
||||
* Learn more about [Custom Resources](/docs/concepts/api-extension/custom-resources/)
|
||||
* Learn about [Dynamic admission control](/docs/admin/extensible-admission-controllers/)
|
||||
* Learn more about Infrastructure extensions
|
||||
* [Network Plugins](/docs/concepts/cluster-administration/network-plugins/)
|
||||
* [Device Plugins](/docs/concepts/cluster-administration/device-plugins/)
|
||||
* Learn about [kubectl plugins](/docs/tasks/extend-kubectl/kubectl-plugins/)
|
||||
* See examples of Automation
|
||||
* [List of Operators](https://github.com/coreos/awesome-kubernetes-extensions)
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
---
|
||||
reviewers:
|
||||
- chenopis
|
||||
title: The Kubernetes API
|
||||
---
|
||||
|
||||
Overall API conventions are described in the [API conventions doc](https://git.k8s.io/community/contributors/devel/api-conventions.md).
|
||||
|
||||
API endpoints, resource types and samples are described in [API Reference](/docs/reference).
|
||||
|
||||
Remote access to the API is discussed in the [access doc](/docs/admin/accessing-the-api).
|
||||
|
||||
The Kubernetes API also serves as the foundation for the declarative configuration schema for the system. The [kubectl](/docs/user-guide/kubectl/) command-line tool can be used to create, update, delete, and get API objects.
|
||||
|
||||
Kubernetes also stores its serialized state (currently in [etcd](https://coreos.com/docs/distributed-configuration/getting-started-with-etcd/)) in terms of the API resources.
|
||||
|
||||
Kubernetes itself is decomposed into multiple components, which interact through its API.
|
||||
|
||||
## API changes
|
||||
|
||||
In our experience, any system that is successful needs to grow and change as new use cases emerge or existing ones change. Therefore, we expect the Kubernetes API to continuously change and grow. However, we intend to not break compatibility with existing clients, for an extended period of time. In general, new API resources and new resource fields can be expected to be added frequently. Elimination of resources or fields will require following the [API deprecation policy](https://kubernetes.io/docs/reference/deprecation-policy/).
|
||||
|
||||
What constitutes a compatible change and how to change the API are detailed by the [API change document](https://git.k8s.io/community/contributors/devel/api_changes.md).
|
||||
|
||||
## OpenAPI and Swagger definitions
|
||||
|
||||
Complete API details are documented using [Swagger v1.2](http://swagger.io/) and [OpenAPI](https://www.openapis.org/). The Kubernetes apiserver (aka "master") exposes an API that can be used to retrieve the Swagger v1.2 Kubernetes API spec located at `/swaggerapi`.
|
||||
|
||||
Starting with Kubernetes 1.10, OpenAPI spec is served in a single `/openapi/v2` endpoint. The format-separated endpoints (`/swagger.json`, `/swagger-2.0.0.json`, `/swagger-2.0.0.pb-v1`, `/swagger-2.0.0.pb-v1.gz`) are deprecated and will get removed in Kubernetes 1.14.
|
||||
|
||||
Requested format is specified by setting HTTP headers:
|
||||
|
||||
Header | Possible Values
|
||||
-- | --
|
||||
Accept | `application/json`, `application/com.github.proto-openapi.spec.v2@v1.0+protobuf` (the default content-type is `application/json` for `*/*` or not passing this header)
|
||||
Accept-Encoding | `gzip` (not passing this header is acceptable)
|
||||
|
||||
**Examples of getting OpenAPI spec**:
|
||||
|
||||
Before 1.10 | Starting with Kubernetes 1.10
|
||||
-- | --
|
||||
GET /swagger.json | GET /openapi/v2 **Accept**: application/json
|
||||
GET /swagger-2.0.0.pb-v1 | GET /openapi/v2 **Accept**: application/com.github.proto-openapi.spec.v2@v1.0+protobuf
|
||||
GET /swagger-2.0.0.pb-v1.gz | GET /openapi/v2 **Accept**: application/com.github.proto-openapi.spec.v2@v1.0+protobuf **Accept-Encoding**: gzip
|
||||
|
||||
|
||||
Kubernetes implements an alternative Protobuf based serialization format for the API that is primarily intended for intra-cluster communication, documented in the [design proposal](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/protobuf.md) and the IDL files for each schema are located in the Go packages that define the API objects.
|
||||
|
||||
## API versioning
|
||||
|
||||
To make it easier to eliminate fields or restructure resource representations, Kubernetes supports
|
||||
multiple API versions, each at a different API path, such as `/api/v1` or
|
||||
`/apis/extensions/v1beta1`.
|
||||
|
||||
We chose to version at the API level rather than at the resource or field level to ensure that the API presents a clear, consistent view of system resources and behavior, and to enable controlling access to end-of-lifed and/or experimental APIs. The JSON and Protobuf serialization schemas follow the same guidelines for schema changes - all descriptions below cover both formats.
|
||||
|
||||
Note that API versioning and Software versioning are only indirectly related. The [API and release
|
||||
versioning proposal](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md) describes the relationship between API versioning and
|
||||
software versioning.
|
||||
|
||||
|
||||
Different API versions imply different levels of stability and support. The criteria for each level are described
|
||||
in more detail in the [API Changes documentation](https://git.k8s.io/community/contributors/devel/api_changes.md#alpha-beta-and-stable-versions). They are summarized here:
|
||||
|
||||
- Alpha level:
|
||||
- The version names contain `alpha` (e.g. `v1alpha1`).
|
||||
- May be buggy. Enabling the feature may expose bugs. Disabled by default.
|
||||
- Support for feature may be dropped at any time without notice.
|
||||
- The API may change in incompatible ways in a later software release without notice.
|
||||
- Recommended for use only in short-lived testing clusters, due to increased risk of bugs and lack of long-term support.
|
||||
- Beta level:
|
||||
- The version names contain `beta` (e.g. `v2beta3`).
|
||||
- Code is well tested. Enabling the feature is considered safe. Enabled by default.
|
||||
- Support for the overall feature will not be dropped, though details may change.
|
||||
- The schema and/or semantics of objects may change in incompatible ways in a subsequent beta or stable release. When this happens,
|
||||
we will provide instructions for migrating to the next version. This may require deleting, editing, and re-creating
|
||||
API objects. The editing process may require some thought. This may require downtime for applications that rely on the feature.
|
||||
- Recommended for only non-business-critical uses because of potential for incompatible changes in subsequent releases. If you have
|
||||
multiple clusters which can be upgraded independently, you may be able to relax this restriction.
|
||||
- **Please do try our beta features and give feedback on them! Once they exit beta, it may not be practical for us to make more changes.**
|
||||
- Stable level:
|
||||
- The version name is `vX` where `X` is an integer.
|
||||
- Stable versions of features will appear in released software for many subsequent versions.
|
||||
|
||||
## API groups
|
||||
|
||||
To make it easier to extend the Kubernetes API, we implemented [*API groups*](https://git.k8s.io/community/contributors/design-proposals/api-machinery/api-group.md).
|
||||
The API group is specified in a REST path and in the `apiVersion` field of a serialized object.
|
||||
|
||||
Currently there are several API groups in use:
|
||||
|
||||
1. The *core* group, often referred to as the *legacy group*, is at the REST path `/api/v1` and uses `apiVersion: v1`.
|
||||
|
||||
1. The named groups are at REST path `/apis/$GROUP_NAME/$VERSION`, and use `apiVersion: $GROUP_NAME/$VERSION`
|
||||
(e.g. `apiVersion: batch/v1`). Full list of supported API groups can be seen in [Kubernetes API reference](/docs/reference/).
|
||||
|
||||
|
||||
There are two supported paths to extending the API with [custom resources](/docs/concepts/api-extension/custom-resources/):
|
||||
|
||||
1. [CustomResourceDefinition](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/)
|
||||
is for users with very basic CRUD needs.
|
||||
1. Coming soon: users needing the full set of Kubernetes API semantics can implement their own apiserver
|
||||
and use the [aggregator](https://git.k8s.io/community/contributors/design-proposals/api-machinery/aggregated-api-servers.md)
|
||||
to make it seamless for clients.
|
||||
|
||||
|
||||
## Enabling API groups
|
||||
|
||||
Certain resources and API groups are enabled by default. They can be enabled or disabled by setting `--runtime-config`
|
||||
on apiserver. `--runtime-config` accepts comma separated values. For ex: to disable batch/v1, set
|
||||
`--runtime-config=batch/v1=false`, to enable batch/v2alpha1, set `--runtime-config=batch/v2alpha1`.
|
||||
The flag accepts comma separated set of key=value pairs describing runtime configuration of the apiserver.
|
||||
|
||||
IMPORTANT: Enabling or disabling groups or resources requires restarting apiserver and controller-manager
|
||||
to pick up the `--runtime-config` changes.
|
||||
|
||||
## Enabling resources in the groups
|
||||
|
||||
DaemonSets, Deployments, HorizontalPodAutoscalers, Ingress, Jobs and ReplicaSets are enabled by default.
|
||||
Other extensions resources can be enabled by setting `--runtime-config` on
|
||||
apiserver. `--runtime-config` accepts comma separated values. For example: to disable deployments and ingress, set
|
||||
`--runtime-config=extensions/v1beta1/deployments=false,extensions/v1beta1/ingress=false`
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: "Object Management Using kubectl"
|
||||
weight: 50
|
||||
---
|
||||
|
||||
@@ -0,0 +1,983 @@
|
||||
---
|
||||
title: Declarative Management of Kubernetes Objects Using Configuration Files
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
Kubernetes objects can be created, updated, and deleted by storing multiple
|
||||
object configuration files in a directory and using `kubectl apply` to
|
||||
recursively create and update those objects as needed. This method
|
||||
retains writes made to live objects without merging the changes
|
||||
back into the object configuration files.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## Trade-offs
|
||||
|
||||
The `kubectl` tool supports three kinds of object management:
|
||||
|
||||
* Imperative commands
|
||||
* Imperative object configuration
|
||||
* Declarative object configuration
|
||||
|
||||
See [Kubernetes Object Management](/docs/concepts/overview/object-management-kubectl/overview/)
|
||||
for a discussion of the advantages and disadvantage of each kind of object management.
|
||||
|
||||
## Before you begin
|
||||
|
||||
Declarative object configuration requires a firm understanding of
|
||||
the Kubernetes object definitions and configuration. Read and complete
|
||||
the following documents if you have not already:
|
||||
|
||||
- [Managing Kubernetes Objects Using Imperative Commands](/docs/concepts/overview/object-management-kubectl/imperative-command/)
|
||||
- [Imperative Management of Kubernetes Objects Using Configuration Files](/docs/concepts/overview/object-management-kubectl/imperative-config/)
|
||||
|
||||
Following are definitions for terms used in this document:
|
||||
|
||||
- *object configuration file / configuration file*: A file that defines the
|
||||
configuration for a Kubernetes object. This topic shows how to pass configuration
|
||||
files to `kubectl apply`. Configuration files are typically stored in source control, such as Git.
|
||||
- *live object configuration / live configuration*: The live configuration
|
||||
values of an object, as observed by the Kubernetes cluster. These are kept in the Kubernetes
|
||||
cluster storage, typically etcd.
|
||||
- *declarative configuration writer / declarative writer*: A person or software component
|
||||
that makes updates to a live object. The live writers referred to in this topic make changes
|
||||
to object configuration files and run `kubectl apply` to write the changes.
|
||||
|
||||
## How to create objects
|
||||
|
||||
Use `kubectl apply` to create all objects, except those that already exist,
|
||||
defined by configuration files in a specified directory:
|
||||
|
||||
```shell
|
||||
kubectl apply -f <directory>/
|
||||
```
|
||||
|
||||
This sets the `kubectl.kubernetes.io/last-applied-configuration: '{...}'`
|
||||
annotation on each object. The annotation contains the contents of the object
|
||||
configuration file that was used to create the object.
|
||||
|
||||
**Note**: Add the `-R` flag to recursively process directories.
|
||||
|
||||
Here's an example of an object configuration file:
|
||||
|
||||
{{< code file="simple_deployment.yaml" >}}
|
||||
|
||||
Create the object using `kubectl apply`:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml
|
||||
```
|
||||
|
||||
Print the live configuration using `kubectl get`:
|
||||
|
||||
```shell
|
||||
kubectl get -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml -o yaml
|
||||
```
|
||||
|
||||
The output shows that the `kubectl.kubernetes.io/last-applied-configuration` annotation
|
||||
was written to the live configuration, and it matches the configuration file:
|
||||
|
||||
```shell
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
# ...
|
||||
# This is the json representation of simple_deployment.yaml
|
||||
# It was written by kubectl apply when the object was created
|
||||
kubectl.kubernetes.io/last-applied-configuration: |
|
||||
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
|
||||
"ports":[{"containerPort":80}]}]}}}}
|
||||
# ...
|
||||
spec:
|
||||
# ...
|
||||
minReadySeconds: 5
|
||||
selector:
|
||||
matchLabels:
|
||||
# ...
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
# ...
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.7.9
|
||||
# ...
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
```
|
||||
|
||||
## How to update objects
|
||||
|
||||
You can also use `kubectl apply` to update all objects defined in a directory, even
|
||||
if those objects already exist. This approach accomplishes the following:
|
||||
|
||||
1. Sets fields that appear in the configuration file in the live configuration.
|
||||
2. Clears fields removed from the configuration file in the live configuration.
|
||||
|
||||
```shell
|
||||
kubectl apply -f <directory>/
|
||||
```
|
||||
|
||||
**Note**: Add the `-R` flag to recursively process directories.
|
||||
|
||||
Here's an example configuration file:
|
||||
|
||||
{{< code file="simple_deployment.yaml" >}}
|
||||
|
||||
Create the object using `kubectl apply`:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml
|
||||
```
|
||||
|
||||
**Note:** For purposes of illustration, the preceding command refers to a single
|
||||
configuration file instead of a directory.
|
||||
|
||||
Print the live configuration using `kubectl get`:
|
||||
|
||||
```shell
|
||||
kubectl get -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml -o yaml
|
||||
```
|
||||
|
||||
The output shows that the `kubectl.kubernetes.io/last-applied-configuration` annotation
|
||||
was written to the live configuration, and it matches the configuration file:
|
||||
|
||||
```shell
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
# ...
|
||||
# This is the json representation of simple_deployment.yaml
|
||||
# It was written by kubectl apply when the object was created
|
||||
kubectl.kubernetes.io/last-applied-configuration: |
|
||||
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
|
||||
"ports":[{"containerPort":80}]}]}}}}
|
||||
# ...
|
||||
spec:
|
||||
# ...
|
||||
minReadySeconds: 5
|
||||
selector:
|
||||
matchLabels:
|
||||
# ...
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
# ...
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.7.9
|
||||
# ...
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
```
|
||||
|
||||
Directly update the `replicas` field in the live configuration by using `kubectl scale`.
|
||||
This does not use `kubectl apply`:
|
||||
|
||||
```shell
|
||||
kubectl scale deployment/nginx-deployment --replicas=2
|
||||
```
|
||||
|
||||
Print the live configuration using `kubectl get`:
|
||||
|
||||
```shell
|
||||
kubectl get -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml -o yaml
|
||||
```
|
||||
|
||||
The output shows that the `replicas` field has been set to 2, and the `last-applied-configuration`
|
||||
annotation does not contain a `replicas` field:
|
||||
|
||||
```
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
# ...
|
||||
# note that the annotation does not contain replicas
|
||||
# because it was not updated through apply
|
||||
kubectl.kubernetes.io/last-applied-configuration: |
|
||||
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
|
||||
"ports":[{"containerPort":80}]}]}}}}
|
||||
# ...
|
||||
spec:
|
||||
replicas: 2 # written by scale
|
||||
# ...
|
||||
minReadySeconds: 5
|
||||
selector:
|
||||
matchLabels:
|
||||
# ...
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
# ...
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.7.9
|
||||
# ...
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
# ...
|
||||
```
|
||||
|
||||
Update the `simple_deployment.yaml` configuration file to change the image from
|
||||
`nginx:1.7.9` to `nginx:1.11.9`, and delete the `minReadySeconds` field:
|
||||
|
||||
{{< code file="update_deployment.yaml" >}}
|
||||
|
||||
Apply the changes made to the configuration file:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/docs/concepts/overview/object-management-kubectl/update_deployment.yaml
|
||||
```
|
||||
|
||||
Print the live configuration using `kubectl get`:
|
||||
|
||||
```
|
||||
kubectl get -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml -o yaml
|
||||
```
|
||||
|
||||
The output shows the following changes to the live configuration:
|
||||
|
||||
- The `replicas` field retains the value of 2 set by `kubectl scale`.
|
||||
This is possible because it is omitted from the configuration file.
|
||||
- The `image` field has been updated to `nginx:1.11.9` from `nginx:1.7.9`.
|
||||
- The `last-applied-configuration` annotation has been updated with the new image.
|
||||
- The `minReadySeconds` field has been cleared.
|
||||
- The `last-applied-configuration` annotation no longer contains the `minReadySeconds` field.
|
||||
|
||||
```shell
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
# ...
|
||||
# The annotation contains the updated image to nginx 1.11.9,
|
||||
# but does not contain the updated replicas to 2
|
||||
kubectl.kubernetes.io/last-applied-configuration: |
|
||||
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||
"spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||
"spec":{"containers":[{"image":"nginx:1.11.9","name":"nginx",
|
||||
"ports":[{"containerPort":80}]}]}}}}
|
||||
# ...
|
||||
spec:
|
||||
replicas: 2 # Set by `kubectl scale`. Ignored by `kubectl apply`.
|
||||
# minReadySeconds cleared by `kubectl apply`
|
||||
# ...
|
||||
selector:
|
||||
matchLabels:
|
||||
# ...
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
# ...
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.11.9 # Set by `kubectl apply`
|
||||
# ...
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
```
|
||||
|
||||
**Warning**: Mixing `kubectl apply` with the imperative object configuration commands
|
||||
`create` and `replace` is not supported. This is because `create`
|
||||
and `replace` do not retain the `kubectl.kubernetes.io/last-applied-configuration`
|
||||
that `kubectl apply` uses to compute updates.
|
||||
|
||||
## How to delete objects
|
||||
|
||||
There are two approaches to delete objects managed by `kubectl apply`.
|
||||
|
||||
### Recommended: `kubectl delete -f <filename>`
|
||||
|
||||
Manually deleting objects using the imperative command is the recommended
|
||||
approach, as it is more explicit about what is being deleted, and less likely
|
||||
to result in the user deleting something unintentionally:
|
||||
|
||||
```shell
|
||||
kubectl delete -f <filename>
|
||||
```
|
||||
|
||||
### Alternative: `kubectl apply -f <directory/> --prune -l your=label`
|
||||
|
||||
Only use this if you know what you are doing.
|
||||
|
||||
**Warning:** `kubectl apply --prune` is in alpha, and backwards incompatible
|
||||
changes might be introduced in subsequent releases.
|
||||
|
||||
**Warning**: You must be careful when using this command, so that you
|
||||
do not delete objects unintentionally.
|
||||
|
||||
As an alternative to `kubectl delete`, you can use `kubectl apply` to identify objects to be deleted after their
|
||||
configuration files have been removed from the directory. Apply with `--prune`
|
||||
queries the API server for all objects matching a set of labels, and attempts
|
||||
to match the returned live object configurations against the object
|
||||
configuration files. If an object matches the query, and it does not have a
|
||||
configuration file in the directory, and it has a `last-applied-configuration` annotation,
|
||||
it is deleted.
|
||||
|
||||
{{< comment >}}
|
||||
TODO(pwittrock): We need to change the behavior to prevent the user from running apply on subdirectories unintentionally.
|
||||
{{< /comment >}}
|
||||
|
||||
```shell
|
||||
kubectl apply -f <directory/> --prune -l <labels>
|
||||
```
|
||||
|
||||
**Important:** Apply with prune should only be run against the root directory
|
||||
containing the object configuration files. Running against sub-directories
|
||||
can cause objects to be unintentionally deleted if they are returned
|
||||
by the label selector query specified with `-l <labels>` and
|
||||
do not appear in the subdirectory.
|
||||
|
||||
## How to view an object
|
||||
|
||||
You can use `kubectl get` with `-o yaml` to view the configuration of a live object:
|
||||
|
||||
```shell
|
||||
kubectl get -f <filename|url> -o yaml
|
||||
```
|
||||
|
||||
## How apply calculates differences and merges changes
|
||||
|
||||
**Definition:** A *patch* is an update operation that is scoped to specific
|
||||
fields of an object instead of the entire object.
|
||||
This enables updating only a specific set of fields on an object without
|
||||
reading the object first.
|
||||
|
||||
When `kubectl apply` updates the live configuration for an object,
|
||||
it does so by sending a patch request to the API server. The
|
||||
patch defines updates scoped to specific fields of the live object
|
||||
configuration. The `kubectl apply` command calculates this patch request
|
||||
using the configuration file, the live configuration, and the
|
||||
`last-applied-configuration` annotation stored in the live configuration.
|
||||
|
||||
### Merge patch calculation
|
||||
|
||||
The `kubectl apply` command writes the contents of the configuration file to the
|
||||
`kubectl.kubernetes.io/last-applied-configuration` annotation. This
|
||||
is used to identify fields that have been removed from the configuration
|
||||
file and need to be cleared from the live configuration. Here are the steps used
|
||||
to calculate which fields should be deleted or set:
|
||||
|
||||
1. Calculate the fields to delete. These are the fields present in `last-applied-configuration` and missing from the configuration file.
|
||||
2. Calculate the fields to add or set. These are the fields present in the configuration file whose values don't match the live configuration.
|
||||
|
||||
Here's an example. Suppose this is the configuration file for a Deployment object:
|
||||
|
||||
{{< code file="update_deployment.yaml" >}}
|
||||
|
||||
Also, suppose this is the live configuration for the same Deployment object:
|
||||
|
||||
```shell
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
# ...
|
||||
# note that the annotation does not contain replicas
|
||||
# because it was not updated through apply
|
||||
kubectl.kubernetes.io/last-applied-configuration: |
|
||||
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||
"spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx",
|
||||
"ports":[{"containerPort":80}]}]}}}}
|
||||
# ...
|
||||
spec:
|
||||
replicas: 2 # written by scale
|
||||
# ...
|
||||
minReadySeconds: 5
|
||||
selector:
|
||||
matchLabels:
|
||||
# ...
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
# ...
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.7.9
|
||||
# ...
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
# ...
|
||||
```
|
||||
|
||||
Here are the merge calculations that would be performed by `kubectl apply`:
|
||||
|
||||
1. Calculate the fields to delete by reading values from
|
||||
`last-applied-configuration` and comparing them to values in the
|
||||
configuration file. In this example, `minReadySeconds` appears in the
|
||||
`last-applied-configuration` annotation, but does not appear in the configuration file.
|
||||
**Action:** Clear `minReadySeconds` from the live configuration.
|
||||
2. Calculate the fields to set by reading values from the configuration
|
||||
file and comparing them to values in the live configuration. In this example,
|
||||
the value of `image` in the configuration file does not match
|
||||
the value in the live configuration. **Action:** Set the value of `image` in the live configuration.
|
||||
3. Set the `last-applied-configuration` annotation to match the value
|
||||
of the configuration file.
|
||||
4. Merge the results from 1, 2, 3 into a single patch request to the API server.
|
||||
|
||||
Here is the live configuration that is the result of the merge:
|
||||
|
||||
```shell
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
# ...
|
||||
# The annotation contains the updated image to nginx 1.11.9,
|
||||
# but does not contain the updated replicas to 2
|
||||
kubectl.kubernetes.io/last-applied-configuration: |
|
||||
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||
"spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||
"spec":{"containers":[{"image":"nginx:1.11.9","name":"nginx",
|
||||
"ports":[{"containerPort":80}]}]}}}}
|
||||
# ...
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
# ...
|
||||
app: nginx
|
||||
replicas: 2 # Set by `kubectl scale`. Ignored by `kubectl apply`.
|
||||
# minReadySeconds cleared by `kubectl apply`
|
||||
# ...
|
||||
template:
|
||||
metadata:
|
||||
# ...
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.11.9 # Set by `kubectl apply`
|
||||
# ...
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
```
|
||||
|
||||
{{< comment >}}
|
||||
TODO(1.6): For 1.6, add the following bullet point to 1.
|
||||
|
||||
- clear fields explicitly set to null in the local object configuration file regardless of whether they appear in the last-applied-configuration
|
||||
{{< /comment >}}
|
||||
|
||||
### How different types of fields are merged
|
||||
|
||||
How a particular field in a configuration file is merged with
|
||||
the live configuration depends on the
|
||||
type of the field. There are several types of fields:
|
||||
|
||||
- *primitive*: A field of type string, integer, or boolean.
|
||||
For example, `image` and `replicas` are primitive fields. **Action:** Replace.
|
||||
|
||||
- *map*, also called *object*: A field of type map or a complex type that contains subfields. For example, `labels`,
|
||||
`annotations`,`spec` and `metadata` are all maps. **Action:** Merge elements or subfields.
|
||||
|
||||
- *list*: A field containing a list of items that can be either primitive types or maps.
|
||||
For example, `containers`, `ports`, and `args` are lists. **Action:** Varies.
|
||||
|
||||
When `kubectl apply` updates a map or list field, it typically does
|
||||
not replace the entire field, but instead updates the individual subelements.
|
||||
For instance, when merging the `spec` on a Deployment, the entire `spec` is
|
||||
not replaced. Instead the subfields of `spec`, such as `replicas`, are compared
|
||||
and merged.
|
||||
|
||||
### Merging changes to primitive fields
|
||||
|
||||
Primitive fields are replaced or cleared.
|
||||
|
||||
**Note:** '-' is used for "not applicable" because the value is not used.
|
||||
|
||||
| Field in object configuration file | Field in live object configuration | Field in last-applied-configuration | Action |
|
||||
|-------------------------------------|------------------------------------|-------------------------------------|-------------------------------------------|
|
||||
| Yes | Yes | - | Set live to configuration file value. |
|
||||
| Yes | No | - | Set live to local configuration. |
|
||||
| No | - | Yes | Clear from live configuration. |
|
||||
| No | - | No | Do nothing. Keep live value. |
|
||||
|
||||
### Merging changes to map fields
|
||||
|
||||
Fields that represent maps are merged by comparing each of the subfields or elements of the map:
|
||||
|
||||
**Note:** '-' is used for "not applicable" because the value is not used.
|
||||
|
||||
| Key in object configuration file | Key in live object configuration | Field in last-applied-configuration | Action |
|
||||
|-------------------------------------|------------------------------------|-------------------------------------|----------------------------------|
|
||||
| Yes | Yes | - | Compare sub fields values. |
|
||||
| Yes | No | - | Set live to local configuration. |
|
||||
| No | - | Yes | Delete from live configuration. |
|
||||
| No | - | No | Do nothing. Keep live value. |
|
||||
|
||||
### Merging changes for fields of type list
|
||||
|
||||
Merging changes to a list uses one of three strategies:
|
||||
|
||||
* Replace the list.
|
||||
* Merge individual elements in a list of complex elements.
|
||||
* Merge a list of primitive elements.
|
||||
|
||||
The choice of strategy is made on a per-field basis.
|
||||
|
||||
#### Replace the list
|
||||
|
||||
Treat the list the same as a primitive field. Replace or delete the
|
||||
entire list. This preserves ordering.
|
||||
|
||||
**Example:** Use `kubectl apply` to update the `args` field of a Container in a Pod. This sets
|
||||
the value of `args` in the live configuration to the value in the configuration file.
|
||||
Any `args` elements that had previously been added to the live configuration are lost.
|
||||
The order of the `args` elements defined in the configuration file is
|
||||
retained in the live configuration.
|
||||
|
||||
```yaml
|
||||
# last-applied-configuration value
|
||||
args: ["a, b"]
|
||||
|
||||
# configuration file value
|
||||
args: ["a", "c"]
|
||||
|
||||
# live configuration
|
||||
args: ["a", "b", "d"]
|
||||
|
||||
# result after merge
|
||||
args: ["a", "c"]
|
||||
```
|
||||
|
||||
**Explanation:** The merge used the configuration file value as the new list value.
|
||||
|
||||
#### Merge individual elements of a list of complex elements:
|
||||
|
||||
Treat the list as a map, and treat a specific field of each element as a key.
|
||||
Add, delete, or update individual elements. This does not preserve ordering.
|
||||
|
||||
This merge strategy uses a special tag on each field called a `patchMergeKey`. The
|
||||
`patchMergeKey` is defined for each field in the Kubernetes source code:
|
||||
[types.go](https://git.k8s.io/api/core/v1/types.go#L2565)
|
||||
When merging a list of maps, the field specified as the `patchMergeKey` for a given element
|
||||
is used like a map key for that element.
|
||||
|
||||
**Example:** Use `kubectl apply` to update the `containers` field of a PodSpec.
|
||||
This merges the list as though it was a map where each element is keyed
|
||||
by `name`.
|
||||
|
||||
```yaml
|
||||
# last-applied-configuration value
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.10
|
||||
- name: nginx-helper-a # key: nginx-helper-a; will be deleted in result
|
||||
image: helper:1.3
|
||||
- name: nginx-helper-b # key: nginx-helper-b; will be retained
|
||||
image: helper:1.3
|
||||
|
||||
# configuration file value
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.10
|
||||
- name: nginx-helper-b
|
||||
image: helper:1.3
|
||||
- name: nginx-helper-c # key: nginx-helper-c; will be added in result
|
||||
image: helper:1.3
|
||||
|
||||
# live configuration
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.10
|
||||
- name: nginx-helper-a
|
||||
image: helper:1.3
|
||||
- name: nginx-helper-b
|
||||
image: helper:1.3
|
||||
args: ["run"] # Field will be retained
|
||||
- name: nginx-helper-d # key: nginx-helper-d; will be retained
|
||||
image: helper:1.3
|
||||
|
||||
# result after merge
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.10
|
||||
# Element nginx-helper-a was deleted
|
||||
- name: nginx-helper-b
|
||||
image: helper:1.3
|
||||
args: ["run"] # Field was retained
|
||||
- name: nginx-helper-c # Element was added
|
||||
image: helper:1.3
|
||||
- name: nginx-helper-d # Element was ignored
|
||||
image: helper:1.3
|
||||
```
|
||||
|
||||
**Explanation:**
|
||||
|
||||
- The container named "nginx-helper-a" was deleted because no container
|
||||
named "nginx-helper-a" appeared in the configuration file.
|
||||
- The container named "nginx-helper-b" retained the changes to `args`
|
||||
in the live configuration. `kubectl apply` was able to identify
|
||||
that "nginx-helper-b" in the live configuration was the same
|
||||
"nginx-helper-b" as in the configuration file, even though their fields
|
||||
had different values (no `args` in the configuration file). This is
|
||||
because the `patchMergeKey` field value (name) was identical in both.
|
||||
- The container named "nginx-helper-c" was added because no container
|
||||
with that name appeared in the live configuration, but one with
|
||||
that name appeared in the configuration file.
|
||||
- The container named "nginx-helper-d" was retained because
|
||||
no element with that name appeared in the last-applied-configuration.
|
||||
|
||||
#### Merge a list of primitive elements
|
||||
|
||||
As of Kubernetes 1.5, merging lists of primitive elements is not supported.
|
||||
|
||||
**Note:** Which of the above strategies is chosen for a given field is controlled by
|
||||
the `patchStrategy` tag in [types.go](https://git.k8s.io/api/core/v1/types.go#L2565)
|
||||
If no `patchStrategy` is specified for a field of type list, then
|
||||
the list is replaced.
|
||||
|
||||
{{< comment >}}
|
||||
TODO(pwittrock): Uncomment this for 1.6
|
||||
|
||||
- Treat the list as a set of primitives. Replace or delete individual
|
||||
elements. Does not preserve ordering. Does not preserve duplicates.
|
||||
|
||||
**Example:** Using apply to update the `finalizers` field of ObjectMeta
|
||||
keeps elements added to the live configuration. Ordering of finalizers
|
||||
is lost.
|
||||
{{< /comment >}}
|
||||
|
||||
## Default field values
|
||||
|
||||
The API server sets certain fields to default values in the live configuration if they are
|
||||
not specified when the object is created.
|
||||
|
||||
Here's a configuration file for a Deployment. The file does not specify `strategy` or `selector`:
|
||||
|
||||
{{< code file="simple_deployment.yaml" >}}
|
||||
|
||||
Create the object using `kubectl apply`:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml
|
||||
```
|
||||
|
||||
Print the live configuration using `kubectl get`:
|
||||
|
||||
```shell
|
||||
kubectl get -f https://k8s.io/docs/concepts/overview/object-management-kubectl/simple_deployment.yaml -o yaml
|
||||
```
|
||||
|
||||
The output shows that the API server set several fields to default values in the live
|
||||
configuration. These fields were not specified in the configuration file.
|
||||
|
||||
```shell
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
# ...
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
minReadySeconds: 5
|
||||
replicas: 1 # defaulted by apiserver
|
||||
selector:
|
||||
matchLabels: # defaulted by apiserver - derived from template.metadata.labels
|
||||
app: nginx
|
||||
strategy:
|
||||
rollingUpdate: # defaulted by apiserver - derived from strategy.type
|
||||
maxSurge: 1
|
||||
maxUnavailable: 1
|
||||
type: RollingUpdate # defaulted apiserver
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx:1.7.9
|
||||
imagePullPolicy: IfNotPresent # defaulted by apiserver
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
protocol: TCP # defaulted by apiserver
|
||||
resources: {} # defaulted by apiserver
|
||||
terminationMessagePath: /dev/termination-log # defaulted by apiserver
|
||||
dnsPolicy: ClusterFirst # defaulted by apiserver
|
||||
restartPolicy: Always # defaulted by apiserver
|
||||
securityContext: {} # defaulted by apiserver
|
||||
terminationGracePeriodSeconds: 30 # defaulted by apiserver
|
||||
# ...
|
||||
```
|
||||
|
||||
**Note:** Some of the fields' default values have been derived from
|
||||
the values of other fields that were specified in the configuration file,
|
||||
such as the `selector` field.
|
||||
|
||||
In a patch request, defaulted fields are not re-defaulted unless they are explicitly cleared
|
||||
as part of a patch request. This can cause unexpected behavior for
|
||||
fields that are defaulted based
|
||||
on the values of other fields. When the other fields are later changed,
|
||||
the values defaulted from them will not be updated unless they are
|
||||
explicitly cleared.
|
||||
|
||||
For this reason, it is recommended that certain fields defaulted
|
||||
by the server are explicitly defined in the configuration file, even
|
||||
if the desired values match the server defaults. This makes it
|
||||
easier to recognize conflicting values that will not be re-defaulted
|
||||
by the server.
|
||||
|
||||
**Example:**
|
||||
|
||||
```yaml
|
||||
# last-applied-configuration
|
||||
spec:
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
|
||||
# configuration file
|
||||
spec:
|
||||
strategy:
|
||||
type: Recreate # updated value
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
|
||||
# live configuration
|
||||
spec:
|
||||
strategy:
|
||||
type: RollingUpdate # defaulted value
|
||||
rollingUpdate: # defaulted value derived from type
|
||||
maxSurge : 1
|
||||
maxUnavailable: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
|
||||
# result after merge - ERROR!
|
||||
spec:
|
||||
strategy:
|
||||
type: Recreate # updated value: incompatible with rollingUpdate
|
||||
rollingUpdate: # defaulted value: incompatible with "type: Recreate"
|
||||
maxSurge : 1
|
||||
maxUnavailable: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
```
|
||||
|
||||
**Explanation:**
|
||||
|
||||
1. The user creates a Deployment without defining `strategy.type`.
|
||||
2. The server defaults `strategy.type` to `RollingUpdate` and defaults the
|
||||
`strategy.rollingUpdate` values.
|
||||
3. The user changes `strategy.type` to `Recreate`. The `strategy.rollingUpdate`
|
||||
values remain at their defaulted values, though the server expects them to be cleared.
|
||||
If the `strategy.rollingUpdate` values had been defined initially in the configuration file,
|
||||
it would have been more clear that they needed to be deleted.
|
||||
4. Apply fails because `strategy.rollingUpdate` is not cleared. The `strategy.rollingupdate`
|
||||
field cannot be defined with a `strategy.type` of `Recreate`.
|
||||
|
||||
Recommendation: These fields should be explicitly defined in the object configuration file:
|
||||
|
||||
- Selectors and PodTemplate labels on workloads, such as Deployment, StatefulSet, Job, DaemonSet,
|
||||
ReplicaSet, and ReplicationController
|
||||
- Deployment rollout strategy
|
||||
|
||||
### How to clear server-defaulted fields or fields set by other writers
|
||||
|
||||
As of Kubernetes 1.5, fields that do not appear in the configuration file cannot be
|
||||
cleared by a merge operation. Here are some workarounds:
|
||||
|
||||
Option 1: Remove the field by directly modifying the live object.
|
||||
|
||||
**Note:** As of Kubernetes 1.5, `kubectl edit` does not work with `kubectl apply`.
|
||||
Using these together will cause unexpected behavior.
|
||||
|
||||
Option 2: Remove the field through the configuration file.
|
||||
|
||||
1. Add the field to the configuration file to match the live object.
|
||||
1. Apply the configuration file; this updates the annotation to include the field.
|
||||
1. Delete the field from the configuration file.
|
||||
1. Apply the configuration file; this deletes the field from the live object and annotation.
|
||||
|
||||
{{< comment >}}
|
||||
TODO(1.6): Update this with the following for 1.6
|
||||
|
||||
Fields that do not appear in the configuration file can be cleared by
|
||||
setting their values to `null` and then applying the configuration file.
|
||||
For fields defaulted by the server, this triggers re-defaulting
|
||||
the values.
|
||||
{{< /comment >}}
|
||||
|
||||
## How to change ownership of a field between the configuration file and direct imperative writers
|
||||
|
||||
These are the only methods you should use to change an individual object field:
|
||||
|
||||
- Use `kubectl apply`.
|
||||
- Write directly to the live configuration without modifying the configuration file:
|
||||
for example, use `kubectl scale`.
|
||||
|
||||
### Changing the owner from a direct imperative writer to a configuration file
|
||||
|
||||
Add the field to the configuration file. For the field, discontinue direct updates to
|
||||
the live configuration that do not go through `kubectl apply`.
|
||||
|
||||
### Changing the owner from a configuration file to a direct imperative writer
|
||||
|
||||
As of Kubernetes 1.5, changing ownership of a field from a configuration file to
|
||||
an imperative writer requires manual steps:
|
||||
|
||||
- Remove the field from the configuration file.
|
||||
- Remove the field from the `kubectl.kubernetes.io/last-applied-configuration` annotation on the live object.
|
||||
|
||||
## Changing management methods
|
||||
|
||||
Kubernetes objects should be managed using only one method at a time.
|
||||
Switching from one method to another is possible, but is a manual process.
|
||||
|
||||
**Exception:** It is OK to use imperative deletion with declarative management.
|
||||
|
||||
{{< comment >}}
|
||||
TODO(pwittrock): We need to make using imperative commands with
|
||||
declarative object configuration work so that it doesn't write the
|
||||
fields to the annotation, and instead. Then add this bullet point.
|
||||
|
||||
- using imperative commands with declarative configuration to manage where each manages different fields.
|
||||
{{< /comment >}}
|
||||
|
||||
### Migrating from imperative command management to declarative object configuration
|
||||
|
||||
Migrating from imperative command management to declarative object
|
||||
configuration involves several manual steps:
|
||||
|
||||
1. Export the live object to a local configuration file:
|
||||
|
||||
kubectl get <kind>/<name> -o yaml --export > <kind>_<name>.yaml
|
||||
|
||||
1. Manually remove the `status` field from the configuration file.
|
||||
|
||||
**Note:** This step is optional, as `kubectl apply` does not update the status field
|
||||
even if it is present in the configuration file.
|
||||
|
||||
1. Set the `kubectl.kubernetes.io/last-applied-configuration` annotation on the object:
|
||||
|
||||
kubectl replace --save-config -f <kind>_<name>.yaml
|
||||
|
||||
1. Change processes to use `kubectl apply` for managing the object exclusively.
|
||||
|
||||
{{< comment >}}
|
||||
TODO(pwittrock): Why doesn't export remove the status field? Seems like it should.
|
||||
{{< /comment >}}
|
||||
|
||||
### Migrating from imperative object configuration to declarative object configuration
|
||||
|
||||
1. Set the `kubectl.kubernetes.io/last-applied-configuration` annotation on the object:
|
||||
|
||||
kubectl replace --save-config -f <kind>_<name>.yaml
|
||||
|
||||
1. Change processes to use `kubectl apply` for managing the object exclusively.
|
||||
|
||||
## Defining controller selectors and PodTemplate labels
|
||||
|
||||
**Warning**: Updating selectors on controllers is strongly discouraged.
|
||||
|
||||
The recommended approach is to define a single, immutable PodTemplate label
|
||||
used only by the controller selector with no other semantic meaning.
|
||||
|
||||
**Example:**
|
||||
|
||||
```yaml
|
||||
selector:
|
||||
matchLabels:
|
||||
controller-selector: "extensions/v1beta1/deployment/nginx"
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
controller-selector: "extensions/v1beta1/deployment/nginx"
|
||||
```
|
||||
|
||||
## Known Issues
|
||||
|
||||
* Prior to Kubernetes 1.6, `kubectl apply` did not support operating on objects stored in a
|
||||
[custom resource](/docs/concepts/api-extension/custom-resources/).
|
||||
For these cluster versions, you should instead use [imperative object configuration](/docs/concepts/overview/object-management-kubectl/imperative-config/).
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
- [Managing Kubernetes Objects Using Imperative Commands](/docs/concepts/overview/object-management-kubectl/imperative-command/)
|
||||
- [Imperative Management of Kubernetes Objects Using Configuration Files](/docs/concepts/overview/object-management-kubectl/imperative-config/)
|
||||
- [Kubectl Command Reference](/docs/reference/generated/kubectl/kubectl/)
|
||||
- [Kubernetes API Reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
---
|
||||
title: Managing Kubernetes Objects Using Imperative Commands
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
Kubernetes objects can quickly be created, updated, and deleted directly using
|
||||
imperative commands built into the `kubectl` command-line tool. This document
|
||||
explains how those commands are organized and how to use them to manage live objects.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## Trade-offs
|
||||
|
||||
The `kubectl` tool supports three kinds of object management:
|
||||
|
||||
* Imperative commands
|
||||
* Imperative object configuration
|
||||
* Declarative object configuration
|
||||
|
||||
See [Kubernetes Object Management](/docs/concepts/overview/object-management-kubectl/overview/)
|
||||
for a discussion of the advantages and disadvantage of each kind of object management.
|
||||
|
||||
## How to create objects
|
||||
|
||||
The `kubectl` tool supports verb-driven commands for creating some of the most common
|
||||
object types. The commands are named to be recognizable to users unfamiliar with
|
||||
the Kubernetes object types.
|
||||
|
||||
- `run`: Create a new Deployment object to run Containers in one or more Pods.
|
||||
- `expose`: Create a new Service object to load balance traffic across Pods.
|
||||
- `autoscale`: Create a new Autoscaler object to automatically horizontally scale a controller, such as a Deployment.
|
||||
|
||||
The `kubectl` tool also supports creation commands driven by object type.
|
||||
These commands support more object types and are more explicit about
|
||||
their intent, but require users to know the type of objects they intend
|
||||
to create.
|
||||
|
||||
- `create <objecttype> [<subtype>] <instancename>`
|
||||
|
||||
Some objects types have subtypes that you can specify in the `create` command.
|
||||
For example, the Service object has several subtypes including ClusterIP,
|
||||
LoadBalancer, and NodePort. Here's an example that creates a Service with
|
||||
subtype NodePort:
|
||||
|
||||
```shell
|
||||
kubectl create service nodeport <myservicename>
|
||||
```
|
||||
|
||||
In the preceding example, the `create service nodeport` command is called
|
||||
a subcommand of the `create service` command.
|
||||
|
||||
You can use the `-h` flag to find the arguments and flags supported by
|
||||
a subcommand:
|
||||
|
||||
```shell
|
||||
kubectl create service nodeport -h
|
||||
```
|
||||
|
||||
## How to update objects
|
||||
|
||||
The `kubectl` command supports verb-driven commands for some common update operations.
|
||||
These commands are named to enable users unfamiliar with Kubernetes
|
||||
objects to perform updates without knowing the specific fields
|
||||
that must be set:
|
||||
|
||||
- `scale`: Horizontally scale a controller to add or remove Pods by updating the replica count of the controller.
|
||||
- `annotate`: Add or remove an annotation from an object.
|
||||
- `label`: Add or remove a label from an object.
|
||||
|
||||
The `kubectl` command also supports update commands driven by an aspect of the object.
|
||||
Setting this aspect may set different fields for different object types:
|
||||
|
||||
- `set` <field>: Set an aspect of an object.
|
||||
|
||||
{{< note >}}
|
||||
**Note**: In Kubernetes version 1.5, not every verb-driven command has an
|
||||
associated aspect-driven command.
|
||||
{{< /note >}}
|
||||
|
||||
The `kubectl` tool supports these additional ways to update a live object directly,
|
||||
however they require a better understanding of the Kubernetes object schema.
|
||||
|
||||
- `edit`: Directly edit the raw configuration of a live object by opening its configuration in an editor.
|
||||
- `patch`: Directly modify specific fields of a live object by using a patch string.
|
||||
For more details on patch strings, see the patch section in
|
||||
[API Conventions](https://git.k8s.io/community/contributors/devel/api-conventions.md#patch-operations).
|
||||
|
||||
## How to delete objects
|
||||
|
||||
You can use the `delete` command to delete an object from a cluster:
|
||||
|
||||
- `delete <type>/<name>`
|
||||
|
||||
{{< note >}}
|
||||
**Note**: You can use `kubectl delete` for both imperative commands and imperative object
|
||||
configuration. The difference is in the arguments passed to the command. To use
|
||||
`kubectl delete` as an imperative command, pass the object to be deleted as
|
||||
an argument. Here's an example that passes a Deployment object named nginx:
|
||||
{{< /note >}}
|
||||
|
||||
```shell
|
||||
kubectl delete deployment/nginx
|
||||
```
|
||||
|
||||
## How to view an object
|
||||
|
||||
{{< comment >}}
|
||||
TODO(pwittrock): Uncomment this when implemented.
|
||||
|
||||
You can use `kubectl view` to print specific fields of an object.
|
||||
|
||||
- `view`: Prints the value of a specific field of an object.
|
||||
|
||||
{{< /comment >}}
|
||||
|
||||
|
||||
|
||||
There are several commands for printing information about an object:
|
||||
|
||||
- `get`: Prints basic information about matching objects. Use `get -h` to see a list of options.
|
||||
- `describe`: Prints aggregated detailed information about matching objects.
|
||||
- `logs`: Prints the stdout and stderr for a container running in a Pod.
|
||||
|
||||
## Using `set` commands to modify objects before creation
|
||||
|
||||
There are some object fields that don't have a flag you can use
|
||||
in a `create` command. In some of those cases, you can use a combination of
|
||||
`set` and `create` to specify a value for the field before object
|
||||
creation. This is done by piping the output of the `create` command to the
|
||||
`set` command, and then back to the `create` command. Here's an example:
|
||||
|
||||
```sh
|
||||
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run | kubectl set selector --local -f - 'environment=qa' -o yaml | kubectl create -f -
|
||||
```
|
||||
|
||||
1. The `kubectl create service -o yaml --dry-run` command creates the configuration for the Service, but prints it to stdout as YAML instead of sending it to the Kubernetes API server.
|
||||
1. The `kubectl set --local -f - -o yaml` command reads the configuration from stdin, and writes the updated configuration to stdout as YAML.
|
||||
1. The `kubectl create -f -` command creates the object using the configuration provided via stdin.
|
||||
|
||||
## Using `--edit` to modify objects before creation
|
||||
|
||||
You can use `kubectl create --edit` to make arbitrary changes to an object
|
||||
before it is created. Here's an example:
|
||||
|
||||
```sh
|
||||
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run > /tmp/srv.yaml
|
||||
kubectl create --edit -f /tmp/srv.yaml
|
||||
```
|
||||
|
||||
1. The `kubectl create service` command creates the configuration for the Service and saves it to `/tmp/srv.yaml`.
|
||||
1. The `kubectl create --edit` command opens the configuration file for editing before it creates the object.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
- [Managing Kubernetes Objects Using Object Configuration (Imperative)](/docs/concepts/overview/object-management-kubectl/imperative-config/)
|
||||
- [Managing Kubernetes Objects Using Object Configuration (Declarative)](/docs/concepts/overview/object-management-kubectl/declarative-config/)
|
||||
- [Kubectl Command Reference](/docs/reference/generated/kubectl/kubectl/)
|
||||
- [Kubernetes API Reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
---
|
||||
title: Imperative Management of Kubernetes Objects Using Configuration Files
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
Kubernetes objects can be created, updated, and deleted by using the `kubectl`
|
||||
command-line tool along with an object configuration file written in YAML or JSON.
|
||||
This document explains how to define and manage objects using configuration files.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## Trade-offs
|
||||
|
||||
The `kubectl` tool supports three kinds of object management:
|
||||
|
||||
* Imperative commands
|
||||
* Imperative object configuration
|
||||
* Declarative object configuration
|
||||
|
||||
See [Kubernetes Object Management](/docs/concepts/overview/object-management-kubectl/overview/)
|
||||
for a discussion of the advantages and disadvantage of each kind of object management.
|
||||
|
||||
## How to create objects
|
||||
|
||||
You can use `kubectl create -f` to create an object from a configuration file.
|
||||
Refer to the [kubernetes API reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
|
||||
for details.
|
||||
|
||||
- `kubectl create -f <filename|url>`
|
||||
|
||||
## How to update objects
|
||||
|
||||
**Warning:** Updating objects with the `replace` command drops all
|
||||
parts of the spec not specified in the configuration file. This
|
||||
should not be used with objects whose specs are partially managed
|
||||
by the cluster, such as Services of type `LoadBalancer`, where
|
||||
the `externalIPs` field is managed independently from the configuration
|
||||
file. Independently managed fields must be copied to the configuration
|
||||
file to prevent `replace` from dropping them.
|
||||
|
||||
You can use `kubectl replace -f` to update a live object according to a
|
||||
configuration file.
|
||||
|
||||
- `kubectl replace -f <filename|url>`
|
||||
|
||||
## How to delete objects
|
||||
|
||||
You can use `kubectl delete -f` to delete an object that is described in a
|
||||
configuration file.
|
||||
|
||||
- `kubectl delete -f <filename|url>`
|
||||
|
||||
## How to view an object
|
||||
|
||||
You can use `kubectl get -f` to view information about an object that is
|
||||
described in a configuration file.
|
||||
|
||||
- `kubectl get -f <filename|url> -o yaml`
|
||||
|
||||
The `-o yaml` flag specifies that the full object configuration is printed.
|
||||
Use `kubectl get -h` to see a list of options.
|
||||
|
||||
## Limitations
|
||||
|
||||
The `create`, `replace`, and `delete` commands work well when each object's
|
||||
configuration is fully defined and recorded in its configuration
|
||||
file. However when a live object is updated, and the updates are not merged
|
||||
into its configuration file, the updates will be lost the next time a `replace`
|
||||
is executed. This can happen if a controller, such as
|
||||
a HorizontalPodAutoscaler, makes updates directly to a live object. Here's
|
||||
an example:
|
||||
|
||||
1. You create an object from a configuration file.
|
||||
1. Another source updates the object by changing some field.
|
||||
1. You replace the object from the configuration file. Changes made by
|
||||
the other source in step 2 are lost.
|
||||
|
||||
If you need to support multiple writers to the same object, you can use
|
||||
`kubectl apply` to manage the object.
|
||||
|
||||
## Creating and editing an object from a URL without saving the configuration
|
||||
|
||||
Suppose you have the URL of an object configuration file. You can use
|
||||
`kubectl create --edit` to make changes to the configuration before the
|
||||
object is created. This is particularly useful for tutorials and tasks
|
||||
that point to a configuration file that could be modified by the reader.
|
||||
|
||||
```sh
|
||||
kubectl create -f <url> --edit
|
||||
```
|
||||
|
||||
## Migrating from imperative commands to imperative object configuration
|
||||
|
||||
Migrating from imperative commands to imperative object configuration involves
|
||||
several manual steps.
|
||||
|
||||
1. Export the live object to a local object configuration file:
|
||||
|
||||
kubectl get <kind>/<name> -o yaml --export > <kind>_<name>.yaml
|
||||
|
||||
1. Manually remove the status field from the object configuration file.
|
||||
|
||||
1. For subsequent object management, use `replace` exclusively.
|
||||
|
||||
kubectl replace -f <kind>_<name>.yaml
|
||||
|
||||
|
||||
## Defining controller selectors and PodTemplate labels
|
||||
|
||||
**Warning**: Updating selectors on controllers is strongly discouraged.
|
||||
|
||||
The recommended approach is to define a single, immutable PodTemplate label
|
||||
used only by the controller selector with no other semantic meaning.
|
||||
|
||||
Example label:
|
||||
|
||||
```yaml
|
||||
selector:
|
||||
matchLabels:
|
||||
controller-selector: "extensions/v1beta1/deployment/nginx"
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
controller-selector: "extensions/v1beta1/deployment/nginx"
|
||||
```
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
- [Managing Kubernetes Objects Using Imperative Commands](/docs/concepts/overview/object-management-kubectl/imperative-command/)
|
||||
- [Managing Kubernetes Objects Using Object Configuration (Declarative)](/docs/concepts/overview/object-management-kubectl/declarative-config/)
|
||||
- [Kubectl Command Reference](/docs/reference/generated/kubectl/kubectl/)
|
||||
- [Kubernetes API Reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
---
|
||||
title: Kubernetes Object Management
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
The `kubectl` command-line tool supports several different ways to create and manage
|
||||
Kubernetes objects. This document provides an overview of the different
|
||||
approaches.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## Management techniques
|
||||
|
||||
{{< warning >}}
|
||||
**Warning:** A Kubernetes object should be managed using only one technique. Mixing
|
||||
and matching techniques for the same object results in undefined behavior.
|
||||
{{< /warning >}}
|
||||
|
||||
| Management technique | Operates on |Recommended environment | Supported writers | Learning curve |
|
||||
|----------------------------------|----------------------|------------------------|--------------------|----------------|
|
||||
| Imperative commands | Live objects | Development projects | 1+ | Lowest |
|
||||
| Imperative object configuration | Individual files | Production projects | 1 | Moderate |
|
||||
| Declarative object configuration | Directories of files | Production projects | 1+ | Highest |
|
||||
|
||||
## Imperative commands
|
||||
|
||||
When using imperative commands, a user operates directly on live objects
|
||||
in a cluster. The user provides operations to
|
||||
the `kubectl` command as arguments or flags.
|
||||
|
||||
This is the simplest way to get started or to run a one-off task in
|
||||
a cluster. Because this technique operates directly on live
|
||||
objects, it provides no history of previous configurations.
|
||||
|
||||
### Examples
|
||||
|
||||
Run an instance of the nginx container by creating a Deployment object:
|
||||
|
||||
```sh
|
||||
kubectl run nginx --image nginx
|
||||
```
|
||||
|
||||
Do the same thing using a different syntax:
|
||||
|
||||
```sh
|
||||
kubectl create deployment nginx --image nginx
|
||||
```
|
||||
|
||||
### Trade-offs
|
||||
|
||||
Advantages compared to object configuration:
|
||||
|
||||
- Commands are simple, easy to learn and easy to remember.
|
||||
- Commands require only a single step to make changes to the cluster.
|
||||
|
||||
Disadvantages compared to object configuration:
|
||||
|
||||
- Commands do not integrate with change review processes.
|
||||
- Commands do not provide an audit trail associated with changes.
|
||||
- Commands do not provide a source of records except for what is live.
|
||||
- Commands do not provide a template for creating new objects.
|
||||
|
||||
## Imperative object configuration
|
||||
|
||||
In imperative object configuration, the kubectl command specifies the
|
||||
operation (create, replace, etc.), optional flags and at least one file
|
||||
name. The file specified must contain a full definition of the object
|
||||
in YAML or JSON format.
|
||||
|
||||
See the [API reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
|
||||
for more details on object definitions.
|
||||
|
||||
{{< warning >}}
|
||||
**Warning:** The imperative `replace` command replaces the existing
|
||||
spec with the newly provided one, dropping all changes to the object missing from
|
||||
the configuration file. This approach should not be used with resource
|
||||
types whose specs are updated independently of the configuration file.
|
||||
Services of type `LoadBalancer`, for example, have their `externalIPs` field updated
|
||||
independently from the configuration by the cluster.
|
||||
{{< /warning >}}
|
||||
|
||||
### Examples
|
||||
|
||||
Create the objects defined in a configuration file:
|
||||
|
||||
```sh
|
||||
kubectl create -f nginx.yaml
|
||||
```
|
||||
|
||||
Delete the objects defined in two configuration files:
|
||||
|
||||
```sh
|
||||
kubectl delete -f nginx.yaml -f redis.yaml
|
||||
```
|
||||
|
||||
Update the objects defined in a configuration file by overwriting
|
||||
the live configuration:
|
||||
|
||||
```sh
|
||||
kubectl replace -f nginx.yaml
|
||||
```
|
||||
|
||||
### Trade-offs
|
||||
|
||||
Advantages compared to imperative commands:
|
||||
|
||||
- Object configuration can be stored in a source control system such as Git.
|
||||
- Object configuration can integrate with processes such as reviewing changes before push and audit trails.
|
||||
- Object configuration provides a template for creating new objects.
|
||||
|
||||
Disadvantages compared to imperative commands:
|
||||
|
||||
- Object configuration requires basic understanding of the object schema.
|
||||
- Object configuration requires the additional step of writing a YAML file.
|
||||
|
||||
Advantages compared to declarative object configuration:
|
||||
|
||||
- Imperative object configuration behavior is simpler and easier to understand.
|
||||
- As of Kubernetes version 1.5, imperative object configuration is more mature.
|
||||
|
||||
Disadvantages compared to declarative object configuration:
|
||||
|
||||
- Imperative object configuration works best on files, not directories.
|
||||
- Updates to live objects must be reflected in configuration files, or they will be lost during the next replacement.
|
||||
|
||||
## Declarative object configuration
|
||||
|
||||
When using declarative object configuration, a user operates on object
|
||||
configuration files stored locally, however the user does not define the
|
||||
operations to be taken on the files. Create, update, and delete operations
|
||||
are automatically detected per-object by `kubectl`. This enables working on
|
||||
directories, where different operations might be needed for different objects.
|
||||
|
||||
{{< note >}}
|
||||
**Note:** Declarative object configuration retains changes made by other
|
||||
writers, even if the changes are not merged back to the object configuration file.
|
||||
This is possible by using the `patch` API operation to write only
|
||||
observed differences, instead of using the `replace`
|
||||
API operation to replace the entire object configuration.
|
||||
{{< /note >}}
|
||||
|
||||
### Examples
|
||||
|
||||
Process all object configuration files in the `configs` directory, and
|
||||
create or patch the live objects:
|
||||
|
||||
```sh
|
||||
kubectl apply -f configs/
|
||||
```
|
||||
|
||||
Recursively process directories:
|
||||
|
||||
```sh
|
||||
kubectl apply -R -f configs/
|
||||
```
|
||||
|
||||
### Trade-offs
|
||||
|
||||
Advantages compared to imperative object configuration:
|
||||
|
||||
- Changes made directly to live objects are retained, even if they are not merged back into the configuration files.
|
||||
- Declarative object configuration has better support for operating on directories and automatically detecting operation types (create, patch, delete) per-object.
|
||||
|
||||
Disadvantages compared to imperative object configuration:
|
||||
|
||||
- Declarative object configuration is harder to debug and understand results when they are unexpected.
|
||||
- Partial updates using diffs create complex merge and patch operations.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
- [Managing Kubernetes Objects Using Imperative Commands](/docs/concepts/overview/object-management-kubectl/imperative-command/)
|
||||
- [Managing Kubernetes Objects Using Object Configuration (Imperative)](/docs/concepts/overview/object-management-kubectl/imperative-config/)
|
||||
- [Managing Kubernetes Objects Using Object Configuration (Declarative)](/docs/concepts/overview/object-management-kubectl/declarative-config/)
|
||||
- [Kubectl Command Reference](/docs/reference/generated/kubectl/kubectl/)
|
||||
- [Kubernetes API Reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
|
||||
|
||||
{{< comment >}}
|
||||
{{< /comment >}}
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
minReadySeconds: 5
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
@@ -0,0 +1,18 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.11.9 # update the image
|
||||
ports:
|
||||
- containerPort: 80
|
||||
@@ -0,0 +1,205 @@
|
||||
---
|
||||
reviewers:
|
||||
- bgrant0607
|
||||
- mikedanese
|
||||
title: What is Kubernetes?
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
This page is an overview of Kubernetes.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
Kubernetes is a portable, extensible open-source platform for managing
|
||||
containerized workloads and services, that facilitates both
|
||||
declarative configuration and automation. It has a large, rapidly
|
||||
growing ecosystem. Kubernetes services, support, and tools are widely available.
|
||||
|
||||
Google open-sourced the Kubernetes project in 2014. Kubernetes builds upon
|
||||
a [decade and a half of experience that Google has with running
|
||||
production workloads at
|
||||
scale](https://research.google.com/pubs/pub43438.html), combined with
|
||||
best-of-breed ideas and practices from the community.
|
||||
|
||||
#### Why do I need Kubernetes and what can it do?
|
||||
|
||||
Kubernetes has a number of features. It can be thought of as:
|
||||
* a container platform
|
||||
* a microservices platform
|
||||
* a portable cloud platform
|
||||
and a lot more.
|
||||
|
||||
Kubernetes provides a **container-centric** management environment. It
|
||||
orchestrates computing, networking, and storage infrastructure on
|
||||
behalf of user workloads. This provides much of the simplicity of
|
||||
Platform as a Service (PaaS) with the flexibility of Infrastructure as
|
||||
a Service (IaaS), and enables portability across infrastructure
|
||||
providers.
|
||||
|
||||
#### How is Kubernetes a platform?
|
||||
|
||||
Even though Kubernetes provides a lot of functionality, there are
|
||||
always new scenarios that would benefit from new
|
||||
features. Application-specific workflows can be streamlined to
|
||||
accelerate developer velocity. Ad hoc orchestration that is acceptable
|
||||
initially often requires robust automation at scale. This is why
|
||||
Kubernetes was also designed to serve as a platform for building an
|
||||
ecosystem of components and tools to make it easier to deploy, scale,
|
||||
and manage applications.
|
||||
|
||||
[Labels](/docs/concepts/overview/working-with-objects/labels/) empower
|
||||
users to organize their resources however they
|
||||
please. [Annotations](/docs/concepts/overview/working-with-objects/annotations/)
|
||||
enable users to decorate resources with custom information to
|
||||
facilitate their workflows and provide an easy way for management
|
||||
tools to checkpoint state.
|
||||
|
||||
Additionally, the [Kubernetes control
|
||||
plane](/docs/concepts/overview/components/) is built upon the same
|
||||
[APIs](/docs/reference/api-overview/) that are available to developers
|
||||
and users. Users can write their own controllers, such as
|
||||
[schedulers](https://github.com/kubernetes/community/blob/{{< param "githubbranch" >}}/contributors/devel/scheduler.md),
|
||||
with [their own
|
||||
APIs](/docs/concepts/api-extension/custom-resources/)
|
||||
that can be targeted by a general-purpose [command-line
|
||||
tool](/docs/user-guide/kubectl-overview/).
|
||||
|
||||
This
|
||||
[design](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md)
|
||||
has enabled a number of other systems to build atop Kubernetes.
|
||||
|
||||
#### What Kubernetes is not
|
||||
|
||||
Kubernetes is not a traditional, all-inclusive PaaS (Platform as a
|
||||
Service) system. Since Kubernetes operates at the container level
|
||||
rather than at the hardware level, it provides some generally
|
||||
applicable features common to PaaS offerings, such as deployment,
|
||||
scaling, load balancing, logging, and monitoring. However, Kubernetes
|
||||
is not monolithic, and these default solutions are optional and
|
||||
pluggable. Kubernetes provides the building blocks for building developer
|
||||
platforms, but preserves user choice and flexibility where it is
|
||||
important.
|
||||
|
||||
Kubernetes:
|
||||
|
||||
* Does not limit the types of applications supported. Kubernetes aims
|
||||
to support an extremely diverse variety of workloads, including
|
||||
stateless, stateful, and data-processing workloads. If an
|
||||
application can run in a container, it should run great on
|
||||
Kubernetes.
|
||||
* Does not deploy source code and does not build your
|
||||
application. Continuous Integration, Delivery, and Deployment
|
||||
(CI/CD) workflows are determined by organization cultures and preferences
|
||||
as well as technical requirements.
|
||||
* Does not provide application-level services, such as middleware
|
||||
(e.g., message buses), data-processing frameworks (for example,
|
||||
Spark), databases (e.g., mysql), caches, nor cluster storage systems (e.g.,
|
||||
Ceph) as built-in services. Such components can run on Kubernetes, and/or
|
||||
can be accessed by applications running on Kubernetes through portable
|
||||
mechanisms, such as the Open Service Broker.
|
||||
* Does not dictate logging, monitoring, or alerting solutions. It provides
|
||||
some integrations as proof of concept, and mechanisms to collect and
|
||||
export metrics.
|
||||
* Does not provide nor mandate a configuration language/system (e.g.,
|
||||
[jsonnet](https://github.com/google/jsonnet)). It provides a declarative
|
||||
API that may be targeted by arbitrary forms of declarative specifications.
|
||||
* Does not provide nor adopt any comprehensive machine configuration,
|
||||
maintenance, management, or self-healing systems.
|
||||
|
||||
Additionally, Kubernetes is not a mere *orchestration system*. In
|
||||
fact, it eliminates the need for orchestration. The technical
|
||||
definition of *orchestration* is execution of a defined workflow:
|
||||
first do A, then B, then C. In contrast, Kubernetes is comprised of a
|
||||
set of independent, composable control processes that continuously
|
||||
drive the current state towards the provided desired state. It
|
||||
shouldn't matter how you get from A to C. Centralized control is also
|
||||
not required. This results in a system that is easier to use and more
|
||||
powerful, robust, resilient, and extensible.
|
||||
|
||||
#### Why containers?
|
||||
|
||||
Looking for reasons why you should be using containers?
|
||||
|
||||

|
||||
|
||||
The *Old Way* to deploy applications was to install the applications
|
||||
on a host using the operating-system package manager. This had the
|
||||
disadvantage of entangling the applications' executables,
|
||||
configuration, libraries, and lifecycles with each other and with the
|
||||
host OS. One could build immutable virtual-machine images in order to
|
||||
achieve predictable rollouts and rollbacks, but VMs are heavyweight
|
||||
and non-portable.
|
||||
|
||||
The *New Way* is to deploy containers based on operating-system-level
|
||||
virtualization rather than hardware virtualization. These containers
|
||||
are isolated from each other and from the host: they have their own
|
||||
filesystems, they can't see each others' processes, and their
|
||||
computational resource usage can be bounded. They are easier to build
|
||||
than VMs, and because they are decoupled from the underlying
|
||||
infrastructure and from the host filesystem, they are portable across
|
||||
clouds and OS distributions.
|
||||
|
||||
Because containers are small and fast, one application can be packed
|
||||
in each container image. This one-to-one application-to-image
|
||||
relationship unlocks the full benefits of containers. With containers,
|
||||
immutable container images can be created at build/release time rather
|
||||
than deployment time, since each application doesn't need to be
|
||||
composed with the rest of the application stack, nor married to the
|
||||
production infrastructure environment. Generating container images at
|
||||
build/release time enables a consistent environment to be carried from
|
||||
development into production. Similarly, containers are vastly more
|
||||
transparent than VMs, which facilitates monitoring and
|
||||
management. This is especially true when the containers' process
|
||||
lifecycles are managed by the infrastructure rather than hidden by a
|
||||
process supervisor inside the container. Finally, with a single
|
||||
application per container, managing the containers becomes tantamount
|
||||
to managing deployment of the application.
|
||||
|
||||
Summary of container benefits:
|
||||
|
||||
* **Agile application creation and deployment**:
|
||||
Increased ease and efficiency of container image creation compared to VM image use.
|
||||
* **Continuous development, integration, and deployment**:
|
||||
Provides for reliable and frequent container image build and
|
||||
deployment with quick and easy rollbacks (due to image
|
||||
immutability).
|
||||
* **Dev and Ops separation of concerns**:
|
||||
Create application container images at build/release time rather
|
||||
than deployment time, thereby decoupling applications from
|
||||
infrastructure.
|
||||
* **Observability**
|
||||
Not only surfaces OS-level information and metrics, but also application
|
||||
health and other signals.
|
||||
* **Environmental consistency across development, testing, and production**:
|
||||
Runs the same on a laptop as it does in the cloud.
|
||||
* **Cloud and OS distribution portability**:
|
||||
Runs on Ubuntu, RHEL, CoreOS, on-prem, Google Kubernetes Engine, and anywhere else.
|
||||
* **Application-centric management**:
|
||||
Raises the level of abstraction from running an OS on virtual
|
||||
hardware to run an application on an OS using logical resources.
|
||||
* **Loosely coupled, distributed, elastic, liberated [micro-services](https://martinfowler.com/articles/microservices.html)**:
|
||||
Applications are broken into smaller, independent pieces and can
|
||||
be deployed and managed dynamically -- not a fat monolithic stack
|
||||
running on one big single-purpose machine.
|
||||
* **Resource isolation**:
|
||||
Predictable application performance.
|
||||
* **Resource utilization**:
|
||||
High efficiency and density.
|
||||
|
||||
#### What does *Kubernetes* mean? K8s?
|
||||
|
||||
The name **Kubernetes** originates from Greek, meaning *helmsman* or
|
||||
*pilot*, and is the root of *governor* and
|
||||
[cybernetic](http://www.etymonline.com/index.php?term=cybernetics). *K8s*
|
||||
is an abbreviation derived by replacing the 8 letters "ubernete" with
|
||||
"8".
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
* Ready to [Get Started](/docs/setup/)?
|
||||
* For more details, see the [Kubernetes Documentation](/docs/home/).
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: "Working with Kubernetes Objects"
|
||||
weight: 40
|
||||
---
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: Annotations
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
You can use Kubernetes annotations to attach arbitrary non-identifying metadata
|
||||
to objects. Clients such as tools and libraries can retrieve this metadata.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
## Attaching metadata to objects
|
||||
|
||||
You can use either labels or annotations to attach metadata to Kubernetes
|
||||
objects. Labels can be used to select objects and to find
|
||||
collections of objects that satisfy certain conditions. In contrast, annotations
|
||||
are not used to identify and select objects. The metadata
|
||||
in an annotation can be small or large, structured or unstructured, and can
|
||||
include characters not permitted by labels.
|
||||
|
||||
Annotations, like labels, are key/value maps:
|
||||
|
||||
```json
|
||||
"metadata": {
|
||||
"annotations": {
|
||||
"key1" : "value1",
|
||||
"key2" : "value2"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Here are some examples of information that could be recorded in annotations:
|
||||
|
||||
* Fields managed by a declarative configuration layer. Attaching these fields
|
||||
as annotations distinguishes them from default values set by clients or
|
||||
servers, and from auto-generated fields and fields set by
|
||||
auto-sizing or auto-scaling systems.
|
||||
|
||||
* Build, release, or image information like timestamps, release IDs, git branch,
|
||||
PR numbers, image hashes, and registry address.
|
||||
|
||||
* Pointers to logging, monitoring, analytics, or audit repositories.
|
||||
|
||||
* Client library or tool information that can be used for debugging purposes:
|
||||
for example, name, version, and build information.
|
||||
|
||||
* User or tool/system provenance information, such as URLs of related objects
|
||||
from other ecosystem components.
|
||||
|
||||
* Lightweight rollout tool metadata: for example, config or checkpoints.
|
||||
|
||||
* Phone or pager numbers of persons responsible, or directory entries that
|
||||
specify where that information can be found, such as a team web site.
|
||||
|
||||
Instead of using annotations, you could store this type of information in an
|
||||
external database or directory, but that would make it much harder to produce
|
||||
shared client libraries and tools for deployment, management, introspection,
|
||||
and the like.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
Learn more about [Labels and Selectors](/docs/concepts/overview/working-with-objects/labels/).
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
---
|
||||
title: Understanding Kubernetes Objects
|
||||
content_template: templates/concept
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
This page explains how Kubernetes objects are represented in the Kubernetes API, and how you can express them in `.yaml` format.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
## Understanding Kubernetes Objects
|
||||
|
||||
*Kubernetes Objects* are persistent entities in the Kubernetes system. Kubernetes uses these entities to represent the state of your cluster. Specifically, they can describe:
|
||||
|
||||
* What containerized applications are running (and on which nodes)
|
||||
* The resources available to those applications
|
||||
* The policies around how those applications behave, such as restart policies, upgrades, and fault-tolerance
|
||||
|
||||
A Kubernetes object is a "record of intent"--once you create the object, the Kubernetes system will constantly work to ensure that object exists. By creating an object, you're effectively telling the Kubernetes system what you want your cluster's workload to look like; this is your cluster's **desired state**.
|
||||
|
||||
To work with Kubernetes objects--whether to create, modify, or delete them--you'll need to use the [Kubernetes API](/docs/concepts/overview/kubernetes-api/). When you use the `kubectl` command-line interface, for example, the CLI makes the necessary Kubernetes API calls for you. You can also use the Kubernetes API directly in your own programs using one of the [Client Libraries](/docs/reference/client-libraries/).
|
||||
|
||||
### Object Spec and Status
|
||||
|
||||
Every Kubernetes object includes two nested object fields that govern the object's configuration: the object *spec* and the object *status*. The *spec*, which you must provide, describes your *desired state* for the object--the characteristics that you want the object to have. The *status* describes the *actual state* of the object, and is supplied and updated by the Kubernetes system. At any given time, the Kubernetes Control Plane actively manages an object's actual state to match the desired state you supplied.
|
||||
|
||||
|
||||
For example, a Kubernetes Deployment is an object that can represent an application running on your cluster. When you create the Deployment, you might set the Deployment spec to specify that you want three replicas of the application to be running. The Kubernetes system reads the Deployment spec and starts three instances of your desired application--updating the status to match your spec. If any of those instances should fail (a status change), the Kubernetes system responds to the difference between spec and status by making a correction--in this case, starting a replacement instance.
|
||||
|
||||
For more information on the object spec, status, and metadata, see the [Kubernetes API Conventions](https://git.k8s.io/community/contributors/devel/api-conventions.md).
|
||||
|
||||
### Describing a Kubernetes Object
|
||||
|
||||
When you create an object in Kubernetes, you must provide the object spec that describes its desired state, as well as some basic information about the object (such as a name). When you use the Kubernetes API to create the object (either directly or via `kubectl`), that API request must include that information as JSON in the request body. **Most often, you provide the information to `kubectl` in a .yaml file.** `kubectl` converts the information to JSON when making the API request.
|
||||
|
||||
Here's an example `.yaml` file that shows the required fields and object spec for a Kubernetes Deployment:
|
||||
|
||||
{{< code file="nginx-deployment.yaml" >}}
|
||||
|
||||
One way to create a Deployment using a `.yaml` file like the one above is to use the [`kubectl create`](/docs/reference/generated/kubectl/kubectl-commands#create) command in the `kubectl` command-line interface, passing the `.yaml` file as an argument. Here's an example:
|
||||
|
||||
```shell
|
||||
$ kubectl create -f https://k8s.io/docs/concepts/overview/working-with-objects/nginx-deployment.yaml --record
|
||||
```
|
||||
|
||||
The output is similar to this:
|
||||
|
||||
```shell
|
||||
deployment "nginx-deployment" created
|
||||
```
|
||||
|
||||
### Required Fields
|
||||
|
||||
In the `.yaml` file for the Kubernetes object you want to create, you'll need to set values for the following fields:
|
||||
|
||||
* `apiVersion` - Which version of the Kubernetes API you're using to create this object
|
||||
* `kind` - What kind of object you want to create
|
||||
* `metadata` - Data that helps uniquely identify the object, including a `name` string, UID, and optional `namespace`
|
||||
|
||||
You'll also need to provide the object `spec` field. The precise format of the object `spec` is different for every Kubernetes object, and contains nested fields specific to that object. The [Kubernetes API Reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/) can help you find the spec format for all of the objects you can create using Kubernetes.
|
||||
For example, the `spec` format for a `Pod` object can be found
|
||||
[here](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core),
|
||||
and the `spec` format for a `Deployment` object can be found
|
||||
[here](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deploymentspec-v1-apps).
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture whatsnext %}}
|
||||
* Learn about the most important basic Kubernetes objects, such as [Pod](/docs/concepts/workloads/pods/pod-overview/).
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
---
|
||||
reviewers:
|
||||
- mikedanese
|
||||
title: Labels and Selectors
|
||||
---
|
||||
|
||||
_Labels_ are key/value pairs that are attached to objects, such as pods.
|
||||
Labels are intended to be used to specify identifying attributes of objects that are meaningful and relevant to users, but do not directly imply semantics to the core system.
|
||||
Labels can be used to organize and to select subsets of objects. Labels can be attached to objects at creation time and subsequently added and modified at any time.
|
||||
Each object can have a set of key/value labels defined. Each Key must be unique for a given object.
|
||||
|
||||
```json
|
||||
"metadata": {
|
||||
"labels": {
|
||||
"key1" : "value1",
|
||||
"key2" : "value2"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
We'll eventually index and reverse-index labels for efficient queries and watches, use them to sort and group in UIs and CLIs, etc. We don't want to pollute labels with non-identifying, especially large and/or structured, data. Non-identifying information should be recorded using [annotations](/docs/concepts/overview/working-with-objects/annotations/).
|
||||
|
||||
{{< toc >}}
|
||||
|
||||
## Motivation
|
||||
|
||||
Labels enable users to map their own organizational structures onto system objects in a loosely coupled fashion, without requiring clients to store these mappings.
|
||||
|
||||
Service deployments and batch processing pipelines are often multi-dimensional entities (e.g., multiple partitions or deployments, multiple release tracks, multiple tiers, multiple micro-services per tier). Management often requires cross-cutting operations, which breaks encapsulation of strictly hierarchical representations, especially rigid hierarchies determined by the infrastructure rather than by users.
|
||||
|
||||
Example labels:
|
||||
|
||||
* `"release" : "stable"`, `"release" : "canary"`
|
||||
* `"environment" : "dev"`, `"environment" : "qa"`, `"environment" : "production"`
|
||||
* `"tier" : "frontend"`, `"tier" : "backend"`, `"tier" : "cache"`
|
||||
* `"partition" : "customerA"`, `"partition" : "customerB"`
|
||||
* `"track" : "daily"`, `"track" : "weekly"`
|
||||
|
||||
These are just examples of commonly used labels; you are free to develop your own conventions. Keep in mind that label Key must be unique for a given object.
|
||||
|
||||
## Syntax and character set
|
||||
|
||||
_Labels_ are key/value pairs. Valid label keys have two segments: an optional prefix and name, separated by a slash (`/`). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (`.`), not longer than 253 characters in total, followed by a slash (`/`).
|
||||
If the prefix is omitted, the label Key is presumed to be private to the user. Automated system components (e.g. `kube-scheduler`, `kube-controller-manager`, `kube-apiserver`, `kubectl`, or other third-party automation) which add labels to end-user objects must specify a prefix. The `kubernetes.io/` prefix is reserved for Kubernetes core components.
|
||||
|
||||
Valid label values must be 63 characters or less and must be empty or begin and end with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between.
|
||||
|
||||
## Label selectors
|
||||
|
||||
Unlike [names and UIDs](/docs/user-guide/identifiers), labels do not provide uniqueness. In general, we expect many objects to carry the same label(s).
|
||||
|
||||
Via a _label selector_, the client/user can identify a set of objects. The label selector is the core grouping primitive in Kubernetes.
|
||||
|
||||
The API currently supports two types of selectors: _equality-based_ and _set-based_.
|
||||
A label selector can be made of multiple _requirements_ which are comma-separated. In the case of multiple requirements, all must be satisfied so the comma separator acts as a logical _AND_ (`&&`) operator.
|
||||
|
||||
An empty label selector (that is, one with zero requirements) selects every object in the collection.
|
||||
|
||||
A null label selector (which is only possible for optional selector fields) selects no objects.
|
||||
|
||||
{{< note >}}
|
||||
**Note**: the label selectors of two controllers must not overlap within a namespace, otherwise they will fight with each other.
|
||||
{{< /note >}}
|
||||
|
||||
### _Equality-based_ requirement
|
||||
|
||||
_Equality-_ or _inequality-based_ requirements allow filtering by label keys and values. Matching objects must satisfy all of the specified label constraints, though they may have additional labels as well.
|
||||
Three kinds of operators are admitted `=`,`==`,`!=`. The first two represent _equality_ (and are simply synonyms), while the latter represents _inequality_. For example:
|
||||
|
||||
```
|
||||
environment = production
|
||||
tier != frontend
|
||||
```
|
||||
|
||||
The former selects all resources with key equal to `environment` and value equal to `production`.
|
||||
The latter selects all resources with key equal to `tier` and value distinct from `frontend`, and all resources with no labels with the `tier` key.
|
||||
One could filter for resources in `production` excluding `frontend` using the comma operator: `environment=production,tier!=frontend`
|
||||
|
||||
One usage scenario for equality-based label requirement is for Pods to specify
|
||||
node selection criteria. For example, the sample Pod below selects nodes with
|
||||
the label "`accelerator=nvidia-tesla-p100`".
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: cuda-test
|
||||
spec:
|
||||
containers:
|
||||
- name: cuda-test
|
||||
image: "k8s.gcr.io/cuda-vector-add:v0.1"
|
||||
resources:
|
||||
limits:
|
||||
nvidia.com/gpu: 1
|
||||
nodeSelector:
|
||||
accelerator: nvidia-tesla-p100
|
||||
```
|
||||
|
||||
### _Set-based_ requirement
|
||||
|
||||
_Set-based_ label requirements allow filtering keys according to a set of values. Three kinds of operators are supported: `in`,`notin` and `exists` (only the key identifier). For example:
|
||||
|
||||
```
|
||||
environment in (production, qa)
|
||||
tier notin (frontend, backend)
|
||||
partition
|
||||
!partition
|
||||
```
|
||||
|
||||
The first example selects all resources with key equal to `environment` and value equal to `production` or `qa`.
|
||||
The second example selects all resources with key equal to `tier` and values other than `frontend` and `backend`, and all resources with no labels with the `tier` key.
|
||||
The third example selects all resources including a label with key `partition`; no values are checked.
|
||||
The fourth example selects all resources without a label with key `partition`; no values are checked.
|
||||
Similarly the comma separator acts as an _AND_ operator. So filtering resources with a `partition` key (no matter the value) and with `environment` different than `qa` can be achieved using `partition,environment notin (qa)`.
|
||||
The _set-based_ label selector is a general form of equality since `environment=production` is equivalent to `environment in (production)`; similarly for `!=` and `notin`.
|
||||
|
||||
_Set-based_ requirements can be mixed with _equality-based_ requirements. For example: `partition in (customerA, customerB),environment!=qa`.
|
||||
|
||||
|
||||
## API
|
||||
|
||||
### LIST and WATCH filtering
|
||||
|
||||
LIST and WATCH operations may specify label selectors to filter the sets of objects returned using a query parameter. Both requirements are permitted (presented here as they would appear in a URL query string):
|
||||
|
||||
* _equality-based_ requirements: `?labelSelector=environment%3Dproduction,tier%3Dfrontend`
|
||||
* _set-based_ requirements: `?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29`
|
||||
|
||||
Both label selector styles can be used to list or watch resources via a REST client. For example, targeting `apiserver` with `kubectl` and using _equality-based_ one may write:
|
||||
|
||||
```shell
|
||||
$ kubectl get pods -l environment=production,tier=frontend
|
||||
```
|
||||
|
||||
or using _set-based_ requirements:
|
||||
|
||||
```shell
|
||||
$ kubectl get pods -l 'environment in (production),tier in (frontend)'
|
||||
```
|
||||
|
||||
As already mentioned _set-based_ requirements are more expressive. For instance, they can implement the _OR_ operator on values:
|
||||
|
||||
```shell
|
||||
$ kubectl get pods -l 'environment in (production, qa)'
|
||||
```
|
||||
|
||||
or restricting negative matching via _exists_ operator:
|
||||
|
||||
```shell
|
||||
$ kubectl get pods -l 'environment,environment notin (frontend)'
|
||||
```
|
||||
|
||||
### Set references in API objects
|
||||
|
||||
Some Kubernetes objects, such as [`services`](/docs/user-guide/services) and [`replicationcontrollers`](/docs/user-guide/replication-controller), also use label selectors to specify sets of other resources, such as [pods](/docs/user-guide/pods).
|
||||
|
||||
#### Service and ReplicationController
|
||||
|
||||
The set of pods that a `service` targets is defined with a label selector. Similarly, the population of pods that a `replicationcontroller` should manage is also defined with a label selector.
|
||||
|
||||
Labels selectors for both objects are defined in `json` or `yaml` files using maps, and only _equality-based_ requirement selectors are supported:
|
||||
|
||||
```json
|
||||
"selector": {
|
||||
"component" : "redis",
|
||||
}
|
||||
```
|
||||
or
|
||||
|
||||
```yaml
|
||||
selector:
|
||||
component: redis
|
||||
```
|
||||
|
||||
this selector (respectively in `json` or `yaml` format) is equivalent to `component=redis` or `component in (redis)`.
|
||||
|
||||
#### Resources that support set-based requirements
|
||||
|
||||
Newer resources, such as [`Job`](/docs/concepts/jobs/run-to-completion-finite-workloads/), [`Deployment`](/docs/concepts/workloads/controllers/deployment/), [`Replica Set`](/docs/concepts/workloads/controllers/replicaset/), and [`Daemon Set`](/docs/concepts/workloads/controllers/daemonset/), support _set-based_ requirements as well.
|
||||
|
||||
```yaml
|
||||
selector:
|
||||
matchLabels:
|
||||
component: redis
|
||||
matchExpressions:
|
||||
- {key: tier, operator: In, values: [cache]}
|
||||
- {key: environment, operator: NotIn, values: [dev]}
|
||||
```
|
||||
|
||||
`matchLabels` is a map of `{key,value}` pairs. A single `{key,value}` in the `matchLabels` map is equivalent to an element of `matchExpressions`, whose `key` field is "key", the `operator` is "In", and the `values` array contains only "value". `matchExpressions` is a list of pod selector requirements. Valid operators include In, NotIn, Exists, and DoesNotExist. The values set must be non-empty in the case of In and NotIn. All of the requirements, from both `matchLabels` and `matchExpressions` are ANDed together -- they must all be satisfied in order to match.
|
||||
|
||||
#### Selecting sets of nodes
|
||||
|
||||
One use case for selecting over labels is to constrain the set of nodes onto which a pod can schedule.
|
||||
See the documentation on [node selection](/docs/concepts/configuration/assign-pod-node/) for more information.
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
reviewers:
|
||||
- mikedanese
|
||||
- thockin
|
||||
title: Names
|
||||
---
|
||||
|
||||
All objects in the Kubernetes REST API are unambiguously identified by a Name and a UID.
|
||||
|
||||
For non-unique user-provided attributes, Kubernetes provides [labels](/docs/user-guide/labels) and [annotations](/docs/concepts/overview/working-with-objects/annotations/).
|
||||
|
||||
See the [identifiers design doc](https://git.k8s.io/community/contributors/design-proposals/architecture/identifiers.md) for the precise syntax rules for Names and UIDs.
|
||||
|
||||
## Names
|
||||
|
||||
{{< glossary_definition term_id="name" length="all" >}}
|
||||
|
||||
By convention, the names of Kubernetes resources should be up to maximum length of 253 characters and consist of lower case alphanumeric characters, `-`, and `.`, but certain resources have more specific restrictions.
|
||||
|
||||
## UIDs
|
||||
|
||||
{{< glossary_definition term_id="uid" length="all" >}}
|
||||
@@ -0,0 +1,89 @@
|
||||
---
|
||||
reviewers:
|
||||
- derekwaynecarr
|
||||
- mikedanese
|
||||
- thockin
|
||||
title: Namespaces
|
||||
---
|
||||
|
||||
Kubernetes supports multiple virtual clusters backed by the same physical cluster.
|
||||
These virtual clusters are called namespaces.
|
||||
|
||||
## When to Use Multiple Namespaces
|
||||
|
||||
Namespaces are intended for use in environments with many users spread across multiple
|
||||
teams, or projects. For clusters with a few to tens of users, you should not
|
||||
need to create or think about namespaces at all. Start using namespaces when you
|
||||
need the features they provide.
|
||||
|
||||
Namespaces provide a scope for names. Names of resources need to be unique within a namespace, but not across namespaces.
|
||||
|
||||
Namespaces are a way to divide cluster resources between multiple users (via [resource quota](/docs/concepts/policy/resource-quotas/)).
|
||||
|
||||
In future versions of Kubernetes, objects in the same namespace will have the same
|
||||
access control policies by default.
|
||||
|
||||
It is not necessary to use multiple namespaces just to separate slightly different
|
||||
resources, such as different versions of the same software: use [labels](/docs/user-guide/labels) to distinguish
|
||||
resources within the same namespace.
|
||||
|
||||
## Working with Namespaces
|
||||
|
||||
Creation and deletion of namespaces are described in the [Admin Guide documentation
|
||||
for namespaces](/docs/admin/namespaces).
|
||||
|
||||
### Viewing namespaces
|
||||
|
||||
You can list the current namespaces in a cluster using:
|
||||
|
||||
```shell
|
||||
$ kubectl get namespaces
|
||||
NAME STATUS AGE
|
||||
default Active 1d
|
||||
kube-system Active 1d
|
||||
kube-public Active 1d
|
||||
```
|
||||
|
||||
Kubernetes starts with three initial namespaces:
|
||||
|
||||
* `default` The default namespace for objects with no other namespace
|
||||
* `kube-system` The namespace for objects created by the Kubernetes system
|
||||
* `kube-public` The namespace is created automatically and readable by all users (including those not authenticated). This namespace is mostly reserved for cluster usage, in case that some resources should be visible and readable publicly throughout the whole cluster. The public aspect of this namespace is only a convention, not a requirement.
|
||||
|
||||
### Setting the namespace for a request
|
||||
|
||||
To temporarily set the namespace for a request, use the `--namespace` flag.
|
||||
|
||||
For example:
|
||||
|
||||
```shell
|
||||
$ kubectl --namespace=<insert-namespace-name-here> run nginx --image=nginx
|
||||
$ kubectl --namespace=<insert-namespace-name-here> get pods
|
||||
```
|
||||
|
||||
### Setting the namespace preference
|
||||
|
||||
You can permanently save the namespace for all subsequent kubectl commands in that
|
||||
context.
|
||||
|
||||
```shell
|
||||
$ kubectl config set-context $(kubectl config current-context) --namespace=<insert-namespace-name-here>
|
||||
# Validate it
|
||||
$ kubectl config view | grep namespace:
|
||||
```
|
||||
|
||||
## Namespaces and DNS
|
||||
|
||||
When you create a [Service](/docs/user-guide/services), it creates a corresponding [DNS entry](/docs/concepts/services-networking/dns-pod-service/).
|
||||
This entry is of the form `<service-name>.<namespace-name>.svc.cluster.local`, which means
|
||||
that if a container just uses `<service-name>`, it will resolve to the service which
|
||||
is local to a namespace. This is useful for using the same configuration across
|
||||
multiple namespaces such as Development, Staging and Production. If you want to reach
|
||||
across namespaces, you need to use the fully qualified domain name (FQDN).
|
||||
|
||||
## Not All Objects are in a Namespace
|
||||
|
||||
Most Kubernetes resources (e.g. pods, services, replication controllers, and others) are
|
||||
in some namespaces. However namespace resources are not themselves in a namespace.
|
||||
And low-level resources, such as [nodes](/docs/admin/node) and
|
||||
persistentVolumes, are not in any namespace.
|
||||
@@ -0,0 +1,19 @@
|
||||
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
Reference in New Issue
Block a user