Reputation: 26495
I would like to see all resources in a namespace.
Doing kubectl get all
will, despite of the name, not list things like services and ingresses.
If I know the the type I can explicitly ask for that particular type, but it seems there is also no command for listing all possible types. (Especially kubectl get
does for example not list custom types).
How to show all resources before for example deleting that namespace?
Upvotes: 220
Views: 292353
Reputation: 31
I think this could be se simplest way to print out all the resource name in a kubernetes cluster:
#!/bin/bash
kubectl api-resources -o name | while read -r resource; do
echo "listing ${resource}..."
kubectl get "${resource}" --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}'
done
to specify the namespace you just need to modify the line in the loop setting --namespace=<your-namespace> and remove --all-namespaces
Upvotes: 3
Reputation: 2237
This worked for me
kubectl get all,cm,secret,ing,pod -A | grep <namespace>
Please note this command does not guarantee that it will only list the resources of <namespace>
. It will list all the resources that match the given grep
filter.
Upvotes: 3
Reputation: 4404
If you are using kubectl krew plug-in, I will suggest using get-all.
It can get almost 90% of resources. Including configmap
, secret
, endpoints
, istio
, etc...
Upvotes: 13
Reputation: 1005
Here's a PowerShell version of what other's have said
function getall {
# https://stackoverflow.com/questions/47691479/listing-all-resources-in-a-namespace
[CmdletBinding()]
param(
$namespace
)
$types=kubectl api-resources --verbs=list --namespaced -o name
kubectl get $($types -join ",") -n $namespace --show-kind
}
Upvotes: 1
Reputation: 8001
This may not get all resources but it may be what someone is looking for
kubectl get all,cm,secret,ing -A
This seems to get most of the resources, prefixed with the type.
At least, it gets:
This doesn't get custom resources but does get services.
Else this does something similar:
for i in `kubectl api-resources | awk '{print $1}'`; do kubectl get $i; done
Running v1.13
Upvotes: 105
Reputation: 356
Following this solution, in fish shell it looks like below.
Add the following function to your ~/.config/fish/config.fish
function kall
kubectl -n $argv get (string join ',' (kubectl api-resources --namespaced --verbs list -o name))
end
Upvotes: 0
Reputation: 628
I ended up needing this same functionality due to failed Helm deployments that left remnants in a specific namespace. Here's a function you can put in your bash profile:
function kubectlgetall {
for i in $(kubectl api-resources --verbs=list --namespaced -o name | grep -v "events.events.k8s.io" | grep -v "events" | sort | uniq); do
echo "Resource:" $i
if [ -z "$1" ]
then
kubectl get --ignore-not-found ${i}
else
kubectl -n ${1} get --ignore-not-found ${i}
fi
done
}
Usage: kubectlgetall <namespace>
Example: get all resources from the kafka
namespace:
kubectlgetall kafka
Upvotes: 38
Reputation: 1209
Complete solution
kubectl -n <NAMESPACE> get $(kubectl api-resources --namespaced=true --no-headers -o name | egrep -v 'events|nodes' | paste -s -d, - ) --no-headers
Upvotes: 17
Reputation: 607
Just covering some basics:
kubectl get
command.-n [NAMESPACE]
or --namespace [NAMESPACE]
flags.
-A
(same as --all-namespaces
) flag in the following examples for brevity.Some of the other answers show how to list available resource types:
kubectl api-resources --verbs=list -o name
With this in mind, we can get all resources, leveraging xargs
and sed
:
kubectl get "all,$(kubectl api-resources --verbs=list -o name | xargs | sed 's/ /,/g')" -A
An alternative to xargs
is to use tr
:
kubectl get "$(kubectl api-resources --verbs=list -o name | tr '\n' ',')all" -A
Upvotes: 2
Reputation: 483
It's not a 100% solution, but for me works the following
kgetall='kubectl get namespace,replicaset,secret,nodes,job,daemonset,statefulset,ingress,configmap,pv,pvc,service,deployment,pod --all-namespaces'
and just call
kgetall
But obviously I expected that behavior from
kubectl get all --all-namespaces
in the first place.
Upvotes: 4
Reputation: 306
Answer of rcorre is correct but for N resources it make N requests to cluster (so for a lot of resources this approach is very slow). Moreover, not found resources (that have not instances) are very slow for getting with kubectl get
.
There is a better way to make a request for multiple resources:
kubectl get pods,svc,secrets
instead of
kubectl get pods
kubectl get svc
kubectl get secrets
So the answer is:
#!/usr/bin/env bash
# get all names and concatenate them with comma
NAMES="$(kubectl api-resources \
--namespaced \
--verbs list \
-o name \
| tr '\n' ,)"
# ${NAMES:0:-1} -- because of `tr` command added trailing comma
# --show-kind is optional
kubectl get "${NAMES:0:-1}" --show-kind
or
#!/usr/bin/env bash
# get all names
NAMES=( $(kubectl api-resources \
--namespaced \
--verbs list \
-o name) )
# Now join names into single string delimited with comma
# Note *, not @
IFS=,
NAMES="${NAMES[*]}"
unset IFS
# --show-kind is enabled implicitly
kubectl get "$NAMES"
Upvotes: 16
Reputation: 71
A Powershell implementation of rcorre's answer would look like
kubectl api-resources --verbs=list --namespaced -o name | `
%{ kubectl get $_ --show-kind --ignore-not-found -l <label>=<value> -n <namespace> }
Upvotes: 7
Reputation: 7188
Based on this comment , the supported way to list all resources is to iterate through all the api versions listed by kubectl api-resources
:
kubectl api-resources enumerates the resource types available in your cluster.
this means you can combine it with kubectl get to actually list every instance of every resource type in a namespace:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -l <label>=<value> -n <namespace>
Upvotes: 192
Reputation: 28593
All kubernetes objects are stored in etcd.
All objects are stored in ETCD v3 the following way:
/registry/<object_type>/<namespace>/<name>
I suggest just to take the list of all resources of some namespace from etcd v3 directly:
ETCDCTL_API=3 etcdctl --endpoints=<etcd_ip>:2379 get / --prefix --keys-only | grep -E "^/\w+/\w+/<namespace>/+"
Upvotes: 2