[!NOTE]
A plugin for Kubernetes command-line tool kubectl, which allows you to convert manifests between different API versions. This can be particularly helpful to migrate manifests to a non-deprecated api version with newer Kubernetes release.
sha256 check
osx
completion
[!NOTE]
The Homebrew installation of bash-completion v2 sources all the files in the BASH_COMPLETION_COMPAT_DIR directory, that's why the latter two methods work
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/$(uname | awk '{print tolower($0)}')/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
# verify
$ kubectl version --client --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.25.3
Kustomize Version: v4.5.
$ kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-1 Healthy {"health":"true"}
etcd-2 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
$ kubectl -n devops get po -o custom-columns='NAME:metadata.name'
$ kubectl -n devops get deploy jenkins -o custom-columns="NAME:metadata.name, IMAGES:..image"
NAME IMAGES
jenkins jenkins/jenkins:2.187
$ kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName \
--all-namespaces
$ kubectl get pods -o wide --sort-by="{.spec.nodeName}"
$ kubectl get pods --sort-by="{.status.containerStatuses[:1].restartCount}"
$ kubectl get replicasets -o wide --sort-by=.metadata.creationTimestamp
$ kubectl -n devops get deployment jenkins -o=jsonpath='{.spec.template.spec.containers[:1].image}'
jenkins/jenkins:2.187
$ kubectl -n devops get deploy jenkins -o jsonpath="{..image}"
jenkins/jenkins:2.187
$ kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx
$ kubectl -n <namespace> get po \
-o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
$ kubectl -n <namespace> get po <pod_name> -o jsonpath="{..containerID}"
# or
$ kubectl -n <namespace> get po <pod_name> \
-o go-template \
--template="{{ range .status.containerStatuses }}{{ .containerID }}{{end}}"
$ kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}"
$ kubectl get apiservices.apiregistration.k8s.io
$ kubectl get apiservices.apiregistration.k8s.io v1beta1.metrics.k8s.io -o yaml
$ kubectl get apiservices.apiregistration.k8s.io
NAME SERVICE AVAILABLE AGE
v1. Local True 4y
v1.apps Local True 4y
v1.authentication.k8s.io Local True 4y
v1.authorization.k8s.io Local True 4y
v1.autoscaling Local True 4y
v1.batch Local True 4y
v1.monitoring.coreos.com Local True 168d
v1.networking.k8s.io Local True 4y
v1.rbac.authorization.k8s.io Local True 4y
v1.storage.k8s.io Local True 4y
v1beta1.admissionregistration.k8s.io Local True 4y
v1beta1.apiextensions.k8s.io Local True 4y
v1beta1.apps Local True 4y
v1beta1.authentication.k8s.io Local True 4y
v1beta1.authorization.k8s.io Local True 4y
v1beta1.batch Local True 4y
v1beta1.certificates.k8s.io Local True 4y
v1beta1.coordination.k8s.io Local True 4y
v1beta1.events.k8s.io Local True 4y
v1beta1.extensions Local True 4y
v1beta1.metrics.k8s.io kube-system/metrics-server False (ServiceNotFound) 188d
v1beta1.policy Local True 4y
v1beta1.rbac.authorization.k8s.io Local True 4y
v1beta1.scheduling.k8s.io Local True 4y
v1beta1.storage.k8s.io Local True 4y
v1beta2.apps Local True 4y
v2beta1.autoscaling Local True 4y
v2beta2.autoscaling Local True 4y0
$ kubectl get apiservices.apiregistration.k8s.io v1beta1.metrics.k8s.io -o yaml --export
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: prometheus-adapter
namespace: monitoring
version: v1beta1
versionPriority: 100
status:
conditions:
- lastTransitionTime: 2022-08-15T14:10:39Z
message: all checks passed
reason: Passed
status: "True"
type: Available
$ kubectl api-resources
error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
$ kubectl get apiservices.apiregistration.k8s.io
NAME SERVICE AVAILABLE AGE
v1beta1.metrics.k8s.io kube-system/metrics-server False (ServiceNotFound) 188d
# remove metrics.k8s.io
$ kubectl delete apiservices.apiregistration.k8s.io v1beta1.metrics.k8s.io
# debug
$ kubectl get secrets $(kubectl -n kube-system get sa metrics-server -o 'jsonpath={.secrets[].name}')
Error from server (NotFound): secrets "metrics-server-token-mr49q" not found
$ kubectl get secrets $(kubectl -n kube-system get sa metrics-server -o 'jsonpath={.secrets[].name}') \
-o "jsonpath={.data.ca\.crt}" |
base64 -d |
openssl x509 -text -noout |
grep Not
# get token
$ kubectl get secrets $(kubectl -n kube-system get sa metrics-server -o 'jsonpath={.secrets[].name}') \
-o "jsonpath={.data.token}" |
base64 -d -w0
# get namespace
$ kubectl get secrets $(kubectl -n kube-system get sa metrics-server -o 'jsonpath={.secrets[].name}') \
-o "jsonpath={.data.namespace}" |
base64 -d -w0
# Edit the last-applied-configuration annotations by type/name in YAML
kubectl apply edit-last-applied deployment/nginx
# Edit the last-applied-configuration annotations by file in JSON
kubectl apply edit-last-applied -f deploy.yaml -o json
# format
$ kubectl rollout undo deployment <name> --to-revision=<n>
# -- i.e.: --
# rollout to specific version ( 3 )
$ kubectl -n devops-ci rollout undo deployment/devops-dev-jenkins --to-revision=3
# -- check rollout status --
$ kubectl -n devops-ci rollout status deployment/devops-dev-jenkins
# or
$ kubectl -n devops-ci get deploy devops-dev-jenkins -o jsonpath='{.spec.template.spec.containers[*].image}'
$ kubectl -n devops-ci rollout history deployment/dev-jenkins
deployment.extensions/dev-jenkins
REVISION CHANGE-CAUSE
...
48 <none>
49 <none>
$ kubectl -n devops-ci get replicasets -l app=dev-jenkins --sort-by=.metadata.creationTimestamp
NAME DESIRED CURRENT READY AGE
...
dev-jenkins-f6846c86d 0 0 0 31d
dev-jenkins-569fcd784c 1 1 1 5h21m
# with --record
$ kubectl -n devops-ci set image deployment/dev-jenkins dev-jenkins=artifactory.marvell.com/it-devops-dockerub-remote/jenkins/jenkins:2.512-jdk21 --record
Flag --record has been deprecated, --record will be removed in the future
deployment.extensions/dev-jenkins image updated
$ kubectl -n devops-ci rollout history deployment/dev-jenkins
deployment.extensions/dev-jenkins
REVISION CHANGE-CAUSE
...
48 <none>
49 kubectl set image deployment/dev-jenkins dev-jenkins=artifactory.marvell.com/it-devops-dockerub-remote/jenkins/jenkins:2.512-jdk21 --kubeconfig=/Users/marslo/iMarslo/job/devops/env/linux/dc5-ssdfw8/.kube/config --namespace=devops-ci --record=tru
# with annotate
# -- update --
$ kubectl -n devops-ci set image deployment/dev-jenkins dev-jenkins=artifactory.marvell.com/it-devops-dockerub-remote/jenkins/jenkins:2.512-jdk21 --record
# -- annotate --
$ kubectl -n devops-ci annotate deployment dev-jenkins kubernetes.io/change-cause="Upgrade Jenkins to 2.512-jdk21 @ $(date +'%F %T')"
$ kubectl -n devops-ci rollout history deployment/dev-jenkins
$ kubectl -n devops-ci rollout history deployment/dev-jenkins
deployment.extensions/dev-jenkins
REVISION CHANGE-CAUSE
...
48 <none>
49 upgrade dev jenkins to 2.512-jdk21 @ 2025-06-02 20:45:16
$ kubectl -n devops-ci get rs -l app=dev-jenkins \
-o jsonpath='{range .items[*]}{"REV: "}{.metadata.annotations.deployment\.kubernetes\.io/revision}{" CAUSE: "}{.metadata.annotations.kubernetes\.io/change-cause}{"\n"}{end}'
Warning: short name "rs" could also match lower priority resource replicasets.apps
REV: 49 CAUSE: upgrade dev jenkins to 2.512-jdk21 @ 2025-06-02 20:45:16
REV: 44 CAUSE:
...
# or
$ kubectl -n devops-ci rollout history deployment/dev-jenkins
deployment.extensions/dev-jenkins
REVISION CHANGE-CAUSE
...
48 <none>
49 upgrade dev jenkins to 2.512-jdk21 @ 2025-06-02 20:45:16
$ kubectl -n devops-ci get replicasets -l app=dev-jenkins --sort-by=.metadata.creationTimestamp
NAME DESIRED CURRENT READY AGE
...
dev-jenkins-f6846c86d 0 0 0 31d
dev-jenkins-569fcd784c 1 1 1 5h30m
# show timestamp
$ kubectl -n devops-ci get replicasets -l app=devops-dev-jenkins \
-o=jsonpath='{range .items[*]}{"REVISION: "}{.metadata.annotations.deployment\.kubernetes\.io/revision}{"\tCREATED: "}{.metadata.creationTimestamp}{"\n"}{end}' |
sort
...
REVISION: 48 CREATED: 2025-05-02T23:36:56Z
REVISION: 49 CREATED: 2025-06-02T22:19:17Z