Proposal for porcelain commands to make working with the last-applied-config easier
This commit is contained in:
parent
e968d88908
commit
572c1e0a26
|
@ -0,0 +1,196 @@
|
||||||
|
# Kubectl apply subcommands for last-config
|
||||||
|
|
||||||
|
## Abstract
|
||||||
|
|
||||||
|
`kubectl apply` uses the `last-applied-config` annotation to compute
|
||||||
|
the removal of fields from local object configuration files and then
|
||||||
|
send patches to delete those fields from the live object. Reading or
|
||||||
|
updating the `last-applied-config` is complex as it requires parsing
|
||||||
|
out and writing to the annotation. Here we propose a set of porcelain
|
||||||
|
commands for users to better understand what is going on in the system
|
||||||
|
and make updates.
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
What is going on behind the scenes with `kubectl apply` is opaque. Users
|
||||||
|
have to interact directly with annotations on the object to view
|
||||||
|
and make changes. In order to stop having `apply` manage a field on
|
||||||
|
an object, it must be manually removed from the annotation and then be removed
|
||||||
|
from the local object configuration. Users should be able to simply edit
|
||||||
|
the local object configuration and set it as the last-applied-config
|
||||||
|
to be used for the next diff base. Storing the last-applied-config
|
||||||
|
in an annotation adds black magic to `kubectl apply`, and it would
|
||||||
|
help users learn and understand if the value was exposed in a discoverable
|
||||||
|
manner.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
1. As a user, I want to be able to diff the last-applied-configuration
|
||||||
|
against the current local configuration to see which changes the command is seeing
|
||||||
|
2. As a user, I want to remove fields from being managed by the local
|
||||||
|
object configuration by removing them from the local object configuration
|
||||||
|
and setting the last-applied-configuration to match.
|
||||||
|
3. As a user, I want to be able to view the last-applied-configuration
|
||||||
|
on the live object that will be used to calculate the diff patch
|
||||||
|
to update the live object from the configuration file.
|
||||||
|
|
||||||
|
## Naming and Format possibilities
|
||||||
|
|
||||||
|
### Naming
|
||||||
|
|
||||||
|
1. *cmd*-last-applied
|
||||||
|
|
||||||
|
Rejected alternatives:
|
||||||
|
|
||||||
|
2. ~~last-config~~
|
||||||
|
3. ~~last-applied-config~~
|
||||||
|
4. ~~last-configuration~~
|
||||||
|
5. ~~last-applied-configuration~~
|
||||||
|
6. ~~last~~
|
||||||
|
|
||||||
|
### Formats
|
||||||
|
|
||||||
|
1. Apply subcommands
|
||||||
|
- `kubectl apply set-last-applied/view-last-applied/diff-last-applied
|
||||||
|
- a little bit odd to have 2 verbs in a row
|
||||||
|
- improves discoverability to have these as subcommands so they are tied to apply
|
||||||
|
|
||||||
|
Rejected alternatives:
|
||||||
|
|
||||||
|
2. ~~Set/View subcommands~~
|
||||||
|
- `kubectl set/view/diff last-applied
|
||||||
|
- consistent with other set/view commands
|
||||||
|
- clutters discoverability of set/view commands since these are only for apply
|
||||||
|
- clutters discoverability for last-applied commands since they are for apply
|
||||||
|
3. ~~Apply flags~~
|
||||||
|
- `kubectl apply [--set-last-applied | --view-last-applied | --diff-last-applied]
|
||||||
|
- Not a fan of these
|
||||||
|
|
||||||
|
## view last-applied
|
||||||
|
|
||||||
|
Porcelain command that retrieves the object and prints the annotation value as yaml or json.
|
||||||
|
|
||||||
|
Prints an error message if the object is not managed by `apply`.
|
||||||
|
|
||||||
|
1. Get the last-applied by type/name
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply view-last-applied deployment/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
run: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Get the last-applied by file, print as json
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply view-last-applied -f deployment_nginx.yaml -o json
|
||||||
|
```
|
||||||
|
|
||||||
|
Same as above, but in json
|
||||||
|
|
||||||
|
## diff last-applied
|
||||||
|
|
||||||
|
Porcelain command that retrieves the object and displays a diff against
|
||||||
|
the local configuration
|
||||||
|
|
||||||
|
1. Diff the last-applied
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply diff-last-applied -f deployment_nginx.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Opens up a 2-way diff in the default diff viewer. This should
|
||||||
|
follow the same semantics as `git diff`. It should accept either a
|
||||||
|
flag `--diff-viewer=meld` or check the environment variable
|
||||||
|
`KUBECTL_EXTERNAL_DIFF=meld`. If neither is specified, the `diff`
|
||||||
|
command should be used.
|
||||||
|
|
||||||
|
This is meant to show the user what they changed in the configuration,
|
||||||
|
since it was last applied, but not show what has changed in the server.
|
||||||
|
|
||||||
|
The supported output formats should be `yaml` and `json`, as specified
|
||||||
|
by the `-o` flag.
|
||||||
|
|
||||||
|
A future goal is to provide a 3-way diff with `kubectl apply diff -f deployment_nginx.yaml`.
|
||||||
|
Together these tools would give the user the ability to see what is going
|
||||||
|
on and compare changes made to the configuration file vs other
|
||||||
|
changes made to the server independent of the configuration file.
|
||||||
|
|
||||||
|
## set last-applied
|
||||||
|
|
||||||
|
Porcelain command that sets the last-applied-config annotation to as
|
||||||
|
if the local configuration file had just been applied.
|
||||||
|
|
||||||
|
1. Set the last-applied-config
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply set-last-applied -f deployment_nginx.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Sends a Patch request to set the last-applied-config as if
|
||||||
|
the configuration had just been applied.
|
||||||
|
|
||||||
|
## edit last-applied
|
||||||
|
|
||||||
|
1. Open the last-applied-config in an editor
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply edit-last-applied -f deployment_nginx.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Since the last-applied-configuration annotation exists only
|
||||||
|
on the live object, this command can alternatively take the
|
||||||
|
kind/name.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl apply edit-last-applied deployment/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
Sends a Patch request to set the last-applied-config to
|
||||||
|
the value saved in the editor.
|
||||||
|
|
||||||
|
## Example workflow to stop managing a field with apply - using get/set
|
||||||
|
|
||||||
|
As a user, I want to have the replicas on a Deployment managed by an autoscaler
|
||||||
|
instead of by the configuration.
|
||||||
|
|
||||||
|
1. Check to make sure the live object is up-to-date
|
||||||
|
- `kubectl apply diff-last-applied -f deployment_nginx.yaml`
|
||||||
|
- Expect no changes
|
||||||
|
2. Update the deployment_nginx.yaml by removing the replicas field
|
||||||
|
3. Diff the last-applied-config to make sure the only change is the removal of the replicas field
|
||||||
|
4. Remove the replicas field from the last-applied-config so it doesn't get deleted next apply
|
||||||
|
- `kubectl apply set-last-applied -f deployment_nginx.yaml`
|
||||||
|
5. Verify the last-applied-config has been updated
|
||||||
|
- `kubectl apply view-last-applied -f deployment_nginx.yaml`
|
||||||
|
|
||||||
|
## Example workflow to stop managing a field with apply - using edit
|
||||||
|
|
||||||
|
1. Check to make sure the live object is up-to-date
|
||||||
|
- `kubectl apply diff-last-applied -f deployment_nginx.yaml`
|
||||||
|
- Expect no changes
|
||||||
|
2. Update the deployment_nginx.yaml by removing the replicas field
|
||||||
|
3. Edit the last-applied-config and remove the replicas field
|
||||||
|
- `kubectl apply edit-last-applied deployment/nginx`
|
||||||
|
4. Verify the last-applied-config has been updated
|
||||||
|
- `kubectl apply view-last-applied -f deployment_nginx.yaml`
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
|
||||||
|
[]()
|
||||||
|
<!-- END MUNGE: GENERATED_ANALYTICS -->
|
Loading…
Reference in New Issue