Kubectl
Шпаргалка по kubectl
--show-managed-fields
- посмотреть какие были операции с объектом
иногда помогает найти когда были работы с объектом, например меняли ли его недавно (может не работать с CRD)
kubectl -n kaas get secret iam-api-secrets --show-managed-fields -o yaml
Сортировка
kubectl get events --sort-by=.metadata.creationTimestamp
Поиск по полю
Скорее всего это все можно делать используя -o jsonpath
но я встречал неоднократные упоминания о багах, по-тому использую jq
простое условие
Получить только имя репликасетов у которых число реплик = 1
kubectl get rs -o json | jq -r '.items[] |select(.status.replicas==1) | .metadata.name'
Поиск специфичного объекта
Получить секрет(ы) у которых в аннотации в поле .metadata.annotations."lcm.mirantis.com/cluster-secret-type"
значение "kubeconfig"
(Пример специфичен для окружений определенного вида, но работает для любых объектов)
kubectl get secret -A -o json | jq ' .items[] | select(.metadata.annotations."lcm.mirantis.com/cluster-secret-type"=="kubeconfig") | .metadata.name'
Как писать такие запросы:
- Получить список, тут видно что все объекты помешены в List
.items[]
{ "apiVersion": "v1", "items": [ { "apiVersion": "v1", "kind": "Secret", "metadata": { "annotations": { "kubernetes.io/service-account.name": "default", "kubernetes.io/service-account.uid": "1ccf69fb-2f37-4684-bb16-19a8f20fd2fe" },
- Конструкция
jq '.items[] | <команда>'
проверяет каждый элемент списка, возвращая только соответствующие условию (в примере это условиеselect(.metadata.annotations."lcm.mirantis.com/cluster-secret-type"=="kubeconfig")
) .metadata.name
- вывести имя (но тут можно и содержимое или другое поле по желанию)
Nodes
Метки
kubectl get nodes --show-labels
Top usage
kubectl top nodes
Фильтрация вывода - все кроме
kubectl get node --selector='!node-role.kubernetes.io/master'
Без хедеров
kubectl get node --no-headers -o custom-columns=NAME:.metadata.name
Сортировка
kubectl get node --sort-by .metadata.creationTimestamp
Получение определенных полей с переименованием по аналогии с SELECT AS ..
kubectl get no -o json | jq -r '[.items[] | {name:.metadata.name, id:.spec.externalID, unschedulable:.spec.unschedulable}]'
[ ... { "name": "storage-3", "id": null, "unschedulable": null } ]
Простой просмотр утилизации
Это конечно хорошо бы улучшить
kubectl describe node | grep -A5 "Allocated"
Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 1020m (8%) 4100m (34%) memory 1178Mi (0%) 3444Mi (2%)
Pods
Список контейнеров в поде
Для каждого контейнера pod-name, container-image container-name
kubectl childctl get pods -n osh-system --selector=app.kubernetes.io/instance=openstack-operator -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\t"}{.name}{"\n"}{end}{end}'
Пример вывода:
openstack-controller-7896bc6d4d-l5mrz 127.0.0.1:44301/openstack/openstack-controller:0.14.18 osdpl 127.0.0.1:44301/openstack/openstack-controller:0.14.18 secrets 127.0.0.1:44301/openstack/openstack-controller:0.14.18 health 127.0.0.1:44301/openstack/openstack-controller:0.14.18 node 127.0.0.1:44301/openstack/openstack-controller:0.14.18 nodemaintenancerequest 127.0.0.1:44301/openstack/openstack-controller:0.14.18 ceph-secrets 127.0.0.1:44301/openstack/openstack-controller:0.14.18 osdplstatus 127.0.0.1:44301/openstack/openstack-controller:0.14.18 osdplsecret 127.0.0.1:44301/openstack/openstack-controller:0.14.18 tf-secrets openstack-controller-admission-5d78bf4d84-jmghf 127.0.0.1:44301/openstack/openstack-controller:0.14.18 openstack-operator openstack-controller-exporter-9f775b56f-gnntj 127.0.0.1:44301/openstack/openstack-controller:0.14.18 exporter
Get containers by Pod-Label (Return the container Image) kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=prometheus
Pod count per node kubectl get po --all-namespaces -o json | jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'
Get Running pods only kubectl get pods --all-namespaces --field-selector=status.phase=Running
Get !Running pods kubectl get pods --all-namespaces --field-selector='status.phase!=Running
Get all pods in All-namespaces, return mem and cpu (FOR EACH POD!)
kubectl get po -n elasticsearch --selector=service=elasticsearch-data -o=jsonpath="{range .items[*]}{.metadata.namespace}:{.metadata.name}{'\n'}{range .spec.containers[*]} {.resources.requests.cpu}{'\t'}{end}{'\n'}{end}" Describe a POD and list its IP kubectl describe pod 'kube-dns-2948363707' -n kube-system | grep IP | sed -E 's/IP:space:+//'
Get the external IPs of PODs kubectl get nodes --all-namespaces -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
Show the images and their versions for each pod kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s 'space:' '\n' | sort | uniq -c kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" kubectl get pods -n default --field-selector=status.phase=Running --selector=app=my-service -o jsonpath="{..image}" | tr -s 'space:' '\n' | sort | uniq -c
Delete terminated/evicted pods kubectl get po --selector=app=devops-logstash-service --field-selector=status.phase=Failed --no-headers -n elasticsearch | awk '{ print $1 }' | xargs -I {} kubectl delete po -n elasticsearch {}
Deployments
Get deployments, output as JSON, format output with JQ kubectl get deployment --namespace=kube-system -o=json | jq '.items[].metadata.labels'
Get K8S Deployments matching the selector (look for key k8s-app with value heapster) kubectl get deployment --all-namespaces --selector=k8s-app=heapster kubectl get svc --namespace=kube-system --selector=name=tiller
Scale a deployment kubectl scale -n kube-system --replicas=0 'deployments/kube-dns' kubectl scale -n kube-system --replicas=2 'deployments/kube-dns'
Export the YAML file of a deployment (for reuse, modification, etc,.) kubectl get deployments ghost --export -n ghost -o yaml > ghost.yaml
Replicasets
Get all replicasets sorted by the number of replicas kubectl get rs -n elasticsearch --sort-by='.spec.replicas'
Get all replicasets where replicas==0 in a specific namespace kubectl get rs -n elasticsearch -o json | jq -r '.items[] |select(.status.replicas==0) | .metadata.name'
Delete all replicasets that equal 0 in a specific namespace kubectl get rs -n elasticsearch -o json | jq -r '.items[] |select(.status.replicas==0) | .metadata.name' | xargs -I {} kubectl delete rs {}
Services
Get the self-link for a service using JSONPATH to format the output kubectl get svc heapster --namespace=kube-system -o=jsonpath={.metadata.selfLink}
Get 'service' external LB address kubectl get svc --namespace=kube-system -o=json | jq -r '.items[] | .status.loadBalancer.ingress[0]'
List all services in cluster and their nodePorts: kubectl get --all-namespaces svc -o json | jq -r '.items[] | [.metadata.name,([.spec.ports[].nodePort | tostring ] | join("|"))] | @csv'
Get Token for a service account & then get the secret
DEFAULT_TOKEN=$(kubectl --namespace=kube-system get serviceaccount default -o jsonpath="{.secrets[0].name}") TOKEN_VALUE=$(kubectl --namespace=kube-system get secret "$DEFAULT_TOKEN" -o go-template="Шаблон:.data.token" | base64 -d)
- Use it in a curl request to the api-server
curl -k -H "Authorization: Bearer $TOKEN_VALUE" https://10.0.1.212:6443/version curl -k -H "Authorization: Bearer $TOKEN_VALUE" https://localhost:6443/version Ingress
List all ingresses hosts and paths: kubectl get --all-namespaces ing -o='custom-columns=NAME:.metadata.name,HOSTS:.spec.rules[*].host,PATHS:.spec.rules[*].http.paths[*].path' Persistent Volumes
List persistent volume claims in the elasticsearch namespace and for each print name & capacity kubectl get persistentvolumeclaims -n elasticsearch -o=jsonpath="{range .items[*]}{..name}{'\t'}{..capacity}{'\n'}{end}"