KUBERNETES(1)(kubernetes)

πŸ’– kubectl annotate πŸ’–

okay bestie, welcome to the KUBERNETES(1) manual, the kubernetes one, and today we're doing the absolute glow-up of a command: kubectl annotate. sit down, hydrate, and let's get into it 🫢


✨ NAME ✨

kubectl annotate β€” Update the annotations on a resource. that's it. that's the whole job. slay πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹


---

# 🌸 DESCRIPTION 🌸

Update the annotations on one or more resources. yes, plural, we love a resource type that multitasks ✨

so here's the tea: <purple>every single Kubernetes object</purple> has the ability to store extra data on itself as *annotations*. annotations are <hotpink>key/value pairs</hotpink>, and they're lowkey the cooler sibling of labels because they can be **bigger** than labels and can hold literally any arbitrary string value β€” structured JSON, a whole paragraph, whatever you want, no cap. tools and system extensions will use annotations to stash their own data too, so it's a whole ecosystem thing 🌈

now the βœ‹ important βœ‹ part: trying to set an annotation that <red>already exists will fail</red> unless `--overwrite` is set. and if you pass `--resource-version` and it doesn't match the current resource version on the server, the command <red>fails too</red>. so rude of it but also, like, correctness πŸ’€

and if you ever need the full list of supported resources, run `kubectl api-resources`. go off, king πŸ‘‘

---

# πŸ’… OPTIONS πŸ’…

- **`--all=false`** β€” Select all resources in the namespace of the specified resource types. everybody's getting annotated, no one is safe πŸ’–
- **`-A`, `--all-namespaces=false`** β€” If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with `--namespace`. it's giving "we don't do boundaries here" πŸ¦‹
- **`--allow-missing-template-keys=true`** β€” If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. forgiving queen 🌸
- **`--dry-run="none"`** β€” Must be `"none"`, `"server"`, or `"client"`. If client strategy, only print the object that would be sent, without sending it. If server strategy, submit server-side request without persisting the resource. manifesting without committing, iykyk ✨
- **`--field-manager="kubectl-annotate"`** β€” Name of the manager used to track field ownership. hi, it's me, I'm the manager πŸ’…
- **`--field-selector=""`** β€” Selector (field query) to filter on, supports `'='`, `'=='`, and `'!='`. (e.g. `--field-selector key1=value1,key2=value2`). The server only supports a limited number of field queries per type. fyi, don't get greedy πŸ™ˆ
- **`-f`, `--filename=[]`** β€” identifying the resource.
- **`-k`, `--kustomize=""`** β€” Process a kustomization directory. This flag can't be used together with `-f` or `-R`. pick a lane bestie πŸŽ€
- **`--list=false`** β€” If true, display the annotations for a given resource. just vibes, no changes πŸ‘€
- **`--local=false`** β€” If true, annotation will NOT contact api-server but run locally. offline main character energy πŸŒ™
- **`-o`, `--output=""`** β€” Output format. One of: (`json`, `yaml`, `kyaml`, `name`, `go-template`, `go-template-file`, `template`, `templatefile`, `jsonpath`, `jsonpath-as-json`, `jsonpath-file`). so many options, we're obsessed 🌈
- **`--overwrite=false`** β€” If true, allow annotations to be overwritten, otherwise reject annotation updates that overwrite existing annotations. the gatekeeper fr fr πŸ”₯
- **`--record=false`** β€” Record current kubectl command in the resource annotation. If set to false, do not record the command. If set to true, record the command. If not set, default to updating the existing annotation value only if one already exists. receipts, but make them optional 🧾
- **`-R`, `--recursive=true`** β€” Process the directory used in `-f`, `--filename` recursively. Useful when you want to manage related manifests organized within the same directory. we're going deeper πŸŒ€
- **`--resource-version=""`** β€” If non-empty, the annotation update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource. no sneaky concurrent edits allowed πŸ’€
- **`-l`, `--selector=""`** β€” Selector (label query) to filter on, supports `'='`, `'=='`, and `'!='`. (e.g. `-l key1=value1,key2=value2`)
- **`--show-managed-fields=false`** β€” If true, keep the `managedFields` when printing objects in JSON or YAML format. show us the paperwork πŸ‘‘
- **`--template=""`** β€” Template string or path to template file to use when `-o=go-template`, `-o=go-template-file`. The template format is golang templates [`http://golang.org/pkg/text/template/#pkg-overview`]. go off with your little templates πŸŽ€

---

# πŸŽ€ OPTIONS INHERITED FROM PARENT COMMANDS πŸŽ€

