commit
dc299b3b89
|
@ -0,0 +1,159 @@
|
|||
---
|
||||
kep-number: 6
|
||||
title: Apply
|
||||
authors:
|
||||
- "@lavalamp"
|
||||
owning-sig: sig-api-machinery
|
||||
participating-sigs:
|
||||
- sig-api-machinery
|
||||
- sig-cli
|
||||
reviewers:
|
||||
- "@pwittrock"
|
||||
- "@erictune"
|
||||
approvers:
|
||||
- "@bgrant0607"
|
||||
editor: TBD
|
||||
creation-date: 2018-03-28
|
||||
last-updated: 2018-03-28
|
||||
status: provisional
|
||||
see-also:
|
||||
- n/a
|
||||
replaces:
|
||||
- n/a
|
||||
superseded-by:
|
||||
- n/a
|
||||
---
|
||||
|
||||
# Apply
|
||||
|
||||
## Table of Contents
|
||||
|
||||
TODO: generate from: https://github.com/ekalinin/github-markdown-toc
|
||||
|
||||
## Summary
|
||||
|
||||
`kubectl apply` is a core part of the Kubernetes config workflow, but it is
|
||||
buggy and hard to fix. This functionality will be regularized and moved to the
|
||||
control plane.
|
||||
|
||||
## Motivation
|
||||
|
||||
Example problems today:
|
||||
|
||||
* User does POST, then changes something and applies: surprise!
|
||||
* User does an apply, then `kubectl edit`, then applies again: surprise!
|
||||
* User does GET, edits locally, then apply: surprise!
|
||||
* User tweaks some annotations, then applies: surprise!
|
||||
* Alice applies something, then Bob applies something: surprise!
|
||||
|
||||
Why can't a smaller change fix the problems? Why hasn't it already been fixed?
|
||||
|
||||
* Too many components need to change to deliver a fix
|
||||
* Organic evolution and lack of systematic approach
|
||||
* It is hard to make fixes that cohere instead of interfere without a clear model of the feature
|
||||
* Lack of API support meant client-side implementation
|
||||
* The client sends a PATCH to the server, which necessitated strategic merge patch--as no patch format conveniently captures the data type that is actually needed.
|
||||
* Tactical errors: SMP was not easy to version, fixing anything required client and server changes and a 2 release deprecation period.
|
||||
* The implications of our schema were not understood, leading to bugs.
|
||||
* e.g., non-positional lists, sets, undiscriminated unions, implicit context
|
||||
* Complex and confusing defaulting behavior (e.g., Always pull policy from :latest)
|
||||
* Non-declarative-friendly API behavior (e.g., selector updates)
|
||||
|
||||
### Goals
|
||||
|
||||
"Apply" is intended to allow users and systems to cooperatively determine the
|
||||
desired state of an object. The resulting system should:
|
||||
|
||||
* Be robust to changes made by other users, systems, defaulters (including mutating admission control webhooks), and object schema evolution.
|
||||
* Be agnostic about prior steps in a CI/CD system (and not require such a system).
|
||||
* Have low cognitive burden:
|
||||
* For integrators: a single API concept supports all object types; integrators
|
||||
have to learn one thing total, not one thing per operation per api object.
|
||||
Client side logic should be kept to a minimum; CURL should be sufficient to
|
||||
use the apply feature.
|
||||
* For users: looking at a config change, it should be intuitive what the
|
||||
system will do. The “magic” is easy to understand and invoke.
|
||||
* Error messages should--to the extent possible--tell users why they had a
|
||||
conflict, not just what the conflict was.
|
||||
* Error messages should be delivered at the earliest possible point of
|
||||
intervention.
|
||||
|
||||
Goal: The control plane delivers a comprehensive solution.
|
||||
|
||||
Goal: Apply can be called by non-go languages and non-kubectl clients. (e.g.,
|
||||
via CURL.)
|
||||
|
||||
### Non-Goals
|
||||
|
||||
* Multi-object apply will not be changed: it remains client side for now
|
||||
* Providing an API for just performing merges (without affecting state in the
|
||||
cluster) is left as future work.
|
||||
* Some sources of user confusion will not be addressed:
|
||||
* Changing the name field makes a new object rather than renaming an existing object
|
||||
* Changing fields that can’t really be changed (e.g., Service type).
|
||||
|
||||
## Proposal
|
||||
|
||||
Some highlights of things we intend to change:
|
||||
|
||||
* Apply will be moved to the control plane: [overall design](goo.gl/UbCRuf).
|
||||
* It will be invoked by sending a certain Content-Type with the verb PATCH.
|
||||
* The last-applied annotation will be promoted to a first-class citizen under
|
||||
metadata. Multiple appliers will be allowed.
|
||||
* Apply will have user-targeted and controller-targeted variants.
|
||||
* The Go IDL will be fixed: [design](goo.gl/EBGu2V). OpenAPI data models will be fixed. Result: 2-way and
|
||||
3-way merges can be implemented correctly.
|
||||
* 2-way and 3-way merges will be implemented correctly: [design](goo.gl/nRZVWL).
|
||||
* Dry-run will be implemented on control plane verbs (POST and PUT).
|
||||
* Admission webhooks will have their API appended accordingly.
|
||||
* The defaulting and conversion stack will be solidified to allow converting
|
||||
partially specified objects.
|
||||
* An upgrade path will be implemented so that version skew between kubectl and
|
||||
the control plane will not have disastrous results.
|
||||
* Strategic Merge Patch and the existing merge key annotations will be
|
||||
deprecated. Development on these will stop, but they will not be removed until
|
||||
the v1 API goes away (i.e., likely 3+ years).
|
||||
|
||||
The linked documents should be read for a more complete picture.
|
||||
|
||||
### Implementation Details/Notes/Constraints [optional]
|
||||
|
||||
What are the caveats to the implementation?
|
||||
What are some important details that didn't come across above.
|
||||
Go in to as much detail as necessary here.
|
||||
This might be a good place to talk about core concepts and how they releate.
|
||||
|
||||
### Risks and Mitigations
|
||||
|
||||
There are many things that will need to change. We are considering using a
|
||||
feature branch.
|
||||
|
||||
## Graduation Criteria
|
||||
|
||||
This can be promoted to beta when it is a drop-in replacement for the existing
|
||||
kubectl apply, which has no regressions (which aren't bug fixes).
|
||||
|
||||
This will be promoted to GA once it's gone a sufficient amount of time as beta
|
||||
with no changes.
|
||||
|
||||
## Implementation History
|
||||
|
||||
Major milestones in the life cycle of a KEP should be tracked in `Implementation History`.
|
||||
Major milestones might include
|
||||
|
||||
- the `Summary` and `Motivation` sections being merged signaling SIG acceptance
|
||||
- the `Proposal` section being merged signaling agreement on a proposed design
|
||||
- the date implementation started
|
||||
- the first Kubernetes release where an initial version of the KEP was available
|
||||
- the version of Kubernetes where the KEP graduated to general availability
|
||||
- when the KEP was retired or superseded
|
||||
|
||||
## Drawbacks
|
||||
|
||||
Why should this KEP _not_ be implemented: many bugs in kubectl apply will go
|
||||
away. Users might be depending on the bugs.
|
||||
|
||||
## Alternatives
|
||||
|
||||
It's our belief that all routes to fixing the user pain involve
|
||||
centralizing this functionality in the control plane.
|
|
@ -1 +1 @@
|
|||
6
|
||||
7
|
||||
|
|
Loading…
Reference in New Issue