these are the family heirlooms, passed down from `kubectl` itself. still iconic, still yours to use πŸ’œ

- **`--as=""`** β€” Username to impersonate for the operation. User could be a regular user or a service account in a namespace.
- **`--as-group=[]`** β€” Group to impersonate for the operation, this flag can be repeated to specify multiple groups.
- **`--as-uid=""`** β€” UID to impersonate for the operation.
- **`--as-user-extra=[]`** β€” User extras to impersonate for the operation, this flag can be repeated to specify multiple values for the same key.
- **`--cache-dir="/home/username/.kube/cache"`** β€” Default cache directory
- **`--certificate-authority=""`** β€” Path to a cert file for the certificate authority
- **`--client-certificate=""`** β€” Path to a client certificate file for TLS
- **`--client-key=""`** β€” Path to a client key file for TLS
- **`--cluster=""`** β€” The name of the kubeconfig cluster to use
- **`--context=""`** β€” The name of the kubeconfig context to use
- **`--disable-compression=false`** β€” If true, opt-out of response compression for all requests to the server
- **`--insecure-skip-tls-verify=false`** β€” If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure
- **`--kubeconfig=""`** β€” Path to the kubeconfig file to use for CLI requests.
- **`--kuberc=""`** β€” Path to the kuberc file to use for preferences. This can be disabled by exporting `KUBECTL_KUBERC=false` feature gate or turning off the feature `KUBERC=off`.
- **`--match-server-version=false`** β€” Require server version to match client version
- **`-n`, `--namespace=""`** β€” If present, the namespace scope for this CLI request
- **`--password=""`** β€” Password for basic authentication to the API server
- **`--profile="none"`** β€” Name of profile to capture. One of (`none|cpu|heap|goroutine|threadcreate|block|mutex|trace`)
- **`--profile-output="profile.pprof"`** β€” Name of the file to write the profile to
- **`--proxy-url=""`** β€” Proxy URL to use for requests to the API server
- **`--request-timeout="0"`** β€” The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. `1s`, `2m`, `3h`). A value of zero means don't timeout requests.
- **`-s`, `--server=""`** β€” The address and port of the Kubernetes API server
- **`--tls-server-name=""`** β€” Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used
- **`--token=""`** β€” Bearer token for authentication to the API server
- **`--user=""`** β€” The name of the kubeconfig user to use
- **`--username=""`** β€” Username for basic authentication to the API server
- **`--version=false`** β€” `--version`, `--version=raw` prints version information and quits; `--version=vX.Y.Z...` sets the reported version
- **`--warnings-as-errors=false`** β€” Treat warnings received from the server as errors and exit with a non-zero exit code

> lowkey a couple of these are spicy β€” `--insecure-skip-tls-verify` genuinely makes your HTTPS connections insecure, so don't just yeet it into prod, bestie 😭

---

# 🧚 EXAMPLE 🧚

okay here's the demo reel, watch and learn πŸ“

Update pod 'foo' with the annotation 'description' and the value 'my frontend'

If the same annotation is set multiple times, only the last value will be applied

kubectl annotate pods foo description='my frontend'

Update a pod identified by type and name in "pod.json"

kubectl annotate -f pod.json description='my frontend'

Update pod 'foo' with the annotation 'description' and the value 'my frontend running nginx', overwriting any existing value

kubectl annotate --overwrite pods foo description='my frontend running nginx'

Update all pods in the namespace

kubectl annotate pods --all description='my frontend running nginx'

Update pod 'foo' only if the resource is unchanged from version 1

kubectl annotate pods foo description='my frontend running nginx' --resource-version=1

Update pod 'foo' by removing an annotation named 'description' if it exists

Does not require the --overwrite flag

kubectl annotate pods foo description-


see that last one? the little trailing `-`? that's the "delete this annotation" move and it **does not** need `--overwrite`. ate πŸ’…βœ¨

---

# 🌈 SEE ALSO 🌈

- `kubectl(1)`, β€” go read the parent, it's the whole family tree πŸ‘‘

---

# ⭐ HISTORY ⭐

January 2015, Originally compiled by <purple>Eric Paris</purple> (eparis at redhat dot com) based on the kubernetes source material, but hopefully they have been automatically generated since! ngl, that last part is so real 😭

---

and that's the page, bestie 🫢 this lil manual page is from the <pink>`Manuals`</pink> shelf, <hotpink>`User`</hotpink> section, version <purple>`KUBERNETES(1)(kubernetes)`</purple>, originally dated **Jan 2015** by **Eric Paris** β€” take care of it and it'll take care of you. mwah πŸ’–
πŸ“¦ where this page comes from